F#类型提供程序与Lisp宏

Mar*_*tus 15 lisp macros f# metaprogramming type-providers

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

Tom*_*cek 11

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

特别是:

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

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

  • 类型提供程序纯粹用于生成类型.由于LISP是动态类型的,因此这不是您在LISP中遇到的问题.但是,它是一种代码生成(元编程的一种形式,你当然可以在LISP中做).

  • @TomasPetricek:LISP宏确实允许编译时执行.基本上,当宏扩展时,您可以执行任何代码,即您可以使用整个语言.例如,可以在代码中嵌入"编译日期时间" (6认同)
  • @TomasPetricek,什么?除非您在运行时编译某些内容,否则Lisp宏仅在编译时执行.键入*完全*与宏扩展无关(例如,参见Nemerle,MetaOCaml甚至模板Haskell). (3认同)
  • @Daniel - 我猜类型提供程序(TP)和引用(Q)是宏的两个极端方面.Q允许表达式操作,但不支持编译时执行.TP不支持表达式操作,但支持编译时执行(导致生成的类型). (2认同)

Bri*_*ian 7

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

  • 嗯.宏也这样做.如果您定义一个宏,您的Lisp IDE可以为您提供关于它的智能感知和参数提示,并向您展示中间扩展.文档也仍然有效.并不是说它不酷,但问题的两个方面都可用于`vs`. (3认同)

Dan*_*iel 6

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

除了编译时间"扩展"之外,我无法想到它们的共同点.


Ank*_*kur 6

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

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

因此,类型提供程序可以使用宏轻松实现,而您无法覆盖类型提供程序的"宏可以做什么"的整个范围.