summaryrefslogtreecommitdiffstats
path: root/share
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2018-04-19 06:42:13 -0700
committerKaz Kylheku <kaz@kylheku.com>2018-04-19 06:42:13 -0700
commitf2d9bb59432f7ed58365ddc7ea4ffd6f5080a354 (patch)
tree12c14b8eae279a6e8fa8f0caf05fad37ac8aafc3 /share
parent85ae452077799e93991e53e04a005ac3a4db5f85 (diff)
downloadtxr-f2d9bb59432f7ed58365ddc7ea4ffd6f5080a354.tar.gz
txr-f2d9bb59432f7ed58365ddc7ea4ffd6f5080a354.tar.bz2
txr-f2d9bb59432f7ed58365ddc7ea4ffd6f5080a354.zip
new macros: hlet, hlet*.
* lisplib.c (yield_set_entries): Add hlet and hlet* to autoload list. * share/txr/stdlib/yield.tl (hlet-expand): New function (hlet, hlet*): New macros. * txr.1: Documented.
Diffstat (limited to 'share')
-rw-r--r--share/txr/stdlib/yield.tl28
1 files changed, 28 insertions, 0 deletions
diff --git a/share/txr/stdlib/yield.tl b/share/txr/stdlib/yield.tl
index 3ab74745..f8b5783d 100644
--- a/share/txr/stdlib/yield.tl
+++ b/share/txr/stdlib/yield.tl
@@ -88,3 +88,31 @@
^(sys:capture-cont ',name (lambda (,sym)
(sys:abscond-from ,name (progn ,*body)))
',form))
+
+(defun hlet-expand (op raw-vis body)
+ (let* ((vis (mapcar [iffi atom list] raw-vis))
+ (nvars (len vis))
+ (syms [mapcar car vis])
+ (inits [mapcar cadr vis])
+ (letop (if (eq op 'hlet*) 'let* 'let))
+ (gens (mapcar (ret (gensym)) vis))
+ (vec (gensym))
+ (macs (mapcar (ret ^(,@1 (vecref ,vec ,@2)))
+ syms (range 0)))
+ (inits (mapcar (ret ^(set (vecref ,vec ,@1) ,@2))
+ (range 0) inits)))
+ (if (eq op 'hlet*)
+ ^(let* ((,vec (vector ,nvars)))
+ (symacrolet ,macs
+ ,*inits
+ ,*body))
+ ^(let* ((,vec (vector ,nvars)))
+ ,*inits
+ (symacrolet ,macs
+ ,*body)))))
+
+(defmacro hlet (var-inits . body)
+ (hlet-expand 'hlet var-inits body))
+
+(defmacro hlet* (var-inits . body)
+ (hlet-expand 'hlet* var-inits body))