argius note

プログラミング関連

Stew 4.1.0 beta1

今回のマイナーバージョンアップの主な変更点は、Java Scripting機能の向上です。
以下の3点を変更しています。

  • グローバル変数を維持、共有できるようになった
  • 組み込みのJavaScript以外でも利用可能となった
  • ファイルだけでなく、直接スクリプトを実行できるようになった

正式リリース時に改めて紹介しますが、まだリリースパッケージ内のドキュメントを修正していませんので、現時点での変更内容を簡単に記しておきます。

グローバル変数を維持、共有できるようになった

インスタンスGUIならウィンドウ単位)ごとの状態として、ScriptContextを持つようにし、それを使いまわすようにしました。
ScriptContextは、同じスクリプトエンジン内だけでなく、異なるスクリプト間でも共有できます。逆に、スクリプトエンジンの状態は維持しません。(詳細は次項)
この状態をリセットするには、

 > -s .

と入力します。


組み込みのJavaScript以外でも利用可能となった

Java Scripting対応のスクリプトエンジンがあれば、どの言語でも利用できます。と言っても全部を試したわけではなく、こちらで試したのはJython(2.5.3)とJRuby(1.8.6)です。おそらく他のエンジンでも、Jarファイルをクラスパスに設定するだけでOKなはずです。JRubyは本体とエンジンの2つのJarが必要でした。Jythonは、エンジン部分も本体に組み込まれているようです。

ファイルで指定する場合は、拡張子で判別されます(ScriptEngineManager#getEngineByExtension)。

前述したように、ScriptContextにより異なるスクリプト間でグローバル変数を共有できます。そして、数値、文字列、配列は互換性もあるようです。ところが、クラス・関数・メソッドに関しては、共有はできるものの、呼び出すことはできません(例外あり?)。
また、JRubyでは、クラスはグローバル変数扱いでないようで、現在のStewの実装ではクラス定義を引き継げません。引き継げるようにするには、エンジン自体をキャッシュするような実装にする必要がありそうです。
JavaScript(Rhino)とJythonでは、クラスもグローバル変数扱いになり、引き継ぐことができます。


ファイルだけでなく、直接スクリプトを実行できるようになった

スクリプトエンジンに対応する名前を指定することで、そのエンジンにスクリプトコードを渡すことができるようになりました。

 > -s js op.output("hello")
hello
 > -s ruby $op.output("hello")
hello
 >

感想(?)

JavaScriptだけではちょっと物足りなかったので、場合によって使い分けることができるようになったのがうれしいです。
その分、RubyとかPythonのおさらいをしないといけなくなりましたが...
Perlが(メジャーなJVM実装が無いので?)使えないのはちょっと残念。