2010/08/27

syntax-rules: mreverse (マクロ reverse, 反転)

syntax-rules による reverse です。syntax-rules でマクロを書く時に良く使われるテクニック(?)。
;; macro reverse
(define-syntax mreverse
(syntax-rules ()
((_ (arg ...))
(mreverse "help" ()(arg ...)))
((_ "help" (acc ...)())
(acc ...))
((_ "help" (acc ...)(arg x ...))
(mreverse "help" (arg acc ...)(x ...)))))
(mreverse (3 2 1 list))
;; (1 2 3)
view raw mreverse1.scm hosted with ❤ by GitHub

helper を別途定義した場合。
(define-syntax mreverse
(syntax-rules ()
((_ (arg ...))
(mreverse-helper ()(arg ...)))))
(define-syntax mreverse-helper
(syntax-rules ()
((_ (acc ...)())
(acc ...))
((_ (acc ...)(arg x ...))
(mreverse-helper (arg acc ...)(x ...)))))
view raw mreverse2.scm hosted with ❤ by GitHub


プログラミングGauche

0 件のコメント:

コメントを投稿