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

标签 f# programming-languages macros lisp metaprogramming

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

最佳答案

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

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

2) 在宏扩展中自由的宏定义上下文中绑定(bind)的名称必须在宏使用时指向同一事物。 (这需要全局协调)

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

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

类型化引用系统中的开放代码可以用符合预期上下文类型结构的任何内容来关闭 - 没有将多个开放组件协调组合成一个连贯的结构。

关于f# - F# 中的非类型化/类型化代码引用与宏卫生之间是否存在关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10641057/

相关文章:

f# - 可变变量 'i'以无效方式使用。

oop - 帮助设计树结构 - 函数式和 OOP 之间的张力

F# - 如何比较 float

c# - 在一个强类型的世界中,为什么 ASP.NET MVC 对命名约定的脆弱依赖不令人不悦?

programming-languages - 语言能否拥有 Lisp 强大的宏而不带括号?

macros - 使用宏时每次迭代后参数递增

c++ - 它是什么? C++宏函数?怎么替换这个宏?我可以举个例子吗?

c++ - token 粘贴似乎不适用于 C++ 宏

performance - 几乎相同的方法之间的出色性能差异

c - 为什么功能激活记录中需要动态链接? (在静态范围语言中)