From 1cafc3e511b19f22ad6eb8c49c3f4cd7f87ece6a Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Thu, 7 Apr 2016 23:25:13 -0700 Subject: 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. --- eval.c | 6 +++++- txr.1 | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/eval.c b/eval.c index 28a7a921..0133caea 100644 --- a/eval.c +++ b/eval.c @@ -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); diff --git a/txr.1 b/txr.1 index b030b9b7..62ffe92c 100644 --- a/txr.1 +++ b/txr.1 @@ -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 -- cgit v1.2.3