F# 中的非类型化/类型化代码引号与宏观卫生之间是否存在关系



我想知道 F# 中的非类型/类型化代码引用与宏系统的卫生之间是否存在关系。他们是用各自的语言解决同样的问题,还是分开关注的问题?

编程方面是唯一的相似之处,即使在这方面,也有很大的不同。您可以将宏的转换器视为从语法到语法的函数,就像您可以操作引号一样,但转换器是全局协调的,因此用作绑定器的名称遵循特定的协议:

1( 活页夹可能与宏输入中的任何自由名称不同(除非您使用不卫生的逃生舱口(

2( 在宏定义的上下文中绑定的名称在宏

的扩展中是自由的,在宏使用时必须指向相同的事物。(这需要全球协调(

选择名称是为了在使用错误的名称时扩展不会失败(除非事实证明该名称是未绑定的(。

类型引号的转换器没有这个定义时间上下文的想法。您可以操纵引号以形成一个不引用程序中的任何名称的程序。它们不是为了提供语法抽象机制。任意形状的语法?不。这一切都必须是核心 AST 形状。

类型化报价系统中的开放代码可以使用符合预期上下文的类型结构的任何内容进行封闭 - 没有将几个开放组件协调组合成一个连贯的结构。

引号是元编程的一种形式。它们允许您以编程方式操作抽象语法树,这些语法树可以拼接成代码并进行评估。

类型化引号将 AST 的化类型嵌入到宿主语言的类型系统中,因此它们确保无法生成键入错误的代码片段。非类型化报价不提供该保证(它可能会因运行时错误而失败(。

顺便说一句,键入的引号与模板Haskell准引号非常相似。

类Lisp语言中的hygenic macros是相关的,因为它们的存在是为了支持元编程。然而,卫生是针对简单的名称捕获混淆,这是输入准引号已经避免(以及更多(的事情。

所以是的,

它们是相似的,因为它们分别是类型和非类型语言的元编程机制。类型化的准引号和卫生宏都为完全无类型、不健全的元编程增加了额外的安全性。不过,他们为程序员提供的保证水平是不同的。键入的引号严格更强。

最新更新