残念ながら、最も直感的な方法は、
val world = "Earth"
val tree = q"""println("Hello $world")"""
結果は
Error:(16, 36) Don't know how to unquote here
val tree = q"""println("Hello $world")"""
^
$
quasiquotes 内ではtree
.
val world = "Earth"
val tree = q"""println(${c.literal(s"Hello $world")})"""
動作しますが、非常に醜く、Intellij の警告が表示され、c.literal
非推奨であり、代わりに準引用符を使用する必要があります。
それで...どうすればいいですか?
アップデート
フラビアンのコメントに応えて:
import scala.language.experimental.macros
import scala.reflect.macros._
object TestMacros {
def doTest() = macro impl
def impl(c: blackbox.Context)(): c.Expr[Unit] = {
import c.universe._ //access to AST classes
/*
val world = "Earth"
val tree = q"""println(${c.literal(s"Hello $world")})"""
*/
val world = TermName("Earth")
val tree = q"""println("Hello $world")"""
tree match {
case q"""println("Hello Earth")""" => println("succeeded")
case _ => c.abort(c.enclosingPosition, s"huh? was: $tree")
}
c.Expr(tree) //wrap tree and tag with its type
}
}
与える
Error:(18, 40) Don't know how to unquote here
val tree = q"""println("Hello $world")"""
^