diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2017-01-22 10:19:13 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2017-01-22 10:19:13 -0800 |
commit | e121e2a143925a2ca79e974f131ec2da762a52dc (patch) | |
tree | ca805a224639a4a7cd816b0e63cb1369325a6777 /eval.c | |
parent | 7c010ed8ec8d733f5c6764c32691a33da51240bc (diff) | |
download | txr-e121e2a143925a2ca79e974f131ec2da762a52dc.tar.gz txr-e121e2a143925a2ca79e974f131ec2da762a52dc.tar.bz2 txr-e121e2a143925a2ca79e974f131ec2da762a52dc.zip |
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.
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 28 |
1 files changed, 27 insertions, 1 deletions
@@ -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); |