【问题标题】:Is there a language-independent way to add a function to JSR223 scripting bindings?是否有一种独立于语言的方式将函数添加到 JSR223 脚本绑定?
【发布时间】:2012-11-14 07:16:10
【问题描述】:

JSR223 Bindings class 允许您将任意 Java 对象公开给脚本语言。但它们必须是对象。我想定义一个函数quit(),它可以从脚本环境中调用,在Java 中变成quitObject.run()。但是 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(),因为它可能隐藏在其他代码中。

【问题讨论】:

    标签: java function scripting jsr223


    【解决方案1】:

    如果您查看javascript engine source code,您会发现 oracle/sun 如何实现 2 个函数(print 和 println),这些函数在您启动引擎时神奇地(或不那么神奇地)呈现。

    那些函数是“脚本化”的,这或多或少是你所做的。

    我要做的是:在评估新上下文中的任何其他输入之前加载并评估 bootstrap.[language_extension]

    您可以轻松地为您打算支持的每种语言创建此类脚本。

    【讨论】:

    • 很有趣——不是我想的,但我得去看看!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 2010-10-26
    • 2012-11-04
    • 1970-01-01
    相关资源
    最近更新 更多