summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2019-06-17 19:17:13 -0700
committerKaz Kylheku <kaz@kylheku.com>2019-06-17 19:17:13 -0700
commit0163732bfa72363ac2184722f253f377df0023f6 (patch)
treed9bd5b6826c27e49cec2b30370d2c449ee941083
parent86cb7e4aaf1ed9d0888d445167ab4e894583a4c0 (diff)
downloadtxr-0163732bfa72363ac2184722f253f377df0023f6.tar.gz
txr-0163732bfa72363ac2184722f253f377df0023f6.tar.bz2
txr-0163732bfa72363ac2184722f253f377df0023f6.zip
defset: gensyms needed for hygiene.
* share/txr/stdlib/defset.tl (defset-expander): In a scope where we are binding the user-supplied params, we cannot be binding variables like gpf-pairs that don't have anonymized names. All these locals must be gensymed, otherwise they are visible to the store form.
-rw-r--r--share/txr/stdlib/defset.tl43
1 files changed, 22 insertions, 21 deletions
diff --git a/share/txr/stdlib/defset.tl b/share/txr/stdlib/defset.tl
index f9e77fa7..f665814b 100644
--- a/share/txr/stdlib/defset.tl
+++ b/share/txr/stdlib/defset.tl
@@ -64,35 +64,36 @@
(restpar (if (symbol-package fp.rest) fp.rest))
(extsyms [keep-if symbol-package
(diff total-syms (cons restpar fixpars))]))
- (with-gensyms (getter setter args)
+ (with-gensyms (getter setter args gpf-pairs gpr-pairs ext-pairs
+ pgens rgens egens all-pairs agens)
^(defplace (,name . ,args) body
(,getter ,setter
(tree-bind (,*params) ,args
- (let* ((gpf-pairs (mapcar (op list (gensym)) (list ,*fixpars)))
- (gpr-pairs (if ',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])
- (egens [mapcar car ext-pairs])
- (all-pairs (append gpf-pairs gpr-pairs ext-pairs))
- (agens (collect-each ((a ,args))
- (let ((p [pos a all-pairs eq cadr]))
+ (let* ((,gpf-pairs (mapcar (op list (gensym)) (list ,*fixpars)))
+ (,gpr-pairs (if ',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])
+ (,egens [mapcar car ,ext-pairs])
+ (,all-pairs (append ,gpf-pairs ,gpr-pairs ,ext-pairs))
+ (,agens (collect-each ((a ,args))
+ (let ((p [pos a ,all-pairs eq cadr]))
(if p
- (car (del [all-pairs p]))
+ (car (del [,all-pairs p]))
a)))))
- ^(alet (,*gpf-pairs ,*gpr-pairs ,*ext-pairs)
+ ^(alet (,*,gpf-pairs ,*,gpr-pairs ,*,ext-pairs)
,(expand ^(symacrolet (,*(zip ',fixpars
- (mapcar (ret ^',@1) pgens))
+ (mapcar (ret ^',@1) ,pgens))
,*(zip ',extsyms
- (mapcar (ret ^',@1) egens))
- ,*(if gpr-pairs
+ (mapcar (ret ^',@1) ,egens))
+ ,*(if ,gpr-pairs
(if (consp ,restpar)
- ^((,',restpar ',rgens))
- ^((,',restpar ',(car rgens))))))
- (macrolet ((,,getter () ^(,',',name ,',*agens))
+ ^((,',restpar ',,rgens))
+ ^((,',restpar ',(car ,rgens))))))
+ (macrolet ((,,getter () ^(,',',name ,',*,agens))
(,,setter (,',newval) ,',setform))
,body))
,env)))))))))