Использование GroovyShell в качестве «вычислителя / механизма выражений» (или: Как повторно использовать GroovyShell)

Я использую GroovyShell как «средство оценки выражений / механизм» внутри моей программы. Он принимает два входа: (а) один или несколько сценариев инициализации (б) пользовательский сценарий. Затем оба они объединяются во время выполнения в виде большого фрагмента скрипта (текста) и передаются в оболочку.

String initScripts = getFromDB()
String userScript = getFromUser()

def shell = new GroovyShell()
output = shell.evaluate(initScripts + userScript)

Приведенный выше код будет выполняться в цикле, в котором содержимое userScript будет изменяться.

Пока что initScripts содержат только определения переменных (например, def $ yyyy = new Date (). format ('yyyy') ), на который может быть ссылка в userScript (например, print «$ yyyy 001» ).

Есть ли там какой-нибудь более эффективный подход для этого? (Например, повторное использование оболочки, как?) Потому что сейчас он очень медленный.

Изменить: Groovy является обязательным. Пожалуйста, не рекомендуйте другой движок сценариев.

Изменить: Я думаю, сможет ли GroovyShell это сделать (псевдокод):

def shell = new GroovyShell()
shell.evaluate(initScripts)

for each userScript in DB {
    shell.put(userScript )
    def result = shell.evaluateThat()
    println "Result is $result"
}

Возможно ли это? (В прошлый раз я погуглил, это невозможно, но я надеюсь, что m неверно)

9
задан Derek Hogue 20 August 2012 в 02:27
поделиться