我一直在阅读关于F#3.0类型提供程序(例如here),它们似乎基于一种编译时代码生成。在这方面,我想知道他们如何与Lisp宏进行比较。似乎F#3.0类型提供程序和Lisp宏都允许用户代码在编译时执行并引入编译器可用的新类型。任何人都可以对这个问题和细微差别有所了解吗?
答案 0 :(得分:11)
F#类型提供程序与其他语言的元编程技术之间存在一些重叠,但我同意Daniel的看法并不相同。 F#还有其他一些元编程技术,比如引用可能更接近LISP宏。
特别是:
LISP宏通常用于转换表达式(您可以使用LISP表达式并解释或转换它然后执行它)。请注意,转换将LISP表达式作为输入 - 另一方面,类型提供程序只能使用非常有限的参数(字符串,整数)。
报价更相似。它们可用于处理F#表达式 - 您可以将一段F#代码视为数据并对其进行解释或转换。转换采用(一个子集)F#表达式,但它通常不执行它。
类型提供程序仅用于生成类型。由于LISP是动态类型的,因此这不是您在LISP中遇到的问题。但是,它是一种代码生成(一种元编程形式,你当然可以在LISP中进行)。
答案 1 :(得分:7)
F#类型提供程序的一个有趣的方面是它们不仅在编译时工作,而且在设计时工作,也就是说,它以与完整IDE工具交互的方式工作。类型提供程序从外部模式化数据源提供“类型”,但实现机制还支持许多IDE工具,包括IntelliSense(标识符自动完成),文档,数据工具提示等。结合交互式REPL,这提供了简单的探索不熟悉的数据集,其方式与任何其他语言的体验不同。
答案 2 :(得分:6)
我不熟悉Lisp宏,但宏通常用于元编程(以节省输入并为语言添加控制结构)。另一方面,类型提供程序为外部数据源生成强类型API。
除了他们共同的编译时间“扩展”之外,我无法想到任何事情。答案 3 :(得分:6)
F#类型提供程序是编译时代码生成的一个非常具体的例子,即它们旨在通过编译时代码生成来解决特定类型的问题。它们允许您在编译时生成新类型。
LISP宏是一种更通用的元编程方法,因此可以满足很多用例。宏基本上将输入作为S表达式(代码或数据)并发出其他S表达式。
因此,类型提供程序可以轻松地使用宏实现,而您无法覆盖类型提供程序的“宏可以做什么”的整个范围。