summaryrefslogtreecommitdiffstats
path: root/share
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2019-03-08 08:25:42 -0800
committerKaz Kylheku <kaz@kylheku.com>2019-03-08 08:25:42 -0800
commitfe533f82ee26d0bf98468f25b263e8f8461f309e (patch)
tree2a571b675dd49453aac1cc0c57c6ffa274c6ecee /share
parentc0d469720866b2b6139fa9af862f0c7316117e37 (diff)
downloadtxr-fe533f82ee26d0bf98468f25b263e8f8461f309e.tar.gz
txr-fe533f82ee26d0bf98468f25b263e8f8461f309e.tar.bz2
txr-fe533f82ee26d0bf98468f25b263e8f8461f309e.zip
defset: support improper list places.
* share/txr/stdlib/defset.tl (defset-expander): Check for restpar being an atom and handle differently. We still don't handle the case where (b . c) is matched against a rest parameter; in this case the mapcar will process an improper list. I.e. the improper form must have an atom which matches the position of the rest parameter. * txr.1: Updated.
Diffstat (limited to 'share')
-rw-r--r--share/txr/stdlib/defset.tl11
1 files changed, 7 insertions, 4 deletions
diff --git a/share/txr/stdlib/defset.tl b/share/txr/stdlib/defset.tl
index 3fd8de2e..521260ba 100644
--- a/share/txr/stdlib/defset.tl
+++ b/share/txr/stdlib/defset.tl
@@ -67,10 +67,11 @@
(with-gensyms (getter setter)
^(defplace (,name ,*params) body
(,getter ,setter
- (let* ((gpf-pairs (append (mapcar (op list (gensym))
- (list ,*fixpars))))
+ (let* ((gpf-pairs (mapcar (op list (gensym)) (list ,*fixpars)))
(gpr-pairs (if ',restpar
- (mapcar (op list (gensym)) ,restpar)))
+ (if (consp ,restpar)
+ (mapcar (op list (gensym)) ,restpar)
+ (list (list (gensym) ,restpar)))))
(ext-pairs (mapcar (op list (gensym)) (list ,*extsyms)))
(pgens [mapcar car gpf-pairs])
(rgens [mapcar car gpr-pairs])
@@ -81,7 +82,9 @@
,*(zip ',extsyms
(mapcar (ret ^',@1) egens))
,*(if gpr-pairs
- ^((,',restpar ',rgens))))
+ (if (consp ,restpar)
+ ^((,',restpar ',rgens))
+ ^((,',restpar ',(car rgens))))))
(macrolet ((,,getter () ,',getform)
(,,setter (,',newval) ,',setform))
,body))