将OCaml转换为F#:将OCaml报价添加和报价扩展器转换为F#

Guy*_*der 4 f# ocaml

我正在将基于OCaml的几个模块转换为F#,并且遇到报警扩展器的OCaml''Quotation.add''编译器指令.

引用扩展器是用OCaml编写的函数.调用Camlp4库函数''Quotation.add''添加了引用扩展器.

Camlp4 - 教程,Ch.3

在F#书籍,F#网站,谷歌和这里搜索引用扩展器和''Quotation.add''编译器指令之后,我得到的答案是否定的.

有人可以确认F#不支持OCaml''Quotation.add''编译器指令的概念或OCaml报价扩展器的概念.

编辑

注意:我刚刚了解到Camlp4是OCaml的预处理器 - 漂亮的打印机,当我提出这个问题时,我认为它是OCaml的独立库.现在它是有道理的.

Tom*_*cek 10

你是对的 - camlp4库不适用于F#,所以我担心你需要使用另一种方法来重新实现F#中所需的功能.

通常,您可以使用F#中的一些相关技术(但是如果不了解具体问题,很难判断它们中的任何一个是否对您有用):

  • F#Quotations允许您操作F#代码,但编译能力有限(很好,即将F#转换为SQL,JavaScript或GPU)
  • F#CodeDom(来自F#PowerPack)允许您使用F#编译器生成代码并进行编译,但您可以生成代码作为文本或使用.NET面向对象的样式.
  • T4 Templating是一个.NET模板机制,虽然上次我检查过,它不支持F#(但我认为Mono版本可能有效)
  • F#Type Providers(感谢kvb)可以通过F#插件为编译器生成类型.这会处理你使用camplp4生成某些类型以便稍后使用的情况(即来自较短的规范),但是如果你需要生成一些代码,它们的用途有限

  • 如果定位F#3.0是一种选择,那么类型提供者也可能是有意义的. (3认同)