From b4360fddf3f7368d618b3a706397c2b437ba074f Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Wed, 28 Aug 2019 06:51:30 -0700 Subject: compiler: bugfix: colon keyword bungle in macro params. When the (set arg :) form is processed by a compiled version of the set operator, it blows up with "set: arguments must be pairs". This is because the compiled destructuring code is wrongly trying to apply special treatment to a colon symbol argument to an optional parameter. It is documented that such such treatment only happens in function calls, and not in the binding of macro parameter lists. Interpreted macro param binding gets it right. * share/txr/stdlib/compiler.tl (expand-bind-mac-params): Do not treat a : element in the structure as a missing optional argument, but as an ordinary value. --- share/txr/stdlib/compiler.tl | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) (limited to 'share') diff --git a/share/txr/stdlib/compiler.tl b/share/txr/stdlib/compiler.tl index 280fe753..a4c985e8 100644 --- a/share/txr/stdlib/compiler.tl +++ b/share/txr/stdlib/compiler.tl @@ -1419,10 +1419,9 @@ ^((set ,curs (or (car ,obj-var) (sys:upenv ,init-form))) (cond - ((and ,obj-var - (prog1 - (neq (set ,curs (car ,obj-var)) :) - (set ,obj-var (cdr ,obj-var)))) + (,obj-var + (set ,curs (car ,obj-var)) + (set ,obj-var (cdr ,obj-var)) ,*(if pres-p ^((set ,pres-p t)))) (t @@ -1434,11 +1433,10 @@ (when pres-p (push pres-p vars)) ^((cond - ((and ,obj-var - (prog1 - (neq (set ,p (car ,obj-var)) :) - (set ,obj-var (cdr ,obj-var)))) - ,*(if pres-p + (,obj-var + (set ,p (car ,obj-var)) + (set ,obj-var (cdr ,obj-var)) + ,*(if pres-p ^((set ,pres-p t)))) (t ,*(if init-form -- cgit v1.2.3