3

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()。他のコードに埋もれている可能性があるからです。

4

1 に答える 1

1

JavaScriptエンジンのソースコードを見ると、エンジンを起動したときに魔法のように(またはそれほど魔法ではない)存在する2つの関数(printとprintln)をoracle/sunがどのように実装したかがわかります。

これらの関数は 'scripted' であり、多かれ少なかれあなたがしたことです。

私がすることはbootstrap.[language_extension]、新しいコンテキストで他の入力を評価する前に a をロードして評価することです。

サポートする言語ごとに、このようなスクリプトを簡単に作成できます。

于 2012-11-29T09:04:43.340 に答える