clojure にはカスケードマクロというものがあるそうだ。 Gauche で再現しようとしている記事を見掛けた。
id:trotr:20100922:1285138173
これは便利そうに思える。 よりポータブルに、 R5RS の範囲内で記述してみた。
(define-syntax => (syntax-rules () ((_ init) init) ((_ init (fn args ...) rest ...) (=> (fn init args ...) rest ...)) ((_ init fn rest ...) (=> (fn init) rest ...)))) (define-syntax =>> (syntax-rules () ((_ init) init) ((_ init (fn args ...) rest ...) (=>> (fn args ... init) rest ...)) ((_ init fn rest ...) (=>> (fn init) rest ...)))) (define-syntax =?> (syntax-rules () ((_ init) init) ((_ init (fn args ...) rest ...) (=?> (let ((tmp init)) (and tmp (fn tmp args ...))) rest ...)) ((_ init fn rest ...) (=?> (let ((tmp init)) (and tmp (fn tmp))) rest ...))))
ところで、マクロの名前も変えたことに気付いただろうか。 R5RS や R6RS を読んでみると、識別子の先頭にマイナス記号は使えないように思われるからである。 実際、元の名前のままでは Ypsilon では定義しようとしたときにエラーになった。 しかし、そうなるとマイナス記号一文字で表される引き算の手続きは問題ないんだろうか。
Document ID: 0f51c5bfd2506751d617396925c82fc1