我想知道 F# 中的非类型化/类型化代码引用与宏系统的卫生之间是否存在关系。他们是用各自的语言解决相同的问题,还是各自关注的问题?
最佳答案
元编程方面是唯一的相似之处,即使在这方面也存在很大差异。您可以将宏的转换器视为一个从语法到语法的函数,就像您可以操纵引号一样,但转换器是全局协调的,因此用作绑定(bind)器的名称遵循特定协议(protocol):
1) 绑定(bind)器可能与宏输入中的任何自由名称不同(除非您使用不卫生的逃生舱口)
2) 在宏扩展中自由的宏定义上下文中绑定(bind)的名称必须在宏使用时指向同一事物。 (这需要全局协调)
名称的选择是为了在您使用错误的名称时扩展不会失败(除非事实证明该名称未绑定(bind))。
类型化引用的变形金刚没有这种定义时间上下文的想法。您操纵引号以形成一个不引用程序中任何名称的程序。它们并不意味着提供句法抽象机制。语法的任意形状?没有。这一切都必须是核心 AST 形状。
类型化引用系统中的开放代码可以用符合预期上下文类型结构的任何内容来关闭 - 没有将多个开放组件协调组合成一个连贯的结构。
关于f# - F# 中的非类型化/类型化代码引用与宏卫生之间是否存在关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10641057/