summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2018-03-24 07:31:20 -0700
committerKaz Kylheku <kaz@kylheku.com>2018-03-24 07:31:20 -0700
commit1c0adab3cbadb8fe31d29297c64fd0f1cacaac04 (patch)
tree02eb787d02b1f0b2d4e1d080e31771053775a192
parent878c0dded993f02f19d4a46c365b5bd12e3d9030 (diff)
downloadtxr-1c0adab3cbadb8fe31d29297c64fd0f1cacaac04.tar.gz
txr-1c0adab3cbadb8fe31d29297c64fd0f1cacaac04.tar.bz2
txr-1c0adab3cbadb8fe31d29297c64fd0f1cacaac04.zip
compiler: implement mac-param-bind.
* share/txr/stdlib/compiler.tl (compiler compile): Wire in tree-bind case via comp-mac-param-bind method. (compiler comp-mac-param-bind): New method.
-rw-r--r--share/txr/stdlib/compiler.tl12
1 files changed, 12 insertions, 0 deletions
diff --git a/share/txr/stdlib/compiler.tl b/share/txr/stdlib/compiler.tl
index 00e758ea..f1e1401a 100644
--- a/share/txr/stdlib/compiler.tl
+++ b/share/txr/stdlib/compiler.tl
@@ -175,6 +175,7 @@
(sys:quasi me.(comp-quasi oreg env form))
(dohash me.(compile oreg env (expand-dohash form)))
(tree-bind me.(comp-tree-bind oreg env form))
+ (mac-param-bind me.(comp-mac-param-bind oreg env form))
(tree-case me.(comp-tree-case oreg env form))
(sys:upenv me.(compile oreg env.up (cadr form)))
(sys:dvbind me.(compile oreg env (caddr form)))
@@ -636,6 +637,17 @@
obj-var t nil body)))))
me.(compile oreg env expn)))))
+(defmeth compiler comp-mac-param-bind (me oreg env form)
+ (mac-param-bind form (op context params obj . body) form
+ (with-gensyms (obj-var form-var)
+ (let ((expn (expand ^(let* ((,obj-var ,obj)
+ (,form-var ,context))
+ ,(expand-bind-mac-params form-var
+ form-var
+ params nil
+ obj-var t nil body)))))
+ me.(compile oreg env expn)))))
+
(defmeth compiler comp-tree-case (me oreg env form)
(mac-param-bind form (op obj . cases) form
(let* ((ncases (len cases))