summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2025-06-15 02:37:41 -0700
committerKaz Kylheku <kaz@kylheku.com>2025-06-15 02:37:41 -0700
commit0ccc19a5399ff7c926143684c807d1e19429d6b4 (patch)
tree8332830e17b575cc5a45c125b38c324e84ee253a
parenteabadb2d4e22c6f166bb1a3079eaca3ae305a39c (diff)
downloadtxr-0ccc19a5399ff7c926143684c807d1e19429d6b4.tar.gz
txr-0ccc19a5399ff7c926143684c807d1e19429d6b4.tar.bz2
txr-0ccc19a5399ff7c926143684c807d1e19429d6b4.zip
compiler: immediately called lambda: code gen tweak.
This patch addresses some irregularities in the output of lambda-appply-transform, to make its output easier to destructure and use in tail recursion logic, in which the inner bindings will be turned into assignments of existing variables. * stdlib/compiler.tl (lambda-apply-transform): Move the binding of the al-val gensym from the inner let* block to the outer let/let where other gensyms are bound. Replace the ign-1 and ign-2 temporaries by a single gensym. Ensure that this gensym is bound.
-rw-r--r--stdlib/compiler.tl22
1 files changed, 11 insertions, 11 deletions
diff --git a/stdlib/compiler.tl b/stdlib/compiler.tl
index b6d9de2f..b1d69db2 100644
--- a/stdlib/compiler.tl
+++ b/stdlib/compiler.tl
@@ -2232,17 +2232,17 @@
(fix-vals (mapcar (ret (gensym)) fix-arg-exprs))
(fix-arg-iter fix-arg-exprs)
(check-opts)
- (ign-1 (gensym))
- (ign-2 (gensym))
+ (ign (gensym))
(al-val (gensym))
(shadow-p (let ((all-vars (append pars.req pars.(opt-syms)
(if pars.rest (list pars.rest)))))
(or (isecp all-vars fix-arg-iter)
(member apply-list-expr all-vars)))))
- (rlcp ^(,(if shadow-p 'let 'alet) ,(zip fix-vals fix-arg-iter)
+ (rlcp ^(,(if shadow-p 'let 'alet) (,*(zip fix-vals fix-arg-iter)
+ (,ign nil)
+ ,*(if apply-list-expr
+ ^((,al-val ,apply-list-expr))))
(let* ,(build
- (if apply-list-expr
- (add ^(,al-val ,apply-list-expr)))
(while (and fix-vals pars.req)
(add ^(,(pop pars.req) ,(pop fix-vals)))
(pop fix-arg-iter))
@@ -2273,14 +2273,14 @@
(pars.rest
(add ^(,pars.rest nil)))
(apply-list-expr
- (add ^(,ign-2 (if ,al-val
- (lambda-excess-apply-list))))))))
+ (add ^(,ign (if ,al-val
+ (lambda-excess-apply-list))))))))
((and fix-vals apply-list-expr)
(lambda-too-many-args lm-expr))
(apply-list-expr
(when pars.req
- (add ^(,ign-1 (if (< (len ,al-val) ,(len pars.req))
- (lambda-short-apply-list)))))
+ (add ^(,ign (if (< (len ,al-val) ,(len pars.req))
+ (lambda-short-apply-list)))))
(while pars.req
(add ^(,(pop pars.req) (pop ,al-val))))
(while pars.opt
@@ -2299,8 +2299,8 @@
(push (list* var-sym have-sym init-form) check-opts)))
(if pars.rest
(add ^(,pars.rest ,al-val))
- (add ^(,ign-2 (if ,al-val
- (lambda-excess-apply-list))))))
+ (add ^(,ign (if ,al-val
+ (lambda-excess-apply-list))))))
(pars.req
(lambda-too-few-args lm-expr))
(pars.opt