3

残念ながら、最も直感的な方法は、

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")"""
                                   ^
4

2 に答える 2