Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 是否有一些方法可以使用宏实现代码来;f";宏中的字符串插值器?_Scala_Macros_Scala 2.10 - Fatal编程技术网

Scala 是否有一些方法可以使用宏实现代码来;f";宏中的字符串插值器?

Scala 是否有一些方法可以使用宏实现代码来;f";宏中的字符串插值器?,scala,macros,scala-2.10,Scala,Macros,Scala 2.10,目前,我试着做如下事情: def macroImpl(cx: Context)(...) = { new MacroImplementations { val c = cx } } 但它抱怨宏实现中的c类型为scala.reflect.macros.runtime.Context,而cx类型为scala.reflect.macros.Context 这两种情况之间有什么区别?我最终得出了以下解决方案-这很难看,但它是有效的: import scala.language.experiment

目前,我试着做如下事情:

def macroImpl(cx: Context)(...) = {
  new MacroImplementations { val c = cx }
}
但它抱怨
宏实现中的
c
类型为
scala.reflect.macros.runtime.Context
,而
cx
类型为
scala.reflect.macros.Context


这两种情况之间有什么区别?

我最终得出了以下解决方案-这很难看,但它是有效的:

import scala.language.experimental.macros
import scala.reflect.macros.Context
import scala.reflect.macros.runtime.{Context => ContextR}
import scala.tools.reflect.MacroImplementations


def putfImpl(cx: Context)(args: cx.Expr[Any]*): cx.Expr[Unit] = {
  val cx2 = cx.asInstanceOf[ContextR]
  val args2 = args.toList.asInstanceOf[List[cx2.Expr[Any]]]
  import cx2.universe._
  val Apply(_, List(Apply(_, partsE))) = cx2.prefix.tree
  val mi = new { val c : cx2.type = cx2 } with MacroImplementations
  val res = mi.macro_StringInterpolation_f(partsE, args2.map(_.tree), cx2.enclosingPosition)
  reify(println(cx2.Expr[String](res).splice)).asInstanceOf[cx.Expr[Unit]]
}

您必须将
c
转换为所需的类型。@EugeneBurmako-是的,我最后就是这么做的。我现在就发布我的解决方案。