summaryrefslogtreecommitdiffstats
path: root/parser.y
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2017-01-21 21:13:33 -0800
committerKaz Kylheku <kaz@kylheku.com>2017-01-21 21:13:33 -0800
commitb64bcbb6e7bd7f331f660518e97e2bfa898ae340 (patch)
tree8b80eb794c7f4777346947fccea8b0faafeb4185 /parser.y
parent9cac065f8374ed008bf8274909b3f431dd9e8da6 (diff)
downloadtxr-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.y7
1 files changed, 2 insertions, 5 deletions
diff --git a/parser.y b/parser.y
index 40e36f47..e1392878 100644
--- a/parser.y
+++ b/parser.y
@@ -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;