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

soc*_*soc 5 lisp macros f# programming-languages metaprogramming

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

J. *_*son 7

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

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

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

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

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

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


Don*_*art 6

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

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

另外,键入的引用与Template Haskell quasiquotations非常相似.

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

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

  • 我同意,虽然我认为我会用不同的方式表达,因为我认为卫生和'打字'这里是正交概念(两者都增加了不同的'安全'); 我认为所有F#引用都是hygenic,有些通过(meta-)静态类型增加额外的安全性. (3认同)