gpt4 book ai didi

scala - 在没有具体化的情况下确保卫生

转载 作者:行者123 更新时间:2023-12-04 13:53:18 27 4
gpt4 key购买 nike

使用 reify 在 Scala 中编写卫生宏很容易和 eval .但是it's not always possible使用 reifyeval .

那么,如果不能使用它们,有什么规则可以确保宏是卫生的?有什么方法可以测试宏以确保没有不良的卫生习惯从裂缝中溜走?

更新。在 2.10.0 的后续里程碑中,Expr.eval更名为 Expr.splice .

最佳答案

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

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

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

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

关于scala - 在没有具体化的情况下确保卫生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10277758/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com