2016-06-27 2 views
1

私は、WebインタプリタのためのScalaコードを評価するためにScalaツールボックスを使用しています。それがうまく機能している、コードは次のようになります。Scala Toolbox evalを使用すると、後でエバールで使用できるI値をどのように定義できますか?

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

これは素晴らしいです!ここで唯一の問題は、スクリプトにエラーがあった場合に、エンジン内で発生した例外をどのように取得するのかです。実際の原因が端末に出力されても、 '.getMessage()'は 'javax.script.ScriptException:compile-time error'を返します。 – prismofeverything

関連する問題