-->

是否有一个独立于语言的方式添加到JSR223脚本绑定的功能?(Is there a language

2019-07-04 03:48发布

在JSR223 Bindings类可以让你暴露任意的Java对象的脚本语言。 但他们必须是对象。 我想定义一个函数quit()可以从脚本环境,变成了被称为quitObject.run()在Java中。 但是JSR223没有定义一个函数对象的概念。 是否有一个独立于语言的方式做在Javascript以下,即把一个Runnable()和创建的脚本环境的功能?

 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()因为它可以在其他代码中被埋没。

Answer 1:

如果你看一下JavaScript引擎的源代码 ,你会发现甲骨文/ Sun如何实现两个功能(打印和println),这是神奇的(或不那么神奇地)存在,当你启动你的引擎。

这些功能是“照本宣科”,这或多或少是你做了什么。

我会做的是:负载和评价bootstrap.[language_extension]在新的环境评估任何其他输入之前。

你可以轻松地创建这样的脚本你打算支持的每种语言。



文章来源: Is there a language-independent way to add a function to JSR223 scripting bindings?