【问题标题】:Is it safe to nest macro invocations?嵌套宏调用是否安全?
【发布时间】:2012-07-03 14:55:57
【问题描述】:

我一直在测试一些嵌套的宏调用,它们按预期工作(...正如我所料!)例如,假设一个虚构的 add 宏和以下表达式:

add(1, add(2, 3))

首先,内部的 add 被扩展 (2 + 3),其次外部的 add 完成它的部分 (1 + (2 + 3))。我已经看到外部宏在输入表达式中没有收到来自内部调用的任何噪音,因此内部扩展似乎对它完全透明。这个事实是否总是成立(即使是更复杂的宏和类型)?这样做安全吗?

【问题讨论】:

  • 我无法从略读中收集到足够的信息来充分回答您的问题,但您可能对这篇描述 Racket 宏系统的论文感兴趣:Macros that Work Together: Compile-Time Bindings, Partial Expansion, and Definition Contexts
  • 具体那篇论文我不太了解,我只看过会议版,但是Scala的宏系统并不完全可比——比如说,类型检查发生在宏扩展之前——虽然这需要做name分辨率并允许通过使用 reify 来添加卫生。不要害怕:Scala 宏默认不卫生,但如果您只构建 AST 以通过 reify 返回(这有点类似于 quasi-quotation,坦率地说我仍然不明白其中的区别)。跨度>

标签: scala macros scala-2.10


【解决方案1】:

最里面的宏总是首先展开(即使它们是作为名称参数提供的)。

【讨论】:

  • 我认为答案的另一部分是(希望)在扩展内部宏之后,在调用外部宏之前对结果进行类型检查(否则,输出可能无法完全键入/解析)。
  • 确实,内部宏的扩展在传递给外部宏之前会进行类型检查。宏扩展总是在从宏实现返回后立即进行类型检查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-25
  • 2017-01-08
  • 2013-03-13
  • 2013-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多