Существует ли независимый от языка способ добавления функции в привязки сценариев JSR223?

JSR223 Bindings Класс позволяет выставлять произвольные объекты Java на языки сценариев. Но они должны быть объектами. Я хотел бы определить функцию quit() что можно вызвать из среды сценариев, которая превращается в 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));  

Благодаря встроенной поддержке Javascript для JSR223 это создает sun.org.mozilla.javascript.internal.InterpretedFunction который делает то, что я хочу. Но это, очевидно, не будет работать в Jython или где-либо еще, и я хотел бы сделать это независимым от языка.

Я не хочу, чтобы пользователи моего скрипта набирали quitObject.run() как это неуклюже, и я не хочу анализировать ввод скрипта, чтобы найти quit() как это может быть похоронено в другом коде.

1 ответ

Если вы посмотрите на исходный код движка javascript, то увидите, как oracle / sun реализовал 2 функции (print и println), которые магически (или не так магически) присутствуют при запуске вашего движка.

Эти функции "скриптовые", что более или менее то, что вы сделали.

Что я хотел бы сделать: загрузить и оценить bootstrap.[language_extension] перед оценкой любого другого ввода в новом контексте.

Вы можете легко создавать такие скрипты для каждого языка, который вы намереваетесь поддерживать.

Другие вопросы по тегам