コメント: イテレーション比較

Rubyはスクリプト言語にオブジェクト指向くっつけて、さらに関数型言語的な要素も混ぜてるって言語だから、当然といえば当然かも。

純粋な関数型言語だったら、例えばML
http://caml.inria.fr/
とかだと、

List.map (fun x -> x * x) lst

とか書けば、リストlstの各要素を自乗したリストを得られます。

例に挙がっている、C系統のJava等の手続き型言語では、そもそも関数を型として扱うことは出来ないため、Collectionのような特殊なクラスを言語レベルで用意し、for-eachのような文法上の後付けをしたに過ぎないのです。(だから、本来の美しさ的には、無いほうが美しい)

Javaでの特殊な構文としては、inner-classがあります。これを使えば、オブジェクトとして関数を包み込んで、内部イテレータっぽく渡すということが可能です。
例えば、(Javaはあまり使わないので構文違うかも)

public interface Comparable {
public int compare(Object o1, Object o2);
}

public class SortList {
// ...
public int sort(Comparable cmp) {
// 比較する部分で cmp.compare(o1, o2) を呼び出す
}
}

// 使用
SortList lst;
lst.sort(new Comparable() {
public int compare(Object o1, Object o2) { // 実際に比較するコード }
});

のようにすれば、実際MyList.sortを呼び出す部分に、コードを埋め込めます。ただ、この追加仕様は、AdapterやListenerのために作られた節が強いと思われ、上記の例の場合などは、外部イテレータを使ったほうが簡潔かと思われます。

投稿者 ゆりあ : October 28, 2003 12:04 AM

なるほど。
今調べたんですが、JavaにはJava1.4でリフレクションの機能が大幅に改善されたので、Methodを足したりできるのかなぁ、そしたら特異メソッドみたいなことしてsort機能とか足したいなぁ、とか思ったんですかJavaのリフレクションは自己参照どまりのようで自己改変は不可なため、これはできないようです。

資料(なぜかLispページですが…)

投稿者 fenrir : October 28, 2003 12:37 AM
コメントする









名前、アドレスを登録しますか?
(次回以降コメント入力が楽になります)
  • 匿名でのコメントは受け付けておりません。
  • 名前(ハンドル名可)とメールアドレスは必ず入力してください。
  • メールアドレスを表示されたくないときはURLも必ず記入してください。
  • コメント欄でHTMLタグは使用できません。
  • コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
  • コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。