From e121e2a143925a2ca79e974f131ec2da762a52dc Mon Sep 17 00:00:00 2001
From: Kaz Kylheku <kaz@kylheku.com>
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(-)

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