diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2019-08-28 06:51:30 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2019-08-28 06:51:30 -0700 |
commit | b4360fddf3f7368d618b3a706397c2b437ba074f (patch) | |
tree | e8ee71affa5ed4103125d12ba7a2f3cadfbc6d63 /share | |
parent | 565ef4bbe9e5c69cc482b93d484f2c587e76887d (diff) | |
download | txr-b4360fddf3f7368d618b3a706397c2b437ba074f.tar.gz txr-b4360fddf3f7368d618b3a706397c2b437ba074f.tar.bz2 txr-b4360fddf3f7368d618b3a706397c2b437ba074f.zip |
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.
Diffstat (limited to 'share')
-rw-r--r-- | share/txr/stdlib/compiler.tl | 16 |
1 files changed, 7 insertions, 9 deletions
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 |