From 3dc63192610416b6f5765171bceff5bb1f36e701 Mon Sep 17 00:00:00 2001
From: Kaz Kylheku <kaz@kylheku.com>
Date: Sat, 22 Feb 2014 01:56:34 -0800
Subject: Preparation for lexical macros: we need to pass a macro environment
 down through the expander call hierarchy.

* eval.c (expand_opt_params, expand_params, expand_tree_cases,
expand_tree_case, expand_forms, val expand_cond_pairs, val
expand_place, expand_qquote, expand_vars, expand_quasi, expand_op,
expand_catch_clause, expand_catch, expand): All expanders get new
parameter, menv. expand_forms and expand handle a nil value of menv.
(eval_intrinsic): Pass nil macro environment to expand.
(eval_init): Update intrinsic registration for expand.

* eval.h (expand, expand_forms): Declarations updated.

* parser.y (expand_meta): Gets macro env parameter.
(elem, o_elem, exprs, expr): Pass nil to expand_forms and expand_meta.
---
 parser.y | 21 ++++++++++++---------
 1 file changed, 12 insertions(+), 9 deletions(-)

(limited to 'parser.y')

diff --git a/parser.y b/parser.y
index 1aec65d5..a2553f88 100644
--- a/parser.y
+++ b/parser.y
@@ -56,7 +56,7 @@ static val lit_char_helper(val litchars);
 static val optimize_text(val text_form);
 static val unquotes_occur(val quoted_form);
 static val choose_quote(val quoted_form);
-static val expand_meta(val form);
+static val expand_meta(val form, val menv);
 static wchar_t char_from_name(const wchar_t *name);
 
 static val parsed_spec;
@@ -345,11 +345,11 @@ elem : texts                    { $$ = rlcp(cons(text_s, $1), $1);
      | list                     { val sym = first($1);
                                   if (sym ==  do_s || sym == require_s)
                                     $$ = rlcp(cons(sym,
-                                                   expand_forms(rest($1))),
+                                                   expand_forms(rest($1), nil)),
                                               $1);
                                   else
                                     $$ = rlcp(cons(sym,
-                                                   expand_meta(rest($1))),
+                                                   expand_meta(rest($1), nil)),
                                               $1); }
      | COLL exprs_opt ')' elems END     { $$ = list(coll_s, $4, nil, $2, nao);
                                           rl($$, num($1)); }
@@ -582,7 +582,8 @@ o_elem : TEXT                   { $$ = string_own($1);
        | SPACE                  { $$ = string_own($1);
                                   rl($$, num(lineno)); }
        | o_var                  { $$ = $1; }
-       | list                   { $$ = rlcp(cons(expr_s, expand($1)), $1); }
+       | list                   { $$ = rlcp(cons(expr_s,
+                                                 expand($1, nil)), $1); }
        | rep_elem               { $$ = $1; }
        ;
 
@@ -715,10 +716,10 @@ list : '(' n_exprs ')'          { $$ = rl($2, num($1)); }
                                   yybadtoken(yychar, lit("meta expression")); }
      ;
 
-exprs : n_exprs                 { $$ = rlcp(expand_meta($1), $1); }
+exprs : n_exprs                 { $$ = rlcp(expand_meta($1, nil), $1); }
       ;
 
-expr : n_expr                   { $$ = rlcp(expand_meta($1), $1); }
+expr : n_expr                   { $$ = rlcp(expand_meta($1, nil), $1); }
      ;
 
 exprs_opt : exprs               { $$ = $1; }
@@ -1115,19 +1116,21 @@ static val choose_quote(val quoted_form)
   return unquotes_occur(quoted_form) ? qquote_s : quote_s;
 }
 
-static val expand_meta(val form)
+static val expand_meta(val form, val menv)
 {
   if (atom(form))
     return form;
 
+  menv = default_arg(menv, make_env(nil, nil, nil));
+
   if (car(form) == expr_s)
-    return cons(expr_s, expand(rest(form)));
+    return cons(expr_s, expand(rest(form), menv));
 
   {
     list_collect_decl (out, ptail);
 
     for (; consp(form); form = cdr(form)) 
-      ptail = list_collect(ptail, expand_meta(car(form)));
+      ptail = list_collect(ptail, expand_meta(car(form), menv));
 
     list_collect_nconc(ptail, form);
 
-- 
cgit v1.2.3