F#类型提供程序与Lisp宏

15

我一直在阅读有关F# 3.0类型提供程序(例如这里)的资料,看起来它们基于一种编译时代码生成。 在这方面,我想知道它们与Lisp宏的比较。 似乎F#3.0类型提供程序和Lisp宏都允许用户在编译时执行代码,并引入新类型以供编译器使用。 有人能否解释一下其中的问题和涉及到的细节?

4个回答

12

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

具体而言:

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

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

  • 类型提供程序纯粹用于生成类型。由于LISP是动态类型语言,这实际上不是您在LISP中遇到的问题。但是,这是一种代码生成(一种可以在LISP中执行的元编程形式)。


1
似乎Lisp宏的最大优势是编译时执行,而引用则没有。F#没有类似的功能,对吗? - Daniel
3
@Daniel - 我认为类型提供程序(TP)和引用(Q)是宏的两个极端方向。 Q允许表达式操作,但不支持编译时执行。 TP不支持表达式操作,但支持编译时执行(生成类型)。 - Tomas Petricek
然而,LISP宏不支持编译时执行,它们在运行时进行评估,但使用动态类型更容易。 - Tomas Petricek
6
LISP宏允许在编译时执行。基本上,在宏被扩展时,您可以执行任何代码,即整个语言对您开放。例如,嵌入代码中的“编译日期时间”可以完成。 - Ankur
3
@TomasPetricek,什么?Lisp宏只在编译时执行,除非你在运行时编译某些内容。而类型与宏展开完全无关(例如Nemerle,MetaOCaml甚至Template Haskell都是如此)。 - SK-logic

7
F#类型提供程序的一个有趣方面是它们不仅在编译时工作,而且在设计时也可以与完整的IDE工具进行交互。类型提供程序从外部模式化数据源提供“类型”,但实现机制还包括许多IDE工具,包括智能感知(标识符自动完成)、文档、数据工具提示等。结合交互式REPL,这为以一种其他语言无法实现的方式轻松探索陌生数据集提供了便利。

3
宏也可以实现这个功能。如果你定义了一个宏,你的Lisp IDE可以为你提供智能提示和参数提示,还会展示中间展开式。文档仍然可以使用。这并不是说这个功能不好,但它对问题中“vs.”两侧都可用。 - Inaimathi
@Inaimathi:有这样的IDE指针吗?我很想试试它 - 到目前为止,我是以最简单的方式(编辑,通过slime发送到repl,运行)来进行LISP。 - ttsiodras
@ttsidoras - 当你的系统加载完成时,Emacs+SLIME会在迷你缓冲区中给出提示。我相信LispWorks也有类似的功能,但我没有使用过它。 - Inaimathi

7
F#类型提供程序是编译时代码生成的一种非常特定的情况,即它们旨在通过编译时代码生成来解决特定类型的问题。它们允许您在编译时生成新类型。
LISP宏是元编程的更通用方法,因此适用于许多用例。宏基本上将输入作为S表达式(代码或数据)并发出其他S表达式。
因此,可以轻松地使用宏实现类型提供程序,而对于类型提供程序无法涵盖“宏可以做什么”的整个范围。

1
“Type provider可以很容易地使用宏来实现” - 但可能并不那么简单和直接。我认为会有一些有趣的问题:1)类型提供程序根据调用者代码访问时按需生成类型。这可能可以使用宏实现(?),但它不再是expr-> expr转换;2)类型提供程序不仅是编译器功能。其积极体验是IDE体验的一个重要组成部分,后者依赖于类型,我不确定在LISP世界中是否有直接等效物(同样,这在某些方面是可行的,但可能不太容易)。 - Tomas Petricek
@TomasPetricek:类型提供程序在静态类型语言中更有意义,而在像Lisp这样的动态类型语言中则不太合适。在Lisp中,创建“函数提供程序”即宏创建Lisp代码以代理调用远程Web服务的函数是有意义的。 - Ankur

6
我不熟悉Lisp宏,但通常情况下,宏用于元编程(以节省打字并向语言中添加控制结构)。另一方面,类型提供程序为外部数据源生成强类型API。除了编译时的“展开”之外,我想不到任何共同点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接