15

我一直在阅读有关 F# 3.0 类型提供程序(例如此处)的信息,它们似乎基于一种编译时代码生成。在这方面,我想知道它们如何与 Lisp 宏进行比较。似乎 F# 3.0 类型提供程序和 Lisp 宏都允许用户代码在编译时执行并引入编译器可用的新类型。任何人都可以阐明所涉及的问题和细微差别吗?

4

4 回答 4

11

F# 类型提供程序和其他语言的元编程技术之间存在一些重叠,但我同意 Daniel 的观点,即它们没有太多共同点。F# 有一些其他元编程技术,例如可能更接近 LISP 宏的引用。

尤其是:

  • LISP 宏通常用于转换表达式(您可以获取 LISP 表达式并解释它或转换它然后执行它)。请注意,转换采用 LISP 表达式作为输入 - 另一方面,类型提供程序只能采用非常有限的参数(字符串、整数)。

  • 报价比较相似。它们可用于处理 F# 表达式 - 您可以将一段 F# 代码视为数据并对其进行解释或转换。转换采用 F# 表达式(的子集),但通常不执行它。

  • 类型提供程序纯粹用于生成类型。由于 LISP 是动态类型的,所以这并不是您在 LISP 中遇到的问题。然而,它是一种代码生成(您当然可以在 LISP 中进行的一种元编程形式)。

于 2012-08-24T20:55:10.327 回答
7

F# 类型提供程序的一个有趣方面是它们不仅在编译时工作,而且在设计时工作,也就是说,以与完整 IDE 工具交互的方式工作。类型提供程序提供来自外部模式化数据源的“类型”,但实现机制还支持许多 IDE 工具,包括 IntelliSense(标识符自动完成)、文档、数据工具提示等。结合交互式 REPL,这提供了简单的探索不熟悉的数据集的方式与任何其他语言的体验都不完全一样。

于 2012-08-25T00:08:37.720 回答
6

我不熟悉 Lisp 宏,但宏通常用于元编程(以节省输入和向语言添加控制结构)。另一方面,类型提供程序为外部数据源生成强类型 API。

除了它们共同的编译时“扩展”之外,我想不出任何东西。

于 2012-08-24T20:39:37.580 回答
6

F# 类型提供程序是编译时代码生成的一种非常特殊的情况,即它们旨在通过编译时代码生成来解决特定类型的问题。它们允许您在编译时生成新类型。

LISP 宏是一种更通用的元编程方法,因此可以满足许多用例。宏基本上将输入作为 S-expression (代码或数据)并发出其他 S-expression 。

因此,可以使用宏轻松实现类型提供程序,而使用类型提供程序无法涵盖“宏可以做什么”的全部范围。

于 2012-08-26T09:53:18.963 回答