OK. ScriptEngine.eval(String string)
evalúa una cadena en su totalidad, y ScriptEngine.eval(Reader reader)
evalúa la entrada desde un Reader
en su totalidad.jsr223 + escribiendo un intérprete de guiones
Así que si tengo un archivo, puedo abrir FileInputStream, envolver un Reader y llamar al scriptEngine.eval(reader)
.
Si tengo una instrucción completa como una cadena, puedo llamar al scriptEngine.eval(string)
.
¿Qué debo hacer si necesito implementar un intérprete interactivo? Tengo un usuario que está escribiendo de forma interactiva en una declaración de líneas múltiples, p.
function f() {
return 3;
}
Si leo la línea de entrada por línea, y el uso de la forma de cadena de eval()
, voy a terminar de pasarla declaraciones incompletas, por ejemplo function f() {
y obtener un error.
Si paso en un lector, el ScriptEngine
esperará hasta que se complete la entrada, y no es interactivo.
¡Ayuda!
Solo para aclarar: el problema aquí es que sólo puedo pasar ScriptEngine.eval()
declaraciones completas, y como el cliente de ScriptEngine, no sé cuando una línea de entrada está completa sin la ayuda de la propia ScriptEngine.
shell interactivo de Rhino utiliza Rhino de Context.stringIsCompilableUnit()
(ver LXR para usage y implementation).
... y cómo ayuda eso? ¿Cómo se supone que debo distinguir entre un enunciado incompleto y un enunciado completo sin la ayuda de ScriptingEngine mismo? –
"Entrar en una línea en blanco indica el final de la entrada del usuario" - ICK - eso funcionaría, pero es molesto. –
No hay nada que impida que una declaración incompleta provenga de una transmisión, ya sea un archivo, una conexión de red o un teclado. Tendrá que hacer alguna pre-verificación o la eval impl tendrá que tomar las medidas necesarias para manejar/verificar que la declaración no esté completa. En segundo lugar, cada flujo debe tener un marcador final. Leer desde un flujo que no sea del teclado devuelve un valor de indicador como EOF, -1, nulo, etc. Puede elegir el medio que desee para el final de la entrada, pero tiene que haber una forma programática para determinar que el usuario ha terminado. – karakuricoder