diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2014-01-30 16:54:07 -0800 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2014-01-30 16:54:07 -0800 |
commit | 78f186f057733ac5c7ac2b524a31960f77935958 (patch) | |
tree | 5a1515746d3100728a90e961651ad662f0164b9a /eval.c | |
parent | 266f327291c92c3e26bfb2b9dccaa9136e7604b4 (diff) | |
download | txr-78f186f057733ac5c7ac2b524a31960f77935958.tar.gz txr-78f186f057733ac5c7ac2b524a31960f77935958.tar.bz2 txr-78f186f057733ac5c7ac2b524a31960f77935958.zip |
* eval.c (expand_op): When the variant is do, and the symbol
is an operator, then suppress the addition of the rest
parameter in the dotted cons position at the end of the form,
since this mechanism for applying additional arguments is only
supported by function calls, not by special forms.
* lib.h (and2, and3): New macros.
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 5 |
1 files changed, 3 insertions, 2 deletions
@@ -1656,6 +1656,8 @@ static val expand_op(val sym, val body) val max = if3(nums, maxv(car(nums), cdr(nums)), zero); val min = if3(nums, minv(car(nums), cdr(nums)), zero); val has_rest = cons_find(rest_gensym, body_trans, eq_f); + val is_op = and3(sym == do_s, consp(body_trans), + gethash(op_table, car(body_trans))); if (!eql(max, length(nums)) && !zerop(min)) ssyms = supplement_op_syms(ssyms, max); @@ -1665,8 +1667,7 @@ static val expand_op(val sym, val body) { uses_or2; val dwim_body = rlcp(cons(dwim_s, - if3(or3(has_rest, - ssyms, + if3(or4(is_op, has_rest, ssyms, nullp(proper_listp(body_trans))), body_trans, append2(body_trans, rest_gensym))), |