From: Shin-ichro Hara Date: 1998-12-10T02:56:40+09:00 Subject: [ruby-dev:3788] Re: List() 原です。 In message "[ruby-dev:3784] Re: List()" on 98/12/09, MAEDA Shugo writes: | |前田です。 |原> でもせっかくのアイデアなのにケチつける?:-) | |ケチをつけるというわけではないのですが、 いえ、せっかくのアイデアというのは x,y=[1,2] #=> x=1; y=2 とい うまつもとさんのアイデアのことで、私の *x= のアイデアであ、じゃ なかった、では、ないです。私のは十分にケチをつけてもらわないと。 (^^; どうも前田さんの感じていることが微妙に私の感じとちがうので、 ひとつひとつ確認のためのコメントをつけます。 |...やはり配列とリストを |区別する/しない、というのは、どちらかに統一すべきような気が |しています。 | |each_with_indexを | | def each_with_index | i = 0 | each { |*x| | yield(*(x + i)) | i += 1 | } | end | |のようにパラメータを展開して渡すようにしたとします。 | |とすると、現状のHash#eachではyield([key, val])としている |わけですが、... そうですね。多分現状はyield(key, val)と書かれていると考え ていいと思いますが、もし私の案が仕様になれば、以前と同じ 動作をさせるためにはyield([key, val])と書き直さなければな らないです。 |...これは[key, val]という一つの値を渡している |わけではなくて、key, valという二つの値を渡すことを意図 |しているわけですから、 意図はそうですね。配列を渡したいわけではなく、2つの 値を渡したいんですね。それが出来ないので配列を「利用」 しているだけですね。 |{"key"=>"val"}.each_with_index {|key, val, i| | p key #=> "key" | p val #=> "val" | p i #=> 0 |} | |となる方が、 | |{"key"=>"val"}.each_with_index {|key, val, i| | p key #=> ["key", "val"] | p val #=> 0 | p i #=> nil |} | |よりも自然だと思います。 私も前者の方が自然だと思います。しかし現在の動作は後者である。 そして、将来も互換性を保つためにそれを守る事になると思います。 なぜ後者が現在の仕様であるかというと、それは現在の yield の仕 様ではそれが最も実装がシンプルだからですね。(私の案が採用され れば前者も同じぐらい実装はシンプルになります。) ここまではほぼ完全に同意できるわけですが、 |つまりyieldで配列を渡した時に、一つの値として配列を渡すという意図が |あったのか、複数の値を渡すという意図があったのかは、結局区別できな |いわけですから、|*x|で受けた時に配列が渡されたことがわかったとしても、 |yieldした側がどちらの挙動を望んでいるかわからないのではないでしょうか。 ここが良く分からないです。分からないからちゃんと返答できなくて、 一方的に自分の意見を述べてそちらが私が何が分からないのか汲んで くれる事を期待することになるわけ(^^; ですが 、、、 私の案が仕様になった場合は、配列を渡したい時は yield に配列を 渡し、複数の値を渡したい時は yield にリストを渡します。それが プログラミングの作法となるわけで、自然な作法だと思います。で、 それはどちらであっても多くの場合同じ効果しか生まないのですが、 たまに (新しい)each_with_index の様に差が出るわけです。 現在までに書かれているイテレータ定義の多くはそれを区別しない で書かれていて、その意図がどちらであるのかイテレータの利用者 は分かりません。本来はイテレータの作者に新しい仕様向けに書き 直してもらわないといけないわけです。書き直してもらうと、いい こと(利用者の料理のレパートリーが増えるということ)があるわけ です。 にもかかわらず、ほとんどの場合、イテレータの定義を書き直さな くてもいままでと同じ動作をすると思います。(だいたい 95% ぐら い、、、ほんと?) 将来「なぜ each_with_index のブロックパラメータは x, y, i を 出さずに [x, y], i を出して来るの?」という質問が出ると思いま すが、それは歴的事情だと説明する事になるでしょう。 、、、というのが、私の考えている事なんだけどなあ。 |>>>>> In [ruby-dev:3780] |>>>>> "原" == Shin-ichiro Hara san wrote: |>> 卒論を書くマシンにrubyがインストールされているのが悪いんです。 | |原> その卒論のタイトル知りたいなあ。 | |まつもとさんのご指摘のように哲学科なのですけどよいですか? (^^; 前田さんがフランス哲学なのは前の第-1回 Ruby Conference で知っ ています。 |「システムにとって意図とは何か」という題目で、ルーマンの社会 |システム理論とアンスコムやデイヴィドソンの行為論を扱っています。 それって仏哲ですか?アメリカの社会学の様な感じ。:-) 「システムにとって意図とは何か」うーむ興味深い。次の Conference では是非ご高説を賜わりたいです。(^^