[Gauche-devel-jp] Re: util.match

Back to archive index

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
> 



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