summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2019-08-28 21:01:36 -0700
committerKaz Kylheku <kaz@kylheku.com>2019-08-28 21:01:36 -0700
commit872b311ba9b24ed244bb37795ecaae96082cbe85 (patch)
tree501e26e04dc046b140896944f99a43918bb68a71
parente0ef254ad0e1f5f3d9dac5ea8a8c527481a4f715 (diff)
downloadtxr-872b311ba9b24ed244bb37795ecaae96082cbe85.tar.gz
txr-872b311ba9b24ed244bb37795ecaae96082cbe85.tar.bz2
txr-872b311ba9b24ed244bb37795ecaae96082cbe85.zip
compiler: mac params: simplify optional presence indicators.
* share/txr/stdlib/compiler.tl (expand-bind-mac-params): Generate better Lisp code when presence indicating variables on optional parameters are not used. It's possible to bind the variable directly, instead of binding to nil and assigning it. The cases are split accordingly.
-rw-r--r--share/txr/stdlib/compiler.tl36
1 files changed, 21 insertions, 15 deletions
diff --git a/share/txr/stdlib/compiler.tl b/share/txr/stdlib/compiler.tl
index e6ec7840..5553f293 100644
--- a/share/txr/stdlib/compiler.tl
+++ b/share/txr/stdlib/compiler.tl
@@ -1438,10 +1438,10 @@
(,obj-var
(set ,curs (car ,obj-var))
(set ,obj-var (cdr ,obj-var))
- ,(if pres-p t))
+ ,*(if pres-p '(t)))
(t
(set ,curs ,init-form)
- ,(if pres-p nil)))))
+ ,*(if pres-p '(nil))))))
(if pres-p
(emit-var pres-p stmt)
(emit-stmt stmt))
@@ -1450,19 +1450,25 @@
(expand-rec p curs cv)
(put-gen curs))))
(t
- (let ((stmt ^(cond
- (,obj-var
- (set ,p (car ,obj-var))
- (set ,obj-var (cdr ,obj-var))
- ,(if pres-p t))
- (t
- ,(if init-form
- ^(set ,p ,init-form))
- ,(if pres-p nil)))))
- (emit-var p nil)
- (if pres-p
- (emit-var pres-p stmt)
- (emit-stmt stmt)))))))
+ (cond
+ (pres-p
+ (emit-var p nil)
+ (emit-var pres-p
+ ^(cond
+ (,obj-var
+ (set ,p (car ,obj-var))
+ (set ,obj-var (cdr ,obj-var))
+ ,(if pres-p t))
+ (t
+ ,(if init-form
+ ^(set ,p ,init-form))
+ ,(if pres-p nil)))))
+ (t
+ (emit-var p ^(if ,obj-var
+ (prog1
+ (car ,obj-var)
+ (set ,obj-var (cdr ,obj-var)))
+ (if ,init-form ,init-form)))))))))
(when pars.rest
(emit-var pars.rest obj-var)))))))
(expand-rec params obj-var nil)