Существует ли независимый от языка способ добавления функции в привязки сценариев 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]
перед оценкой любого другого ввода в новом контексте.
Вы можете легко создавать такие скрипты для каждого языка, который вы намереваетесь поддерживать.