由于无类型宏是out,因此避免初始类型检查的宏变量的数量已经减少。
relevant release doc中的基本原理将隐式宏和宏注释都引用为备选方案。
事实上宏观注释确实像宣传的那样有效。但是,我无法找到隐式宏(至少我理解的)或在这种情况下部署的另一个宏变体的示例。
所以,再一次,问题是:除了宏注释,宏创建方法避免了立即类型检查,它们在这方面有何不同?
刺激我调查的具体用例正在改变这样的事情(通过宏注释实现):
{
@blah
val x = {
foo("a")
bar()
}
}
在宏应用程序之前,当前作用域中的任何位置都未定义foo
和bar
。预期的用例是DSL。 以上示例仅针对上下文,因此请不要限制您对此方案的回答。
答案 0 :(得分:3)
目前(Scala 2.11.0-M8,Macro Paradise 2.0.0-M3),宏观赦免中实现的宏注释是唯一一种在扩展之前没有检查宏参数的宏味。
还有一个实验dsl-paradise提议扩展Scala,范围注入允许def宏不能以受控方式完全输入,但它目前处于早期实现阶段,所以它还没有用到
官方Scala中无类型宏的未来目前尚不清楚。一方面,我们认识到无类型的宏有时是有用的(例如对于类型提供者,范围注入),但另一方面,它看起来像它们最常见的形式,这样的宏比我们想要的更强大(请参阅我的StrangeLoop谈论philosophy of Scala macros从27:40开始和最近在scala-internals的讨论。因此,需要进一步的实验来详细说明无类型宏应该进入主干的确切形状。