2016-06-27 3 views
1

저는 웹 인터프리터에 대한 스칼라 코드를 평가하기 위해 스칼라 도구 상자를 사용하고 있습니다. 그것은 잘 작동 코드는 다음과 같습니다Scala Toolbox eval을 사용하여 나중의 평가에서 사용할 수있는 값을 어떻게 정의합니까?

import scala.reflect.runtime.universe._ 
import scala.tools.reflect.ToolBox 

object Eval { 
    val toolbox = runtimeMirror(getClass.getClassLoader).mkToolBox() 

    def eval[T](code: String): T = { 
    toolbox.eval(toolbox.parse(code)).asInstanceOf[T] 
    } 
} 

내가 좋아하는 뭔가를 할 수 있습니다

Eval.eval[Long]("1 + 1") 

2 다시 얻을.

Eval.eval[Unit]("val yellow = 5") 
Eval.eval[Long]("yellow") 

나는 not found: value yellow 오류 : 뭔가를 정의 할 때 문제는 온다. Scala Toolbox로 나중에 평가할 때 사용할 수있는 값을 어떻게 정의합니까?

감사합니다.

답변

1

지속적인 환경에서는 Scala의 REPL을 직접 사용할 수 있습니다. 2.11 release notes 하단의 JSR-223 참고 사항을 참조하십시오.

import javax.script.ScriptEngineManager 

class DummyClass 

object Evaluator { 
    val engine = new ScriptEngineManager().getEngineByName("scala") 
    val settings = engine.asInstanceOf[scala.tools.nsc.interpreter.IMain].settings 
    settings.embeddedDefaults[DummyClass] 
    engine.eval("val x: Int = 5") 
    val thing = engine.eval("x + 9").asInstanceOf[Int] 
} 

DummyClass가 (또는 정말 당신이 DummyClass 대체 할 수있는 모든 클래스가) 여기 due to SBT and classloader concerns (자세한 내용 here를) 계속 헛소리의 비트에서 발생에 대한 필요성.

+0

아하 이것은 아주 좋습니다! 유일한 문제는 스크립트에서 오류가 발생했을 때 엔진에서 발생한 예외를 어떻게 얻을 수 있습니까? 지금 당장은 단지 ScriptException을 반환하고, 실제 원인이 터미널에 출력 되더라도'.getMessage()'는'javax.script.ScriptException : compile-time error'를 반환합니까? – prismofeverything