【问题标题】:Apart from macro annotations, what macro creation methods avoid immediate type checking?除了宏注解,还有哪些宏创建方法可以避免立即进行类型检查?
【发布时间】:2014-01-27 00:46:08
【问题描述】:

由于无类型宏是out,因此避免初始类型检查的宏变体数量已经减少。

relevant release doc 中的基本原理引用了隐式宏和宏注释作为替代方案。

确实,宏注释确实像宣传的那样工作。但是,我找不到在这种情况下部署隐式宏(至少我理解的宏)或其他宏变体的示例。

那么,问题又来了:除了宏注解之外,还有哪些宏创建方法可以避免立即进行类型检查,它们在这方面有何不同?

促使我进行调查的具体用例正在改变这样的事情(通过宏注释实现):

{
    @blah
    val x = {
            foo("a")
            bar()
    }
}

其中foobar 未在宏应用程序之前的当前范围内的任何位置定义。预期的用例是 DSL。 以上示例仅针对上下文给出,因此请不要将您的答案局限于此场景。

【问题讨论】:

  • 隐式宏可以提供类型宏的类型级计算方面的替代方案,但据了解,它们不能以无类型方式使用。

标签: scala scala-macros scala-macro-paradise


【解决方案1】:

目前(Scala 2.11.0-M8,Macro Paradise 2.0.0-M3),宏 pardise 中实现的宏注释是唯一在扩展之前不对宏参数进行类型检查的宏风格。

还有一个实验性的dsl-paradise 提议使用作用域注入扩展 Scala,这将允许 def 宏不完全以受控方式键入,但它目前处于早期实施阶段,所以它还不能使用。

目前尚不清楚官方 Scala 中无类型宏的未来。一方面,我们认识到无类型宏有时很有用(例如,对于类型提供程序、作用域注入),但另一方面,在它们最一般的形式中,这些宏看起来比我们想要的更强大成为(从 27:40 开始,请参阅我关于 philosophy of Scala macros 的 StrangeLoop 讨论以及最近在 scala-internals 的讨论)。因此,未来的实验需要详细说明无类型宏应该进入主干的确切形状。

【讨论】:

  • 感谢您的全面解答!一个补充问题 - 您是否知道以当前形式从macro paradise删除宏注释的任何计划,还是保留下来?
  • 总的来说,我会努力保持兼容。如果这无济于事(就像类型宏被禁止包含在 Scala 中,因此没有未来),我会尽力提供足够强大的替代品。另外,正如scalamacros.org/news/2013/08/07/roadmap-for-macro-paradise.html 中提到的,宏注释将在天堂中至少在 2.10 和 2.11 中得到支持。我最近保护了实现宏注释所需的编译器挂钩,因此不会有问题。
猜你喜欢
  • 1970-01-01
  • 2018-10-30
  • 2017-10-22
  • 2023-03-07
  • 2010-10-08
  • 2021-08-24
  • 2016-02-20
  • 1970-01-01
  • 2013-01-25
相关资源
最近更新 更多