From 872b311ba9b24ed244bb37795ecaae96082cbe85 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Wed, 28 Aug 2019 21:01:36 -0700 Subject: 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. --- share/txr/stdlib/compiler.tl | 36 +++++++++++++++++++++--------------- 1 file 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) -- cgit v1.2.3