豊福@パパイヤです。

助田さん
>>  「C++のイテレータ」も知らないので、どなたか上の内容が
>>実感できる C++ と Ruby の具体的なコードで説明して頂け
>>ませんか。
>
> 実感できるかどうか判りませんが,私は,こんな感じのことを
> まつもとさんがおっしゃってるのかなあと思ったというのを
> 以下に書きます.

  ありがとうございます。

> まずは,C++の例です.
> #include <vector>
> #include <algorithm>
  ...
>     vector<int> ary(a, a+5);

  こういうのが標準であるんですか。たいぶ昔に C++ を勉強
しただけなので知りませんでした。

>      外部イテレータ
>      >> C++のイテレータのようなのは外部イテレータ(またはカーソル)
>      に該当するのがこれです.
  ...
>     vector<int>::iterator i; //i がカーソル?
>     for(i=ary.begin(); i!=ary.end(); i++) {
>         output(*i);
>     }

  begin,end,++ の実装がカーソルの中に隠蔽されているわけ
ですね。

>      外部イテレータを使えば
>      「複数の配列からひとつずつ要素を取り出し比較する」
>      ような処理は可能であることはわかります.(よね?)

    for(i=ary.begin(), j=ary2.begin; i!=ary.end(); i++,j++) {
        *i と *j を比較する
    }
みたいなことですかね。

>       >>関数ポインタか手続きオブジェクトがあれば,
>       >>外部イテレータを使って内部イテレータを実装できます
>       の部分がこれです.&output が関数ポインタに該当します.
>       外部イテレータそのものは表面上でてこないし,ループ制御
>       も見えない.for_each の中でループ制御をやってると思います.
>     for_each(ary.begin(), ary.end(), &output);

  なるほど。

> で,Rubyの例です.
  ...
> #内部イテレータです.ループの制御が表面には
> #でてきません
> ary.each do |i|
>   output(i)
> end

  これは Ruby ではおなじみですね。

  この続きの thread, callcc がらみの話はもうちょっと
じっくり読んでから反応させてもらいます。
---
                        豊福@パパイヤ
                        unbound / papaya.juice.or.jp
                        toyofuku / juice.or.jp