summaryrefslogtreecommitdiffstats
path: root/match.c
diff options
context:
space:
mode:
Diffstat (limited to 'match.c')
-rw-r--r--match.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/match.c b/match.c
index 9b2a6900..ae37a56d 100644
--- a/match.c
+++ b/match.c
@@ -1449,19 +1449,29 @@ static val do_txeval(val spec, val form, val bindings, val allow_unbound)
ret = cdr(binding);
}
} else if (consp(form)) {
- if (first(form) == quasi_s) {
+ val sym = first(form);
+ if (sym == quasi_s) {
uw_env_begin;
uw_set_match_context(cons(spec, bindings));
ret = cat_str(subst_vars(rest(form), bindings, nil), nil);
uw_env_end;
- } else if (regexp(car(form))) {
+ } else if (sym == quasilist_s) {
+ uw_env_begin;
+ val iter;
+ list_collect_decl (out, tail);
+ uw_set_match_context(cons(spec, bindings));
+ for (iter = rest(form); iter != nil; iter = cdr(iter))
+ list_collect(tail, subst_vars(cdr(car(iter)), bindings, nil));
+ ret = out;
+ uw_env_end;
+ } else if (regexp(sym)) {
ret = form;
- } else if (first(form) == var_s) {
+ } else if (sym == var_s) {
uw_env_begin;
uw_set_match_context(cons(spec, bindings));
ret = eval(second(form), make_env(bindings, nil, nil), form);
uw_env_end;
- } else if (first(form) == expr_s) {
+ } else if (sym == expr_s) {
uw_env_begin;
uw_set_match_context(cons(spec, bindings));
ret = eval(rest(form), make_env(bindings, nil, nil), form);