scala-将值插入到quasiquote中

scala-将值插入到quasiquote中,scala,macros,string-interpolation,scala-quasiquotes,Scala,Macros,String Interpolation,Scala Quasiquotes,不幸的是,最直观的方式 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")""" ^ 因为quasikotes中的$需要一个树 val world = "Earth" val tree = q"""pri

不幸的是,最直观的方式

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")"""
                      ^
因为quasikotes中的
$
需要一个

val world = "Earth"
val tree = q"""println(${c.literal(s"Hello $world")})"""
工作正常,但非常难看,我收到一条Intellij警告,即
c.literal
已被弃用,我应该改用Quasiquetes

所以。。。我该怎么做

更新

针对弗拉维安的评论:

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
或编译器原语

真正的问题是你在混合插值,而没有意识到。hello world中的插值器实际上是一个字符串插值器,而不是像您建议的那样擅长于取消树引号的准插值器

这是一种方法:

import c.universe._

val world = TermName("Earth")
val tree = q"""println("Hello" + ${world.decodedName.toString})"""

你能详细说明一下“hello world中的插值器实际上是一个字符串插值器,而不是一个准插值器”吗?另外,你建议的两种方法都不起作用。在第一种情况下,编译器会抱怨他不知道
world
,在第二种情况下,他会抱怨他不知道如何取消引用。我在回答之前做了测试,你做了什么,可能是做错了。您使用的是什么版本的scala?
scala 2.11.8(Java HotSpot(TM)64位服务器虚拟机,Java 1.8.0\u 77)
@User1291同样,在将其放在这里之前,我已经编译了所有内容,您能复制粘贴整个片段吗?
import c.universe._

val world = TermName("Earth")
val tree = q"""println("Hello" + ${world.decodedName.toString})"""