6

It's easy to write hygienic macros in Scala by using reify and eval. But it's not always possible to use reify and eval.

So, if one can't use them, what are the rules that will ensure that a macro is hygienic? And is there any way to test a macro to ensure that no bad hygiene has slipped through the cracks?

upd. In later milestones of 2.10.0, Expr.eval got renamed to Expr.splice.

4

2 回答 2

10

Reify 是卫生的,因为它与 Ident 和 This 树一起保存符号。

如果您的宏扩展结果没有附加到标识的符号(例如,您只有 Ident("x") 来指定对名为 x 的引用),那么宏扩展的后续类型检查会将 x 绑定到范围内的任何内容调用站点(或者如果该范围没有 x,您将收到编译错误)。

相比之下,当您的宏扩展具有其标识的符号时,类型检查器不会尝试重新解析它们,而只是使用它所拥有的。这意味着当您具体化一个表达式并在宏扩展中使用结果时,它会将其符号带入调用站点。好吧,不是所有的符号,例如,不可能引用局部变量或私有/受保护的东西,但是对全局可访问声明的引用是持久的。

底线是要检查您的宏是否卫生,请检查您的 idents 和 thises 是否附有符号。您可以通过具体化或手动将符号分配给手工制作的树来实现此目的。

于 2012-04-24T03:19:10.293 回答
1

既然reify是一个宏,我就看看它的实现来弄清楚它的作用。

于 2012-04-23T18:23:59.023 回答