summaryrefslogtreecommitdiffstats
path: root/stdlib/compiler.tl
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2023-05-16 06:34:31 -0700
committerKaz Kylheku <kaz@kylheku.com>2023-05-16 06:34:31 -0700
commitc990d37be74f452d1a8bcb2b0b1dc133704c0a93 (patch)
treebef4d7e94d53353d5e8fa17b3946874c16d1f7fd /stdlib/compiler.tl
parentc606261b92348ef7b0f934705ee46ee4ccf28bab (diff)
downloadtxr-c990d37be74f452d1a8bcb2b0b1dc133704c0a93.tar.gz
txr-c990d37be74f452d1a8bcb2b0b1dc133704c0a93.tar.bz2
txr-c990d37be74f452d1a8bcb2b0b1dc133704c0a93.zip
New special operator: compiler-let
* eval.c (compiler_let_s): New symbol variable. (op_let): Recognize compiler-let for sequential binding. (do_expand): Traverse and diagnose compiler-let form. (eval_init): Initialize compiler_let_s and register the interpreted version of the operator. * stdlib/compiler.tl (compiler compile): Handle compiler-let form. (compiler comp-compiler-let): New method. (no-dvbind-eval): New function. * autoload.c (compiler-set-entries): Intern the compiler-let symbol in the user package. * txr.1: Documented. * stdlib/doc-syms.tl: Updated.
Diffstat (limited to 'stdlib/compiler.tl')
-rw-r--r--stdlib/compiler.tl10
1 files changed, 10 insertions, 0 deletions
diff --git a/stdlib/compiler.tl b/stdlib/compiler.tl
index cc4eef7b..504d3ea8 100644
--- a/stdlib/compiler.tl
+++ b/stdlib/compiler.tl
@@ -564,6 +564,7 @@
((+ *) me.(comp-arith-form oreg env form))
((- /) me.(comp-arith-neg-form oreg env form))
(typep me.(comp-typep oreg env form))
+ (compiler-let me.(comp-compiler-let oreg env form))
(t me.(comp-fun-form oreg env form))))
((and (consp sym)
(eq (car sym) 'lambda)) me.(compile oreg env ^(call ,*form)))
@@ -1390,6 +1391,12 @@
(@nil
me.(comp-fun-form oreg env form))))
+(defmeth compiler comp-compiler-let (me oreg env form)
+ (tree-bind (t bindings . body) form
+ (progv [mapcar car bindings]
+ [mapcar [chain cadr no-dvbind-eval] bindings]
+ me.(comp-progn oreg env body))))
+
(defmeth compiler comp-fun-form (me oreg env form)
(let* ((olev *opt-level*)
(sym (car form))
@@ -2306,6 +2313,9 @@
(member (symbol-package sym)
(load-time (list user-package system-package))))
+(defun no-dvbind-eval (form)
+ (eval (if-match (sys:dvbind @nil @exp) form exp form)))
+
(defun usr:compile-toplevel (exp : (expanded-p nil))
(let ((co (new compiler))
(as (new assembler))