From aab9fcabb003e8ef3a937674f1a8f9d4c68316b5 Mon Sep 17 00:00:00 2001 From: Linus Date: Wed, 2 Dec 2020 21:39:47 +0100 Subject: [PATCH] Extracted the innermost recuring form into a separate form to facilitate inlining Guile wasn't properly doing DCE when there are no :final guards, so I did it as a macro. --- goof.scm | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/goof.scm b/goof.scm index 77a1530..35a0e97 100644 --- a/goof.scm +++ b/goof.scm @@ -466,6 +466,17 @@ (syntax-case stx () ((a ...) #'(a ...)))) +(define-syntax inner-recur + (syntax-rules () + ((_ loop-name final-fun () ((v s) ...)) + (loop-name s ...)) + ((_ loop-name final-fun (user-finals ...) ((v s) ...)) + (let ((v s) ...) + (if (or user-finals ...) + final-fun + (loop-name v ...)))))) + + (define-syntax let-kw-form (syntax-rules () ((_ macro-name final-fun (user-finals ...) (loop-name (var step) ...) . body) @@ -476,10 +487,9 @@ (params (list #'(var step) ...))) (if (null? lst) (with-syntax ((((v s) :::) params)) - #'(let ((v s) :::) - (if (or user-finals ...) - final-fun - (loop-name v :::)))) + #'(inner-recur loop-name final-fun + (user-finals ...) + ((v s) :::))) (syntax-case (car lst) (=>) ((=> name val) (loop (cdr lst) (update-name params #'name #'val)))