F#类型提供程序与Lisp的宏(F# Type Providers vs. Lisp macros)

2019-07-31 04:31发布

我一直在阅读有关F#3.0类型的供应商(如这里 ),似乎它们是基于一种编译时代码生成的。 在这方面,我想知道他们是如何与之比较的Lisp的宏。 这似乎是两个F#3.0型提供商和Lisp的宏允许用户代码在编译时执行,并介绍提供给编译器的新类型。 任何人都了解所涉及的问题和细微差别一些轻?

Answer 1:

有F#类型提供者和其他语言的元编程技术之间有一些重叠,但我与丹尼尔同意,他们没有很多共同点。 F#有这样也许更接近LISP宏语录一些其他的元编程技术。

特别是:

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

  • 语录更相似。 它们可以被用来处理F#表达 - 你可以把一块的F#代码,数据和解释它或改变它。 变换为(一个子集的)的F#的表达,但其通常不执行它。

  • 类型供应商是纯粹用来生成类型 。 由于LISP是动态类型,这是不是真的,你不得不在LISP的一个问题。 然而,这是一种代码生成(元编程,你可以在LISP肯定做的一种形式)的。



Answer 2:

F#类型提供的一个有趣的方面是,他们只在编译时无法正常工作,但在设计时 ,也就是,在与全IDE工具进行交互的方式。 类型提供者提供从外部模式化的数据源“类型”,但执行机构还使得大量IDE工具,包括智能感知(识别符自动完成),文档,数据提示等与交互式REPL相结合,这提供了容易勘探在一个方式,是不是很喜欢在任何其他语言的经验,不熟悉的数据集。



Answer 3:

我不熟悉Lisp的宏,但总体宏用于元编程(节省打字,并添加控制结构的语言)。 键入提供商,而另一方面,产生外部数据源强类型的API。

我想不出任何东西,除了编译时间“扩张”是他们的共同点。



Answer 4:

F#类型提供商编译时代码生成的一个非常特殊的情况,即他们是为了解决由于编译时代码生成特定种类的问题。 他们让你产生新的类型在编译时。

LISP宏是一个更通用的方法来元编程,因此迎合了很多的用例。 宏的基本上采取输入作为S-表达(代码或数据)并发射其它S-表达。

所以,一类供应商可以使用宏容易,但是你不能覆盖的“可以做什么宏”型供应商的整个范围内实施。



文章来源: F# Type Providers vs. Lisp macros