JavaScriptは関数型言語だ
今日、11時過ぎにkanasan.js#2に行ってみた。
既に20人以上も会場にいて、プレゼンが始まっていた。
なんと朝9時から夜9時まで、12時間のマラソン勉強会(^。^)
最初は、前回の復習。
講演者の話す内容は非常に面白かった。
継承、MixIn、wrap、いずれの具体例も非常に興味深い。
それから、Prototype.js1.6.0のコードリーディング。
12時間かけて、1000行を読んで、ようやくAjaxオブジェクトの所まで解読しましたよ!
JavaScriptは面白いなと思った箇所がある。
Prototype.jsの内部で、Hashを作っているソースがある。
そのソースに、intersect() という関数があり、その定義は、Lispみたいなソース。
つまり、無名関数をつなげまくって、わずか2行のソースで、二つのリストの共通部分を取り出す。
intersect: function(array) {
return this.uniq().findAll(function(item) {
return array.detect(function(value) { return item === value });
});
},
Rubyで言えば、上記の関数は、ブロックを2個使っているのと同じ。
最近のJavaScriptは無名関数を多用することで、エレガントに書こうとしているように見える。
これってLispに似てないか?
JavaScript読書会でも議論になったが、無名関数を使った場合、変数のスコープがJavaの場合と微妙に異なる。
レキシカルスコープ、ダイナミカルスコープの話もあった。
Haskellにあるcurry化のような関数(curry)を定義していたり、実装内容は、関数型言語の影響を強く受けているように思える。
関数型言語っぽい使い方をする利点は、変数が1回しか代入できないことよりも、無名関数やクロージャを使って、関数をまるで変数のように使い回すところにあるように思う。
そして、イベントの発火のようなロジックを手続き型言語よりもエレガントに書ける部分にあるように思う。
だから、Ajaxのようなイベント処理でビックリするような使い方ができるのかなと思ったりする。
今までJavaScriptは使えない言語と思っていたが、「JavaScriptは関数型言語である」という認識で、今後も注目していくつもり。
| 固定リンク
「プログラミング」カテゴリの記事
- Javaのモジュールシステムの考え方をまとめてみた(2022.10.21)
- Javaのモジュールシステムは複雑性をより増している(2022.09.10)
- Javaはなぜ関数型言語になろうとしているのか(2022.09.02)
- Javaのラムダ式の考え方(2022.08.10)
- Javaはオブジェクト指向言語ではなく関数型言語だった~「[増補改訂]関数プログラミング実践入門」はお勧めの本だ(2022.08.06)
コメント
1 class Array
2 def intersect(other)
3 uniq.select do |i|
4 other.any? {|v| i == v }
5 end
6 end
7 end
rubyで書いてみました。
投稿: ujihisa | 2007/12/08 23:34