1
残念ながら準クォートへの挿入値、最も直感的な方法、スカラ -
Error:(16, 36) Don't know how to unquote here
val tree = q"""println("Hello $world")"""
^
で
val world = "Earth"
val tree = q"""println("Hello $world")"""
結果quasiquotes内$
がtree
を期待しているため。
val world = "Earth"
val tree = q"""println(${c.literal(s"Hello $world")})"""
作品、非常に醜いと私はc.literal
は廃止され、私が代わりに、quasiquotesを使用する必要があることのIntelliJ警告が表示されます。
...どうすればいいですか?フラウィウスさんのコメントに応えて
UPDATE
:
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
}
}
はあなたがTermName
またはコンパイラプリミティブ何かを必要とする
Error:(18, 40) Don't know how to unquote here
val tree = q"""println("Hello $world")"""
^
? – User1291
また、あなたが仕事を提案する2つの方法のどちらもコンパイラは "世界"が彼には知られていないと不平を言うだろう、第二に、彼はそれを引用する方法を知らないと不平を言うだろう。 – User1291
私は答える前にテストしました、あなたは何かをやっていて、おそらく間違っています。使用しているスカラのバージョンは何ですか? – flavian