summaryrefslogtreecommitdiffstats
path: root/eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c24
1 files changed, 19 insertions, 5 deletions
diff --git a/eval.c b/eval.c
index a566cea8..75a3ffce 100644
--- a/eval.c
+++ b/eval.c
@@ -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(&macro);
val params = pop(&macro);
+ 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);