summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2018-03-24 22:19:33 -0700
committerKaz Kylheku <kaz@kylheku.com>2018-03-24 22:19:33 -0700
commitb88d20ca237d734c0ff4cbf4a612b4bca63ed78c (patch)
tree2fc19dc338a837cf835ffe50bb20837f127f32c3
parent23a7e6356156fe16686b7f5e372e9379776645f8 (diff)
downloadtxr-b88d20ca237d734c0ff4cbf4a612b4bca63ed78c.tar.gz
txr-b88d20ca237d734c0ff4cbf4a612b4bca63ed78c.tar.bz2
txr-b88d20ca237d734c0ff4cbf4a612b4bca63ed78c.zip
compiler: implement sys:setqf special op.
* share/txr/stdlib/compiler.tl (compiler compile): Handle sys:setqf via comp-setqf. (compiler comp-setqf): New method.
-rw-r--r--share/txr/stdlib/compiler.tl17
1 files changed, 17 insertions, 0 deletions
diff --git a/share/txr/stdlib/compiler.tl b/share/txr/stdlib/compiler.tl
index 406253a5..71c0df4d 100644
--- a/share/txr/stdlib/compiler.tl
+++ b/share/txr/stdlib/compiler.tl
@@ -171,6 +171,7 @@
(quote me.(comp-atom oreg (cadr form)))
(sys:setq me.(comp-setq oreg env form))
(sys:lisp1-setq me.(comp-lisp1-setq oreg env form))
+ (sys:setqf me.(comp-setqf oreg env form))
(cond me.(comp-cond oreg env form))
(if me.(comp-if oreg env form))
(unwind-protect me.(comp-unwind-protect oreg env form))
@@ -256,6 +257,22 @@
vfrag.ffuns))))
(t me.(compile oreg env ^(sys:setq ,sym ,val)))))))
+(defmeth compiler comp-setqf (me oreg env form)
+ (mac-param-bind form (op sym val) form
+ (if env.(lookup-fun sym)
+ (compile-error form "assignment to lexical function binding")
+ (let ((vfrag me.(compile oreg env val))
+ (fname me.(get-dreg sym))
+ (rplcd me.(get-fidx 'usr:rplacd))
+ (treg me.(alloc-treg)))
+ me.(free-treg treg)
+ (new (frag vfrag.oreg
+ ^(,*vfrag.code
+ (getfb ,treg ,fname)
+ (gcall ,treg ,rplcd ,treg ,vfrag.oreg))
+ (uni (list sym) vfrag.fvars)
+ vfrag.ffuns))))))
+
(defmeth compiler comp-cond (me oreg env form)
(let* ((lout (gensym "l"))
(raw-cases (rest form))