From e121e2a143925a2ca79e974f131ec2da762a52dc Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Sun, 22 Jan 2017 10:19:13 -0800 Subject: Don't expand arg in @{var :filter arg}. * eval.c (expand_var_mods): New static function. (expand_quasi): Use expand_var_mods to expand variable modifies, rather than expand_forms. The new expand_var_mods avoids expanding the argument of the :filter keyword. --- eval.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) (limited to 'eval.c') diff --git a/eval.c b/eval.c index db5ac987..34a1ef8c 100644 --- a/eval.c +++ b/eval.c @@ -3137,6 +3137,32 @@ static val expand_fbind_vars(val vars, val menv, val form) } } +static val expand_var_mods(val mods, val menv) +{ + if (atom(mods)) + return mods; + + { + val mod = car(mods); + val modr = cdr(mods); + + if (mod == filter_k && consp(modr)) { + val modrr = cdr(modr); + val modrr_ex = expand_var_mods(modrr, menv); + if (modrr_ex == modrr) + return mods; + + return rlcp(cons(mod, cons(car(modr), modrr_ex)), mods); + } else { + val mod_ex = expand(mod, menv); + val modr_ex = expand_var_mods(modr, menv); + if (mod_ex == mod && modr_ex == modr) + return mods; + return rlcp(cons(mod_ex, modr_ex), mods); + } + } +} + static val expand_quasi(val quasi_forms, val menv) { if (nilp(quasi_forms)) { @@ -3152,7 +3178,7 @@ static val expand_quasi(val quasi_forms, val menv) val param = second(form); val mods = third(form); val param_ex = expand(param, menv); - val mods_ex = expand_forms(mods, menv); + val mods_ex = expand_var_mods(mods, menv); if (param_ex != param || mods_ex != mods) form_ex = rlcp(list(sym, param_ex, mods_ex, nao), form); -- cgit v1.2.3