(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!するときっとメモリ節約。処理系が対応していればだけど。
Syntax highlighter
2012-08-11
Haskell風の$マクロ その2
さすがに前回のはあんまりだよなぁと思い、もう少しだけR6RSっぽくしてみた。
No comments:
Post a Comment