Schemeの勉強になるマクロの例
R6RS の Records の参考実装を読んでいたら見つけた。
(define-syntax define-alist-extractor (syntax-rules () ((define-alist-extractor ?name ?name/cps ?tag ?default) (begin (define-syntax ?name/cps (syntax-rules (?tag) ((?name/cps () ?k . ?rands) (?k ?default . ?rands)) ((?name/cps ((?tag ?val) . ?rest) ?k . ?rands) (?k ?val . ?rands)) ((?name/cps ((?another-tag ?val) . ?rest) ?k . ?rands) (?name/cps ?rest ?k . ?rands)))) (define-syntax ?name (syntax-rules (?tag) ((?name ()) ?default) ((?name ((?tag ?val) . ?rest)) ?val) ((?name ((?another-tag ?val) . ?rest)) (?name ?rest))))))))
アクセサをマクロで生成し、そのアクセサはマクロ展開時に alist 的なものをパターンマッチで展開している。
こういうのはもしかしたら定石なのかもしれないが面白い。