JavaScript の map 関数

前回のエントリーで JavaScript の話が出たので、以前から JavaScript でやってみたかったことを試してみた。それは、JavaScript をコマンドラインで実行することだ。

Googleで調べて、SpiderMonkey というC言語で書かれた JavaScript エンジンと、Rhino という java で書かれたJavaScriptエンジンがあったが、インストールが簡単なので、Rhinoをインストールすることにした。

Rhinoのインストール方法だが、Windows の場合、サイトからダウンロードした .zip ファイルを、C:\以下に解凍するだけだった。Ubuntuでは、synaptic からインストールできる。

Windows のコマンドプロンプトで、

>java -jar C:\rhino1_7R2\js.jar

とすると、js> のプロンプトが表示され、JavaScript コマンドラインから実行することができる。print 文もあるので出力をターミナルに表示することができる。

js> print("hello, world");
hello, world

JavaScript の標準の map 関数を調べたが、map 関数は自分で定義しなくてはならないらしい。しかし JavaScript では、関数もファーストオーダーオブジェクトなので高階関数の定義が非常に簡単にできる。

js> function map(fn, ary) {
  >  var a = [];
  >  for(var i = 0; i < ary.length; i++) a.push(fn(ary[i]));
  >  return a;
  > }

引数の二乗を返す関数 square を定義して、map 関数の引数にしてやると、配列の要素が二乗される。

js> function square(x) { return x * x; }
js> map(square, [1, 2, 3, 4, 5])
1,4,9,16,25

map 関数を使って星印のピラミッドを作る方法は次のようになる。

js> map((function (x){ return Array(x+1).join("*")}), [1,2,3,4,5]).join("\n")
*
**
***
****
*****

これで、リスト処理の関数と、高階関数と、関数の合成でコンパクトに記述する方法が、Haskell に特異的なものではなく、Ruby でも JavaScript でも記述できる普遍的なものであることが分かった。

Haskell のプログラムの記述法がどんなに奇異に見えても、単に慣れの問題なのだと言えるだろう。

*Rhinoは java で書かれた JavaScript エンジンで、Java のクラスを JavaScript から利用することができる。JavaScript で簡単に GUI プログラムも作ることができる。Java のプログラム経験のあるひとには面白いツールではないだろうか。残念ながら、管理人は java がわからないのでメリットが生かせない。


今日の Haskell

Hugs> :l System.Time
System.Time> do {c <- getClockTime; print c}
Sat Dec 10 07:15:29 東京 (標準時) 2010
[PR]
by tnomura9 | 2010-12-09 18:50 | Haskell | Comments(0)
<< JavaScript Hask... Rubyのドット記法 >>