summaryrefslogtreecommitdiffstats
path: root/share
diff options
context:
space:
mode:
Diffstat (limited to 'share')
-rw-r--r--share/txr/stdlib/place.tl19
1 files changed, 15 insertions, 4 deletions
diff --git a/share/txr/stdlib/place.tl b/share/txr/stdlib/place.tl
index 9cae3974..7bb059a8 100644
--- a/share/txr/stdlib/place.tl
+++ b/share/txr/stdlib/place.tl
@@ -570,14 +570,25 @@
(call-update-expander pl-getter pl-setter place env
^(macrolet ((,tmp-place () ^(,',pl-getter)))
,(sys:expand
- ^(symacrolet ((,sym (,tmp-place))) ,*body)
+ ^(symacrolet ((,sym (,tmp-place)))
+ ,*body)
env))))
(remhash *place-update-expander* tmp-place))))
-(defmacro placelet (sym-place-pairs . body)
+(defmacro placelet* (sym-place-pairs . body)
(tree-case sym-place-pairs
(() ^(progn ,*body))
(((sym place)) ^(sys:placelet-1 ((,sym ,place)) ,*body))
(((sym place) . rest-pairs) ^(sys:placelet-1 ((,sym ,place))
- (placelet (,*rest-pairs) ,*body)))
- (obj (throwf 'eval-error "placelet: bad syntax: ~s" obj))))
+ (placelet* (,*rest-pairs) ,*body)))
+ (obj (throwf 'eval-error "placelet*: bad syntax: ~s" obj))))
+
+(defmacro placelet (sym-place-pairs . body)
+ (unless (all sym-place-pairs
+ [andf consp (opip length (= 2)) (oand first bindable)])
+ (throwf 'eval-error "placelet: bad syntax: ~s" sym-place-pairs))
+ (tree-bind (: syms places) (transpose sym-place-pairs)
+ (let ((temps (mapcar (ret (gensym)) syms)))
+ ^(placelet* (,*(zip temps places))
+ (symacrolet (,*(zip syms temps))
+ ,*body)))))