Shiro Kawai
shiro****@lava*****
2004年 8月 23日 (月) 19:49:47 JST
From: Kimura Fuyuki <fuyuk****@hadal*****> Subject: [Gauche-devel-jp] quasi-pattern Date: Mon, 23 Aug 2004 17:06:56 +0900 > util.matchの使い方で教えてほしいのですが、パターンを動的に生成するには > どうすればいいのでしょうか。 パターンはマクロ展開時に処理されて、展開後のコードに影響を 与えます。パターンの変更はソースコードの変更と同じことですから、 実行時のデータによってパターンを変えたいのなら、もう一度 ソース→実行、のフェーズを通す必要がありますね。つまりeval。 (もしくは、パターンの生成が本体実行前に出来るのであれば、 パターンの生成自体をマクロでやってしまうとか) > quasi-patternを使って > > (define x "x") > (match "x" (`,x (print "match"))) > > とかするのかと思ったのですが、なんか違うみたいです。 quasi-patternは私も使ったことがなかったので見てみました。 どうもバグがあるっぽいです。portの時にエンバグしたかも。 =================================================================== RCS file: /cvsroot/gauche/Gauche/lib/util/match.scm,v retrieving revision 1.4 diff -u -r1.4 match.scm --- lib/util/match.scm 28 Jul 2004 23:13:17 -0000 1.4 +++ lib/util/match.scm 23 Aug 2004 10:43:04 -0000 @@ -313,7 +313,7 @@ (case (car p) ((quasiquote) (if (and (pair? (cdr p)) (null? (cddr p))) - (quasi p) + (quasi (cadr p)) (cons-ordinary (car p) (cdr p)))) ((quote) (if (and (pair? (cdr p)) (null? (cddr p))) =================================================================== で、quasi-patternの役割は、pattern中のquoteの効果をon/offする ことにあるみたいなので、実行時評価には使えなさそうです。 `(a (b ...)) => (a (b)), (a (b b)), (a (b b b)) 等にマッチ `(a ,(b ...)) => (a (3 4 5)), (a ("b" "c")), (a ()) 等にマッチ でも、前者の振舞いはちょっと不思議だなあ。quoteされてたら、|...| も そのままの扱いにして欲しいものですが。 -- shiro