F#中的无类型/类型代码引用与宏观卫生之间是否存在关联?

时间:2012-05-17 18:02:20

标签: f# programming-languages macros lisp metaprogramming

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

2 个答案:

答案 0 :(得分:7)

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

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

2)宏定义的上下文中绑定的名称在宏的扩展中是空闲的,必须在宏使用时指向相同的内容。 (这需要全球协调)

如果使用了错误的名称(除非事实证明该名称是未绑定的),就会选择名称,以便扩展不会失败。

键入引文的变换器没有此定义时间上下文的想法。您操纵引号以形成一个程序,该程序不引用程序中的任何名称。它们并不意味着提供语法抽象机制。任意形状的语法?不。这一切都必须是核心AST形状。

类型化报价系统中的开放代码可以用适合预期上下文的类型结构的任何东西来关闭 - 没有几个开放组件协调组合成一个连贯的结构。

答案 1 :(得分:6)

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

键入的引用在宿主语言的类型系统中嵌入了AST的具体类型,因此它们可以确保您无法生成错误类型的代码片段。无类型引用不提供该保证(它可能会因运行时错误而失败)。

另外,键入的引号与Template Haskell quasiquotations强烈相似。

类似Lisp的语言中的Hygenic宏是相关的,因为它们的存在是为了支持元编程。然而,卫生用于简单的名称捕获混淆,键入准引用的东西已经避免(以及更多)。

所以是的,它们是相似的,因为它们分别是类型化和非类型化语言的元编程机制。两种类型的准引号和hygenic宏为完全无类型,不健全的元编程增加了额外的安全性。它们为程序员提供的保证级别是不同的。键入的引号严格更强。