矢印let

syntax-caseがちょっとずつわかってきた。わかってくると色々やってみたくなるもの。そういうタイミングで矢印letというのを見掛けた。
http://www.jmuk.org/diary/2007/04/14/0
今度はこれをsyntax-caseで書いてみることにした。

(define-syntax lets
  (lambda(x)
    (define (lets% y)
      (syntax-case y (in <-)
        (((ext ...) var <- obj rest ...)
         (with-syntax (((e ...)
                        (lets% (syntax((ext ... (var obj)) rest ...)))))
           (syntax (e ...))))
        (((ext ...) in body ...)
         (syntax ((ext ...) body ...)))))
    (syntax-case x ()
      ((_ arg ...)
       (with-syntax (((ext ...) (lets% (syntax (() arg ...)))))
         (syntax (let ext ...)))))))

syntax-rulesよりは「リストを操作してる感」があると思う。でも、やはりパターンマッチ主体であることには変わりない。schemeではマクロが操作するのはリストでなくあくまでも「構文オブジェクト」であるということが感覚的にわかるまでは多少の違和感があるかもしれないけれど、私はschemeの伝統的マクロを使ったことが無いこともあってわりと自然に受け入れられた。lisperはリストとして扱いたいものなんだろうか。
ところで、slibにあるsyntax-caseではシャープ構文をsyntaxの代わりに使えないと思ったらreadは処理系が持ってるのをそのまま使ってた。考えてみればアタリマエだけれど、ちょっと冗長だ。それとrhizomeでは角括弧が使えない。ちょっとしたことだけれど、入り組んだマクロを書くときには角括弧で区別出来ると結構見栄えが違う。
とりあえず今回は(Gauche上の)slibとpetite chez schemeとrhizomeで動くように作って動作確認した。まだ、それほど自分が書いたものが期待通り動作することに確信を持てるほどになってない。
Document ID: 8674a8c9dd84a1e3b77f2569718a1c3b