2010/05/26

syntax-rules: reverse-and-quote-list

取りあえず書いてみたのがこれ。微妙っぽい。

で、PDF に書いてあったのは、こういうの。

なるほどー!

これは、letrec-syntaxとやらで、rl-helperをローカルに定義できるのでは?

エラー。うーん。間違ってるのはどこだろう。。エラーメッセージもよくわからない。
letrec-syntax, let-syntax は余計に情報少ないな・・・(web)。

追記

これは動きますね。。

どういうことかよくわかりません。

プログラミングGaucheThe Reasoned Schemer

4 件のコメント:

  1. define-syntaxの直下にletrec-syntaxが来る形はGaucheではまだサポートされていません。(Gauche 0.9ではr5rsに出てくる形 (define-syntax name (syntax-rules ...)) だけ受けつけます)。

    2番めのやつは、syntax-rulesがネストしているためです。外側にあるsyntax-rulesがテンプレート中にある '...' も全て展開しようとしてしまいますが、外側のsyntax-rulesにとってはbackwというのはパターン変数ではなく初出の識別子なので、いくつ繰り返せば良いのかわかりません。やりたいことは、外側のsyntax-rulesが展開した結果に (backw ...) を含めたい、ということです。このように「展開した結果に...を含める」には (... ...) と書くことにR6RSではなっています。Gaucheでは未サポートです。

    返信削除
  2. define-syntax 直下の letrec-syntax は現在未サポートなんですね。よく知らないまま letrec よろしく使おうとしていました^^;
    「まだ」ということは、将来的にサポートされる予定なんでしょうか。

    ネストした syntax-rules では、R6RS 対応の処理系だと(... ...)で動くということですね。こちらも試してみます。

    reverse-and-quote-list は補助マクロもローカルマクロも使わない形で、書きなおしてみました。
    http://valvallow.blogspot.com/2010/05/re-reverse-and-quote.html

    返信削除
  3. dotted list を使う方法もあります。

    (define-syntax reverse-and-quote-list
    (syntax-rules ()
    ((_ lis)
    (letrec-syntax
    ((helper
    (syntax-rules ()
    ((_ () backw)
    'backw)
    ((_ (arg . rest) backw)
    (helper rest (arg . backw))))))
    (helper lis ())))))

    R6RS に対しては規格内のはずです。
    R5RS では規格外ですが、 R5RS 処理系を名乗るいくつかの処理系では動きます。
    残念ながら Gauche では駄目でした。

    返信削除
  4. おー!これなら(... ...)でなくても書けるわけですね。
    上記のコードをコピーして、私もGaucheで試してみました。少しいじったりしてみましたが、やはり動きませんでした。

    dotted listを使ったり、...だったり、いろいろ書き方があるんですね。

    そういえば、下記のようなコードを書いたりしたことがありました。(Gaucheで)
    ;; http://valvallow.blogspot.com/2010/02/tss-letcc-try.html

    (define-syntax try
    (syntax-rules ()
    ((try var a . b)
    (letcc success
    (letcc var (success a)) . b))))

    返信削除