~ chicken-core (chicken-5) 1382439b5c952f46c2eb4cfa5c5a46484112c8c8
commit 1382439b5c952f46c2eb4cfa5c5a46484112c8c8 Author: Evan Hanson <evhan@foldling.org> AuthorDate: Mon Dec 21 12:18:48 2015 +1300 Commit: Peter Bex <peter@more-magic.net> CommitDate: Mon Dec 21 21:26:30 2015 +0100 Use pair as loop result handle in compiler-syntax for `map` This allows the expansion to blindly dereference the second slot of the value accumulated by the loop, avoiding the need for a conditional that detects the first iteration and updates the loop's result box and removing the continuation resulting from that conditional. Because the map-loop is then free of any CPS calls, it compiles to a label and goto. Signed-off-by: Peter Bex <peter@more-magic.net> diff --git a/compiler-syntax.scm b/compiler-syntax.scm index eedbdfdf..09a0ccf3 100644 --- a/compiler-syntax.scm +++ b/compiler-syntax.scm @@ -109,28 +109,26 @@ (if (and (memq 'map standard-bindings) ; s.a. (> (length+ x) 2)) (let ((vars (map (lambda _ (gensym)) lsts))) - `(,%let ((,%result (,%quote ())) - (,%node #f) - (,%proc ,(cadr x)) - ,@(map list vars lsts)) - ,@(map (lambda (var) - `(##core#check (##sys#check-list ,var (,%quote map)))) - vars) - (,%let ,%loop ,(map list vars vars) - (,%if (,%and ,@(map (lambda (v) `(,%pair? ,v)) vars)) - (,%let ((,%res - (,%cons - (,%proc - ,@(map (lambda (v) `(##sys#slot ,v 0)) vars)) - (,%quote ())))) - (,%if ,%node - (##sys#setslot ,%node 1 ,%res) - (,%set! ,%result ,%res)) - (,%set! ,%node ,%res) - (##core#app - ,%loop - ,@(map (lambda (v) `(##sys#slot ,v 1)) vars))) - ,%result)))) + `(,%let ((,%node (,%cons (##core#undefined) (,%quote ())))) + (,%let ((,%result ,%node) + (,%proc ,(cadr x)) + ,@(map list vars lsts)) + ,@(map (lambda (var) + `(##core#check (##sys#check-list ,var (,%quote map)))) + vars) + (,%let ,%loop ,(map list vars vars) + (,%if (,%and ,@(map (lambda (v) `(,%pair? ,v)) vars)) + (,%let ((,%res + (,%cons + (,%proc + ,@(map (lambda (v) `(##sys#slot ,v 0)) vars)) + (,%quote ())))) + (##sys#setslot ,%node 1 ,%res) + (,%set! ,%node ,%res) + (##core#app + ,%loop + ,@(map (lambda (v) `(##sys#slot ,v 1)) vars))) + (##sys#slot ,%result 1)))))) x))) (define-internal-compiler-syntax ((o #%o) x r c) ()Trap