diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2017-01-21 21:13:33 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2017-01-21 21:13:33 -0800 |
commit | b64bcbb6e7bd7f331f660518e97e2bfa898ae340 (patch) | |
tree | 8b80eb794c7f4777346947fccea8b0faafeb4185 /parser.y | |
parent | 9cac065f8374ed008bf8274909b3f431dd9e8da6 (diff) | |
download | txr-b64bcbb6e7bd7f331f660518e97e2bfa898ae340.tar.gz txr-b64bcbb6e7bd7f331f660518e97e2bfa898ae340.tar.bz2 txr-b64bcbb6e7bd7f331f660518e97e2bfa898ae340.zip |
bugfix: expand macros in a number of directives.
This is the last round of changes on this topic, bringing
proper macro expansion to the arguments to @(skip),
@(fuzz), @(next), @(call), @(cat), @(load) and @(close).
* match.c (match_expand_keyword_args): Only process the
keyword arguments if they are followed by an argument.
Process @(next) arguments here too: :list and :string
take a Lisp expression, but :tlist and :var take an
argument which is not a Lisp expression and must be
handled properly. Also, expand any non-keyword expression.
This handles the <source> argument of @(next).
(match_expand_elem): New function.
* match.h (match_expand_elem): Declared.
* parser.h (expand_meta): Declared.
* parser.y (expand_meta): Static function becomes external.
(elem): Expand elem other than require or do using
match_expand_elem. We don't fold require and do into this
because match_expand_elem has a backward compat switch
in it that doesn't apply to these.
Diffstat (limited to 'parser.y')
-rw-r--r-- | parser.y | 7 |
1 files changed, 2 insertions, 5 deletions
@@ -63,7 +63,6 @@ static val define_transform(parser_t *parser, val define_form); static val lit_char_helper(val litchars); static val optimize_text(val text_form); static val unquotes_occur(val quoted_form, int level); -static val expand_meta(val form, val menv); static val rlrec(parser_t *, val form, val line); static wchar_t char_from_name(const wchar_t *name); static val make_expr(parser_t *, val sym, val rest, val lineno); @@ -460,9 +459,7 @@ elem : texts { $$ = rlcp(cons(text_s, $1), $1); expand_forms(rest($1), nil)), $1); else - $$ = rlcp(cons(sym, - expand_meta(rest($1), nil)), - $1); } + $$ = match_expand_elem($1); } | COLL exprs_opt ')' elems_opt END { val args = match_expand_keyword_args($2); $$ = list(coll_s, $4, nil, args, nao); rl($$, num($1)); } @@ -1445,7 +1442,7 @@ static val unquotes_occur(val quoted_form, int level) } } -static val expand_meta(val form, val menv) +val expand_meta(val form, val menv) { val sym; |