はじめてのRhino

mzp2007-07-31

30分プログラム、その96。Javaで実装されたJavascript処理系であるRhinoを試してみる。
id:Gemma:20070708によるとNext Big Languageらしい。でも、call/ccとはまだ出会っていない。探してもいないんだけど。

インストール

http://www.mozilla-japan.org/rhino/download.html

シェル(対話環境)、インタプリタコンパイラ(Javaのclassファイルを作る)、GUIデバッガ(JavaGUI)が用意されている。ただ、そのままでは使いづらいので、いくつか起動用のスクリプトを書いた。

まず、アーカイブに同梱されていたjs.jarを/opt/manual/rhinoにおいた。

js(シェル兼インタプリタ):

#!/bin/sh
java -classpath /opt/manual/rhino/js.jar \
   org.mozilla.javascript.tools.shell.Main "$@"

jsc(コンパイラ):

#!/bin/sh
java -classpath /opt/manual/rhino/js.jar \
   org.mozilla.javascript.tools.jsc.Main "$@"

jsdb(GUIデバッガ):

#!/bin/sh
java -classpath /opt/manual/rhino/js.jar \
   org.mozilla.javascript.tools.debugger.Main "$@"

使い方

hello.jsに次のように書いたとして、

print('Hello,world!!');

次のように実行する。

$ js hello.js
Hello,world!!

コンパイラやデバッガは動作することは確認したけど、使い方は調べていない。

サンプルコード

Javaとの連携ができるので、Swingを使ってGUIを作ってみた。

print('Hello,World!!!');
java.lang.System.out.println('Hello,Java!!');

// swing
importPackage(Packages.javax.swing);
frame = new JFrame('Hello!');
frame.setSize(200,100);

button = new JButton('Hello,Swing!!');
button.addActionListener(function(){ 
   // great!!
   print('click!!');
});
frame.add(button);

frame.visible = true; // great!!
while(1){}

簡単に連携する方法をまとめておく。

  • Packages変数の下にマップされる
    • java.io.File -> Packages.java.io.File
    • javaパッケージだけはPackagesをつけなくてもいい。例:var file = new java.io.File;
    • javaxなどは明示的にPackagesを付ける必要がある
  • setter/getterがプロパティっぽく扱える
    • frame.setVisible(true); -> frame.visible = true
  • メソッドがひとつだけのリスナは、クロージャで代用できる
    • button.addActionListener(function() {...});

実にすばらしい。特にリスナの代りにクロージャが使えるのがすばらしすぎる。