そういえば
初めて dankogai さんと会ったときに「S 式とアセンブラは両極端にいながら データ==プログラム というところが同じだ」というようなことを言っていた(気がする)。
データ==プログラムというのは本当にすごい
データとしてプログラムを直接書き換えたりいろいろなことができる。本当にすごい。
もちろん、他の言語でも、リフレクションすることや、変数やプロパティに関数を格納することでそれと似たようなことは可能だ。でもそれは、データ=プログラムとは全然違う。
バイトコード書き換えは似ているが、バイトコードの世界がデータ==プログラムなのであってその言語自体はそうじゃない。でも、バイトコードを直でいじれるのはすごい。
で、 JavaScript は?
JavaScript は残念ながらデータ!=プログラムである。
たとえば、以下のコードがあって
var hoge = function(a, b) { return a + b; };
「この関数の a + b を a - b に変えて」って言われてもそう簡単にはできません><
functioin で囲まれた中身の処理部分はデータではないから。
話しは jQuery に移って
jQuery の作者の John Resig さんが以下のようなプレゼンテーションをしていました。
http://www.slideshare.net/jeresig/building-a-javascript-library/
そして、そのスライドの 50 ページ目に以下のようなコードが乗っていました。
$("div.section") .find("dt") .addClass("section") .onclick() .next() .toggle() .end() .end() .end();
で、これはもう既に JavaScript をベースにした別の言語なのではないかと思ったわけです。
じゃあ、この言語は データ==プログラム か
残念ながら データ==プログラム ではない。
じゃあ、こう変えてみたらどうだろう。
var lang = [ ['find', 'dt'], ['addClass', 'section'], ['onclick'], ['next'], ['toggle'], ['end'], ['end'], ['end'] ]; var ctx = $('div.section'); for (var i = 0; i < lang.length; i ++) { ctx = lang[i].shift().apply(ctx, lang[i]); }
おおおお。これならデータ==プログラムな言語ではないのか。
もはや Lisp ではないのか(違
例
この言語を JS から使えば並列なインターバル処理を簡単に実現することも可能だ。
var prog1 = [..略..]; var prog2 = [..略..]; var ctx1 = $('hoge'); var ctx2 = $('fuga'); setInterval(function() { ctx1 = prog1[i].shift().apply(ctx1, page1[i]); ctx2 = prog2[i].shift().apply(ctx2, page2[i]); }, 0);
おおおお。
まとめ
jQuery すげげえええええええええええええええええ!
この辺の話しは Shibuya.JS できっと id:send さんが話してくれます><