Shiro Kawai
shiro****@lava*****
2006年 9月 29日 (金) 21:04:18 JST
確認しました。元のmatchのエキスパンダが、複数値を返すことを 考慮していないみたいですね。リスタート (=> next) のための 継続に、節の結果をそのまま渡しちゃってます。単純化すると、 (call/cc (lambda (k) ... (k <exp>))) みたいに展開されちゃって、<exp>が複数の値を返すことを考えてないと。 正しくは (call/cc (lambda (k) ... (call-with-values (lambda () <exp>) k))) と展開されるべきなので、そのようにfixしておきました。 (libsrc/util/match.scm, v 1.2) --shiro From: Tatsuya BIZENN <bizen****@arthu*****> Subject: [Gauche-devel-jp] util.match Date: Fri, 29 Sep 2006 01:54:06 +0900 > 備前です。 > > util.matchを使っている時に奇妙な動作に気づきました。 > > (define (test-match ls) > (match ls > ((a b . c) (=> next) (values a b c)) > ((a . b) (=> next) (values #f a b)) > (() (=> next) (values #f #f '())))) > > こんな関数を定義した時、 > > gosh> (test-match '()) > #f > #f > () > gosh> (test-match '(a)) > #f > gosh> (test-match '(a b)) > a > b > () > gosh> (test-match '(a b c)) > a > b > (c) > gosh> (test-match '(a b c d)) > a > b > (c d) > gosh> > > という感じになります。(a)を与えた時は #f a () が返っ > てきそうな > 気がするのですが、valuesに与えた最初の値が返ってきます。こ > れって > こういうものでしょうか? > > ;; 追いかけようと思って macroexpand に上記の match > 式を喰わせたら > ;; くらくらしました ;-) > > -- > 備前 達矢 > > > _______________________________________________ > Gauche-devel-jp mailing list > Gauch****@lists***** > http://lists.sourceforge.jp/mailman/listinfo/gauche-devel-jp >