[417] Re:クラスメソッドとクラス変数
投稿者:kit
2007/02/20 02:13:25
> >あと、制御構造の抽象化としてiteratorのようなものを表現する場合、
> >Ruby(のeachメソッド)みたいにクロージャをメソッドに渡す形でサンプルを
> >書いてみたのですが、
> >もっとうまいやり方がありますか?
> これでよいのではないでしょうか。
えーと、iterator は、iterator 自体がオブジェクトであるような
作りにした方が便利だと思います。iterator を利用する側が
必ず closure を作るのは面倒くさいですし、なにより、
複数のコレクションを、複数の iterator を使って同時に並行して
アクセスするようなプログラム、たとえばコレクションどうしの
大小比較:
function compare(i, j) {
for (; !i.isDone() && !j.isDone(); i.next(), j.next()) {
if (i.currentItem() < j.currentItem())
return -1;
if (i.currentItem() > j.currentItem())
return 1;
}
if (i.isDone() && j.isdone())
return 0;
if (i.isDone())
return -1;
else
return 1;
}
print(compare(ArrayIterator(a), ArrayIterator(b)) + "\n");
みたいなことをしようとすると、eachメソッド方式では困っちゃいます。
なので、たぶん次のような設計の方がいいと思います。
function ArrayIterator(anArray) {
this = new_object();
this.theArray = anArray;
this.index = 0;
this.first = closure() { this.index = 0; }
this.next = closure() { this.index++; }
this.isDone = closure() { return this.index >= this.theArray.size(); }
this.currentItem() = closure() { return this.theArray[this.index]; }
return this;
}
と、ここまで書いて、実際に動作するプログラムかどうか試そうとしたら、
文法エラーになっちゃいました。UNIX版をコンパイルしてみたんですが、
次のような1行だけのプログラムで
a = {1,2};
1:文法エラー({付近)
となります。
また、次のような2行だけのプログラムでも
a = new_object();
a.hoge = 1;
2:不正な文字(.)
となります。
crowbarの実装の中身は全然見てないんですが、UNIX版だけの問題なんでしょうか?