我一直在阅读有关F# 3.0类型提供程序(例如这里)的资料,看起来它们基于一种编译时代码生成。 在这方面,我想知道它们与Lisp宏的比较。 似乎F#3.0类型提供程序和Lisp宏都允许用户在编译时执行代码,并引入新类型以供编译器使用。 有人能否解释一下其中的问题和涉及到的细节?
我一直在阅读有关F# 3.0类型提供程序(例如这里)的资料,看起来它们基于一种编译时代码生成。 在这方面,我想知道它们与Lisp宏的比较。 似乎F#3.0类型提供程序和Lisp宏都允许用户在编译时执行代码,并引入新类型以供编译器使用。 有人能否解释一下其中的问题和涉及到的细节?
F#类型提供程序和其他语言的元编程技术之间存在一些重叠,但我同意Daniel的看法:它们没有太多共同点。F#还有一些其他的元编程技术,比如引用(quotation),它们可能更接近于LISP宏。
具体而言:
LISP宏通常用于转换表达式(您可以获取LISP表达式并解释它或转换它,然后执行它)。请注意,转换以LISP表达式作为输入。另一方面,类型提供程序只能采用非常有限的参数(字符串、整数)。
引用更相似。它们可用于处理F#表达式 - 您可以将一段F#代码视为数据并对其进行解释或转换。转换取决于(F#表达式的子集),但通常不会执行它。
类型提供程序纯粹用于生成类型。由于LISP是动态类型语言,这实际上不是您在LISP中遇到的问题。但是,这是一种代码生成(一种可以在LISP中执行的元编程形式)。
expr-> expr
转换;2)类型提供程序不仅是编译器功能。其积极体验是IDE体验的一个重要组成部分,后者依赖于类型,我不确定在LISP世界中是否有直接等效物(同样,这在某些方面是可行的,但可能不太容易)。 - Tomas Petricek