java - que - ¿Existe una forma independiente del idioma para agregar una función a los enlaces de scripts JSR223?
que es jquery (1)
La clase de Bindings
JSR223 le permite exponer objetos arbitrarios de Java a lenguajes de scripting. Pero tienen que ser objetos. Me gustaría definir una función quit()
que se pueda llamar desde el entorno de scripts que se convierte en quitObject.run()
en Java. Pero JSR223 no define el concepto de un objeto de función. ¿Existe una forma independiente del idioma de hacer lo siguiente en Javascript, es decir, tomar Runnable () y crear una función en el entorno de scripting?
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));
Con el soporte Javascript incorporado para JSR223, esto crea una sun.org.mozilla.javascript.internal.InterpretedFunction
que hace lo que quiero. Pero obviamente no funcionará en Jython o lo que sea, y me gustaría que este lenguaje sea independiente.
No quiero que los usuarios de mi script tengan que escribir quitObject.run()
ya que es torpe, y no quiero analizar la entrada del script para encontrar quit()
ya que podría estar oculto dentro de otro código.
Si observa el código fuente del motor de JavaScript , encontrará cómo Oracle / sun implementó 2 funciones (imprimir e imprimir) que están mágicamente (o no tan mágicamente) presentes cuando enciende el motor.
Esas funciones están ''guionadas'', que es más o menos lo que hiciste.
Lo que haría es cargar y evaluar un bootstrap.[language_extension]
antes de evaluar cualquier otra entrada en el nuevo contexto.
Podrías crear fácilmente tales scripts para cada idioma que pretendas apoyar.