以下の Scala quasiquote の 2 つの使用法で、 と の間result1
で異なる出力が得られる理由を説明してくださいresult2
。準引用符を使用して再現することは可能result3
ですか? つまり、文字列の内容を解析して評価しますか?
import scala.tools.reflect.ToolBox
import scala.reflect.runtime.universe._
val miniSrc = "val lst = (1 to 5).toList ; val sum = lst.foldLeft(0)(_ + _); sum"
val tree1 = q"$miniSrc"
//tree1: reflect.runtime.universe.Tree = "val lst = (1 to 5).toList ; val sum = lst.foldLeft(0)(_ + _); sum"
val tree2 = q"val lst = (1 to 5).toList ; val sum = lst.foldLeft(0)(_ + _); sum"
//tree2: reflect.runtime.universe.Tree =
//{
// val lst = 1.to(5).toList;
// val sum = lst.foldLeft(0)(((x$1, x$2) => x$1.$plus(x$2)));
// sum
//}
val tb = scala.reflect.runtime.currentMirror.mkToolBox()
val result1 = tb.eval(tree1)
//result1: Any = val lst = (1 to 5).toList ; val sum = lst.foldLeft(0)(_ + _); sum
val result2 = tb.eval(tree2)
//result2: Any = 15
val result3 = tb.eval(tb.parse(miniSrc))
//result3: Any = 15