ring wandering
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では未サポートです。
define-syntax 直下の letrec-syntax は現在未サポートなんですね。よく知らないまま letrec よろしく使おうとしていました^^;「まだ」ということは、将来的にサポートされる予定なんでしょうか。ネストした syntax-rules では、R6RS 対応の処理系だと(... ...)で動くということですね。こちらも試してみます。reverse-and-quote-list は補助マクロもローカルマクロも使わない形で、書きなおしてみました。http://valvallow.blogspot.com/2010/05/re-reverse-and-quote.html
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 では駄目でした。
おー!これなら(... ...)でなくても書けるわけですね。上記のコードをコピーして、私も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))))
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では未サポートです。
define-syntax 直下の letrec-syntax は現在未サポートなんですね。よく知らないまま letrec よろしく使おうとしていました^^;
返信削除「まだ」ということは、将来的にサポートされる予定なんでしょうか。
ネストした syntax-rules では、R6RS 対応の処理系だと(... ...)で動くということですね。こちらも試してみます。
reverse-and-quote-list は補助マクロもローカルマクロも使わない形で、書きなおしてみました。
http://valvallow.blogspot.com/2010/05/re-reverse-and-quote.html
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 では駄目でした。
おー!これなら(... ...)でなくても書けるわけですね。
返信削除上記のコードをコピーして、私も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))))