diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2016-04-07 23:25:13 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2016-04-07 23:25:13 -0700 |
commit | 1cafc3e511b19f22ad6eb8c49c3f4cd7f87ece6a (patch) | |
tree | 662c337ba2bcfa647e95cb50f75623d5d2dea838 | |
parent | 8fbc54a73f476c46b8d0d08c6cc700a7ca6a39c1 (diff) | |
download | txr-1cafc3e511b19f22ad6eb8c49c3f4cd7f87ece6a.tar.gz txr-1cafc3e511b19f22ad6eb8c49c3f4cd7f87ece6a.tar.bz2 txr-1cafc3e511b19f22ad6eb8c49c3f4cd7f87ece6a.zip |
Allow symbol macro in function call dot position.
* eval.c (expand_forms): If the forms list is an atom, then
don't just return it. Try to expand it as a macro.
If the macro produces a compound form, diagnose with
an exception, otherwise return the expansion.
* txr.1: Document the treatment of symbol macros in
function call dot position.
-rw-r--r-- | eval.c | 6 | ||||
-rw-r--r-- | txr.1 | 14 |
2 files changed, 19 insertions, 1 deletions
@@ -2459,7 +2459,11 @@ static val me_quasilist(val form, val menv) val expand_forms(val form, val menv) { if (atom(form)) { - return form; + val ex_f = expand(form, menv); + if (consp(ex_f)) + uw_throwf(error_s, lit("symbol macro ~s in dot position must produce " + "atom form, not compound"), form, nao); + return ex_f; } else { val f = car(form); val r = cdr(form); @@ -10079,6 +10079,20 @@ Examples: (call (op list 1 . @1) 2) ;; yields 2 .cble +A special consideration is given to symbol macros which occur in the +dot position. If a symbol macro occurs in this position, then it must not +expand to a compound form, otherwise a macro-expansion-time error results. +If it expands to an atom, then it is substituted by that atom, and +the semantics of the function call proceeds as described above. + +.cblk + (symacrolet ((x (list 1 2))) + (list 1 . x)) ;; error: x expands to form (list 1 2) + + (symacrolet ((x 2)) + (list 1 . x)) ;; yields (1 . 2) +.cble + Dialect Note: In some other Lisp dialects like ANSI Common Lisp, the improper list syntax may |