[Gauche-devel-jp] Re: quasi-pattern

Back to archive index

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





Gauche-devel-jp メーリングリストの案内
Back to archive index