我想使用一个使用" type"定义的类型的宏。关键词。我该如何参考?
我的开始代码是
import scala.reflect.macros.Context
import scala.language.experimental.macros
trait Demo6 {
type T
def add(param: Any): T = macro Demo6.addImpl[T]
def fullAdd(param: Any, toStringBasedOnAST: String): T = {
doesSomeThing_and_returnsSomething_OfTypeT
}
def doesSomeThing_and_returnsSomething_OfTypeT: T //just to allow compilation
}
object Demo6 {
def addImpl[T: c.WeakTypeTag](c: Context)(param: c.Expr[Any]): c.Expr[T] = {
import c.universe._
reify { (c.Expr[Demo6](c.prefix.tree)).splice.fullAdd(param.splice,
c.literal(show(param.tree)).splice) }
// ^ - type mismatch; found : org.autotdd.scalamacros.Demo6#T
// required: T
}
}
我在示例中标记了编译器错误。很明显发生了什么:关键字定义的类型T与我传入的类型T相同。
我尝试过的事情 scala-macros上还没有很多文档。 http://docs.scala-lang.org/overviews/macros/overview.html中的部分非常有助于我这么做,但它的示例使用了类级别和方法级别泛型。我浏览了Expecty和macrocosm的代码,这些代码是文档中引用的项目,但是找不到这样的代码。
答案 0 :(得分:4)
您的代码几乎正确,只需更改Expr
的类型参数:
val expr = reify { ... }
c.Expr[T](expr.tree)
如果没有reify
,您应该返回此内容:
c.Expr[T](Apply(Select(c.prefix.tree, newTermName("fullAdd")),
List(param.tree, Literal(Constant(show(param.tree))))))
reify
创建相同的内容,但类型参数错误。
请参阅this answer了解showRaw
用法。
在这种情况下:
scala> import reflect.runtime.universe._
import reflect.runtime.universe._
scala> {
| object Demo { def fullAdd(param1: Any, param2: String): String = "result" }
| showRaw{ reify { Demo.fullAdd("param1", "param2") } }
| }
res0: String = Expr(Apply(Select(Ident(newTermName("Demo")), newTermName("fullAdd")), List(Literal(Constant("param1")), Literal(Constant("param2")))))
将Ident(newTermName("Demo"))
替换为c.prefix.tree
,Literal(Constant("param1"))
替换为param.tree
,"param2"
替换为show(param.tree)
,您将获得结果。