JSR223Bindings
クラスを使用すると、任意の Java オブジェクトをスクリプト言語に公開できます。しかし、それらはオブジェクトでなければなりません。Javaでquit()
化けるスクリプト環境から呼び出せる関数を定義したいと思います。quitObject.run()
しかし、JSR223 は関数オブジェクトの概念を定義していません。Javascript で次のことを行う言語に依存しない方法はありますか?
static private Object asFunction(ScriptEngine engine, Runnable r)
throws ScriptException
{
final Bindings bindings = engine.createBindings();
bindings.put("r", r);
return engine.eval(
"(function (r) { var f = function() { r.run(); }; return f;})(r)",
bindings);
}
Runnable quitObject = /* get/create a Runnable here */
Bindings bindings = engine.createBindings();
bindings.put("quit", asFunction(engine, quitObject));
JSR223 の組み込み Javascript サポートにより、sun.org.mozilla.javascript.internal.InterpretedFunction
これは私が望むことを行う を作成します。しかし、明らかに Jython などでは機能しないので、これを言語に依存しないようにしたいと考えています。
スクリプトのユーザーがquitObject.run()
入力するのは面倒なので、スクリプトの入力を解析して見つけたくありませんquit()
。他のコードに埋もれている可能性があるからです。