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 的なものをパターンマッチで展開している。
こういうのはもしかしたら定石なのかもしれないが面白い。