2

由于无类型宏已经淘汰,避免初始类型检查的宏变体的数量已经减少。

相关发布文档中的基本原理引用了隐式宏和宏注释作为替代方案。

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

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

激发我调查的具体用例正在改变这样的东西(通过宏注释实现):

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

wherefoobar没有在宏应用之前的当前范围内的任何地方定义。预期的用例是 DSL。上面的示例仅针对 context 给出,因此请不要将您的答案限制在这种情况下。

4

1 回答 1

3

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

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

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

于 2014-01-27T07:38:04.677 回答