【发布时间】:2014-08-12 00:37:49
【问题描述】:
我有一个宏:
def f[T]: Any = macro fImpl[T]
def fImpl[T : context.WeakTypeTag](context: whitebox.Context):
context.Tree =
{
import context.universe._
q"{ (x: ${weakTypeOf[T]}) => x + 1 }"
}
当我使用它时
f[Int](1)
我明白了
Error:(26, 6) Any does not take parameters
f[Int](1)
^
如果我分成两个语句,
val x = f[Int]
x(1)
没有错误。
有没有一种方法可以将宏f[Int] 用作函数,而无需编写辅助语句?
【问题讨论】:
-
我很惊讶将它分成两个语句可以使用白盒宏。一定要
f返回Any吗? -
如果包含前缀,例如
MyMacro.f[Int](1),则错误变为too many argument lists for macro method f。我对@TravisBrown 的其他推论并不感到惊讶。 -
Iirc 我们有一个错误。如果我没记错的话,适用性检查是完全基于表达式的广告类型执行的,没有做任何宏扩展。