diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2023-05-16 06:34:31 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2023-05-16 06:34:31 -0700 |
commit | b4fbc45099b678583dc4e8b84a725adb5428a354 (patch) | |
tree | bef4d7e94d53353d5e8fa17b3946874c16d1f7fd /stdlib | |
parent | 0c268454ad7fd1b19fc1624534de1fc19725ac1d (diff) | |
download | txr-b4fbc45099b678583dc4e8b84a725adb5428a354.tar.gz txr-b4fbc45099b678583dc4e8b84a725adb5428a354.tar.bz2 txr-b4fbc45099b678583dc4e8b84a725adb5428a354.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')
-rw-r--r-- | stdlib/compiler.tl | 10 | ||||
-rw-r--r-- | stdlib/doc-syms.tl | 1 |
2 files changed, 11 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)) diff --git a/stdlib/doc-syms.tl b/stdlib/doc-syms.tl index 8dbadf88..6391695f 100644 --- a/stdlib/doc-syms.tl +++ b/stdlib/doc-syms.tl @@ -379,6 +379,7 @@ ("compile-toplevel" "N-00DE8B13") ("compile-update-file" "N-0211BE68") ("compile-warning" "N-032EA7D7") + ("compiler-let" "N-0345D216") ("compl-span-str" "N-0171717F") ("cond" "N-016C9E24") ("conda" "N-025CC33C") |