Fix some bugs with the reader
This commit is contained in:
17
src/lisp.c
17
src/lisp.c
@ -887,6 +887,7 @@ DEF_STATIC_SYMBOL(finally, ":finally");
|
||||
DEF_STATIC_SYMBOL(shutdown_signal, "shutdown-signal");
|
||||
DEF_STATIC_SYMBOL(type_error, "type-error");
|
||||
DEF_STATIC_SYMBOL(read_error, "read-error");
|
||||
DEF_STATIC_SYMBOL(unclosed_error, "read-error");
|
||||
DEF_STATIC_SYMBOL(eof_error, "eof-error");
|
||||
DEF_STATIC_SYMBOL(void_variable_error, "void-variable-error");
|
||||
DEF_STATIC_SYMBOL(void_function_error, "void-function-error");
|
||||
@ -1052,6 +1053,7 @@ void lisp_init(void) {
|
||||
REGISTER_SYMBOL(type_error);
|
||||
REGISTER_SYMBOL(read_error);
|
||||
REGISTER_SYMBOL(eof_error);
|
||||
REGISTER_SYMBOL(unclosed_error);
|
||||
REGISTER_SYMBOL(void_variable_error);
|
||||
REGISTER_SYMBOL(void_function_error);
|
||||
REGISTER_SYMBOL(circular_error);
|
||||
@ -1623,9 +1625,20 @@ DEFUN(eval_in_env, "eval-in-env", (LispVal * form, LispVal *lexenv)) {
|
||||
case TYPE_VECTOR: {
|
||||
LispVector *vec = (LispVector *) form;
|
||||
LispVal **elts = lisp_malloc(sizeof(LispVal *) * vec->length);
|
||||
for (size_t i = 0; i < vec->length; ++i) {
|
||||
elts[i] = Feval_in_env(vec->data[i], lexenv);
|
||||
if (elts) { // in case length is 0
|
||||
memset(elts, 0, sizeof(LispVal *) * vec->length);
|
||||
}
|
||||
WITH_PUSH_FRAME(Qnil, Qnil, true, {
|
||||
struct UnrefListData uld;
|
||||
uld.vals = elts;
|
||||
uld.len = vec->length;
|
||||
void *cl_handler =
|
||||
register_cleanup(&unref_free_list_double_ptr, &uld);
|
||||
for (size_t i = 0; i < vec->length; ++i) {
|
||||
elts[i] = Feval_in_env(vec->data[i], lexenv);
|
||||
}
|
||||
cancel_cleanup(cl_handler);
|
||||
});
|
||||
// does not ref its arguments
|
||||
return make_lisp_vector(elts, vec->length);
|
||||
}
|
||||
|
Reference in New Issue
Block a user