В ПОРЯДКЕ. ScriptEngine.eval(String string)
a> оценивает строку целиком и ScriptEngine.eval(Reader reader)
полностью оценивает ввод от Reader
.
Итак, если у меня есть файл, я могу открыть FileInputStream, обернуть вокруг него Reader и вызвать scriptEngine.eval(reader)
.
Если у меня есть полный оператор в виде строки, я могу вызвать scriptEngine.eval(string)
.
Что делать, если мне нужно реализовать интерактивный интерпретатор? У меня есть пользователь, который интерактивно печатает многострочный оператор, например.
function f() {
return 3;
}
Если я прочитаю ввод построчно и использую строковую форму eval()
, я в конечном итоге передам ему неполные операторы, например. function f() {
и получите ошибку.
Если я передам Reader, ScriptEngine
будет ждать вечно, пока ввод не будет завершен, и это не будет интерактивным.
Помощь!
Просто поясню: проблема здесь в том, что я могу передать только ScriptEngine.eval()
полных операторов, и, как клиент ScriptEngine, я не знаю, когда строка ввода завершена, без какой-либо помощи со стороны самого ScriptEngine.
Интерактивная оболочка Rhino использует Rhino. Context.stringIsCompilableUnit()
(см. LXR для использование и реализация).