【问题标题】:How can I use a macro with refined return type inline?如何使用内联精炼返回类型的宏?
【发布时间】: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 我们有一个错误。如果我没记错的话,适用性检查是完全基于表达式的广告类型执行的,没有做任何宏扩展。

标签: scala macros


【解决方案1】:

这是一个错误,已在我们的问题跟踪器https://issues.scala-lang.org/browse/SI-7914 中报告。

【讨论】:

  • 顺便说一句,这对你有多大的阻碍作用?如果这是一个大问题,我们可以讨论解决方法,或者我可能会在不久的将来在空闲时间尝试解决这个问题。
  • 我很乐意看到这个问题得到解决。
  • 由于只是适用性检查为时过早,我使用q"new { def of(x: ${weakTypeOf[T]}) = x + 1 }"f[Int].of(1)作为解决方法。
  • 请参阅stackoverflow.com/questions/26577588/… 了解解决方法。
猜你喜欢
  • 1970-01-01
  • 2021-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多