【发布时间】:2013-10-15 20:10:35
【问题描述】:
我正在尝试创建一个宏,它允许我捕获传递给构造函数的表达式的文本。我想要表达式的文本用于调试目的。宏实现如下:
package nimrandsLibrary.react.macroImpl
object Macros {
def applyImpl[T : context.WeakTypeTag, U : context.WeakTypeTag](context : scala.reflect.macros.Context) (expression : context.Expr[T]) : context.Expr[U] = {
import context.universe._
context.Expr[U](context.universe.New(context.universe.weakTypeOf[U], expression.tree, context.universe.Literal(context.universe.Constant(expression.tree.toString()))))
}
}
定义如下:
class Signal(expression : => T, expressionText : String) {
...
}
object Signal {
def apply[T](expression : T) = macro nimrandsLibrary.react.macroImpl.Macros.applyImpl[T, Signal[T]]
}
但是,无论我如何称呼它,如下所示,我都会收到错误消息。
val mySignal = Signal{ 2 } //type mismatch; found : Int required : T
但是,当然,T 的类型是 Int,所以这个错误没有意义。
似乎编译器在宏扩展中不知何故忘记将 Signal[T] 替换为 Signal[Int]。作为实验,我尝试更改定义站点,以便必须提供两种类型,如下所示:
def apply[T, U](expression : T) = macro nimrandsLibrary.react.macroImpl.Macros.applyImpl[T, U]
那么,我这样称呼它:
Signal[Int, Signal[Int]]{ 2 }
而且,这行得通。但是,当然,这根本不是我想要的语法。这是一个错误,还是我做错了?有解决办法吗?
【问题讨论】:
标签: scala scala-macros