diff options
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 24 |
1 files changed, 19 insertions, 5 deletions
@@ -287,14 +287,27 @@ val ctx_form(val obj) val ctx_name(val obj) { if (consp(obj)) { - if (car(obj) == lambda_s) - return list(lambda_s, second(obj), nao); - else - return car(obj); + val a = car(obj); + val d = cdr(obj); + val ad = nil; + + if (a == lambda_s) { + return list(lambda_s, car(d), nao); + } else if (consp(d) && (bindable((ad = car(d))) || keywordp(ad))) { + val dd = cdr(d); + val add = car(dd); + if (bindable(add)) + return cons(a, cons(ad, cons(add, nil))); + else + return cons(a, cons(ad, nil)); + } else { + return a; + } } if (interp_fun_p(obj)) return func_get_name(obj, obj->f.env); + return nil; } @@ -2452,8 +2465,9 @@ static val expand_macrolet(val form, val menv) val macro = car(macs); val name = pop(¯o); val params = pop(¯o); + val orig = rlcp(cons(op, cons(name, nil)), form); cons_bind (params_ex, macro_ex, - expand_params(params, macro, menv, t, form)); + expand_params(params, macro, menv, t, set_origin(form, orig))); val new_menv = make_var_shadowing_env(menv, get_param_syms(params_ex)); val macro_out = expand_forms(macro_ex, new_menv); val block = rlcp_tree(cons(block_s, cons(name, macro_out)), macro_ex); |