さすがに前回のはあんまりだよなぁと思い、もう少しだけR6RSっぽくしてみた。
(import (rnrs))
(define-syntax $
(lambda (x)
(define (build es)
(let loop ((es es) (r '()))
(syntax-case es ($)
(() (reverse r))
(($ es ...)
(append (reverse r) (list (loop #'(es ...) '()))))
((e . es)
(loop #'es (cons #'e r))))))
(syntax-case x ()
((k es ...)
(build #'(es ...))))))
(define (print . args)
($ for-each display args) (newline))
($ newline)
($ for-each print
$ list 1 2 3)
($ for-each print
$ map cons '(1 2 3) $ list 4 5 6)
単に自前で分解するのをやめてsyntax-caseに頼っただけとも言う。前回同様、mosh、Ypsilon、Sagittariusで確認。
reverseをreverse!にappendをappend!するときっとメモリ節約。処理系が対応していればだけど。
No comments:
Post a Comment