SyntaxCase
syntax-caseに関するメモ
特徴
- 健全
- マクロ展開時にSchemeのコードが書ける
- 健全でないこともできちゃう
テンプレ
(define-syntax or (lambda (x) (syntax-case x () ((_ e1 e2) (syntax (let ((t e1)) (if t t e2)))))))
マクロなんで、S式を受け取ってS式を返すもんだと思えばいい。 define-syntaxにS式を変換する関数(トランスフォーマ)を渡すことで マクロを定義する。 {{fn "letrec-syntaxにトランスフォーマを渡すと、ある範囲だけで使えるマクロを定義することもできる。"}}
といってもS式を手で解析するのはめんどいので、補助関数が用意されている。 「syntax-case」がパターンマッチによるS式リーダ、「syntax」がS式ライタだ。 「(syntax (foo bar))」は「#'(foo bar)」と略記しても良い。
つづく
View on github | Report issue