From: shugo@... (MAEDA Shugo) Date: 1998-12-01T20:39:19+09:00 Subject: [ruby-dev:3723] Re: Multiple assignment at yield() 前田です。 # 間違って多重代入を多重継承とか書いてました(^^; >>>>> In [ruby-dev:3705] >>>>> "松本" == Yukihiro Matsumoto san wrote: 松本> そうなのかなあ.元々yieldの後ろに複数の値がくるってのはただ 松本> 単に 松本> yield [a,b,c] 松本> の省略形という意味しかありません(でした)しねえ.どちらかに統 松本> 一するもなにも元々apply的なわけです. でも、実際問題としては、たいてい、 yield a のように値を一つだけ渡すことが多いような気がします。 で、これを yield [a] とすると、|x|で受けた時にx=[a]になってしまいます。 yieldをapply的な意味に限定すると、一つだけ値を受け取りたい時は |x,|としなければいかないわけですよね。 松本> で,案としてはたとえばCLUのようにreturnやyieldで複数の値を渡 松本> せるようにするというのがキレイで好きなんですけど,過去との非 松本> 互換は大きくなりそうですね. 配列を使って複数の値を返す方法が便利なところもありますしね。 松本> |そこで思い切って、ブロックへの引数の受け渡しに多重継承を用いず、 松本> |別のロジックを用いることにしてはどうでしょう。 松本> 私の考えてい{る,た}のもこんな感じです.ただ,どう考えてもこ 松本> の変更とそれによる非互換を正当化するほどの理由ではないように 松本> も思うのですよね.今のモデルも慣れればすっきりしてるし. 松本> # 慣れすぎてて最初なにが問題なのか分らなかった. 原さんが[ruby-dev:3622]で示された問題については、現在の仕様でも class Proc def funcall(*args) call(args) end def apply(args) # ついでにapplyも定義 apply(args) end end def iter1(&b); b.funcall(1, 2); end def iter2(&b); b.funcall([1, 2]); end iter1 {|args| p args} #=> [1, 2] iter2 {|args| p args} #=> [[1, 2]] とすることで一応解決できますね。 [ruby-dev:3625]については、仕方ないでしょうか。 松本> |# rb_yield()をどうするかというのも問題ですし。 松本> rb_yield(int argc, VALUE argv[]); 松本> とかでしょうか. Cで書いたイテレータを全部書き直す必要が出てくるのが気になったのでした。 -- 前田 修吾 (mailto:shugo@aianet.ne.jp)