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 ()
((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)))