【发布时间】:2013-05-08 10:03:12
【问题描述】:
我想使用一个使用“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 的代码,它们是文档中引用的项目,但找不到这样的代码。
【问题讨论】:
-
T需要使用type标签吗?如果没有,你甚至不需要addImpl的T参数——你应该可以使用Typed和TypeName("T")。
标签: scala scala-macros