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.
This commit is contained in:
Linus 2020-12-02 21:39:47 +01:00
parent 2dc4a72790
commit aab9fcabb0

View file

@ -466,6 +466,17 @@
(syntax-case stx () (syntax-case stx ()
((a ...) #'(a ...)))) ((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 (define-syntax let-kw-form
(syntax-rules () (syntax-rules ()
((_ macro-name final-fun (user-finals ...) (loop-name (var step) ...) . body) ((_ macro-name final-fun (user-finals ...) (loop-name (var step) ...) . body)
@ -476,10 +487,9 @@
(params (list #'(var step) ...))) (params (list #'(var step) ...)))
(if (null? lst) (if (null? lst)
(with-syntax ((((v s) :::) params)) (with-syntax ((((v s) :::) params))
#'(let ((v s) :::) #'(inner-recur loop-name final-fun
(if (or user-finals ...) (user-finals ...)
final-fun ((v s) :::)))
(loop-name v :::))))
(syntax-case (car lst) (=>) (syntax-case (car lst) (=>)
((=> name val) ((=> name val)
(loop (cdr lst) (update-name params #'name #'val))) (loop (cdr lst) (update-name params #'name #'val)))