将OCaml转换为F#: 将OCaml引用添加和引用扩展器转换为F#

4
我正在将基于OCaml的几个模块转换为F#,并遇到了OCaml“Quotation.add”编译器指令,用于引号扩展器。
引号扩展器是使用OCaml编写的函数。调用Camlp4库函数“Quotation.add”会添加引号扩展器。 Camlp4 - 教程,第3章 在F#书籍、F#网站、Google和这里搜索引号扩展器和“Quotation.add”编译器指令后,得到的答案是否定的。
有人可以确认F#不支持OCaml“Quotation.add”编译器指令或OCaml引号扩展器的概念吗?
编辑
注意:我刚学到Camlp4是OCaml的预处理器-漂亮打印程序,当我提出问题时,我认为它是OCaml的一个单独的库;现在它有意义了。

3
你说得对 - campl4库不适用于F#,所以恐怕您需要使用另一种方法在F#中重新实现所需的功能。您能分享一下您要转换的函数的更多细节吗? - Tomas Petricek
我认为这是一个相当基本的答案,但我添加了一些更多的指针,可能会对您或其他读者有用。 - Tomas Petricek
@TomasPetricek 这可能是一个基本的答案,但知道它不存在可以让我省去很多寻找不存在东西的工作。正如我们所知,有些人不看注释。谢谢。 - Guy Coder
1个回答

10

你说得对 - camlp4库不可用于F#,所以恐怕您需要使用另一种方法在F#中重新实现所需的功能。

通常情况下,有几个相关技术可以从F#中使用(但是如果不了解特定问题,很难确定其中任何一个是否有用):

  • F#引用允许您操纵F#代码,但编译能力有限(例如将F#转换为SQL、JavaScript或GPU等)
  • F# CodeDom(来自F# PowerPack)允许您生成代码并使用F#编译器进行编译,但您只能生成文本代码或使用.NET面向对象风格。
  • T4模板是一种.NET模板机制,但据我上次检查,它不支持F#(但我认为Mono版本可能有效)
  • F#类型提供程序(感谢kvb)通过F#插件为编译器生成类型。这处理了您正在使用camplp4生成一些稍后使用的类型的情况(例如来自较短规范),但如果您需要生成一些代码,则它们只有有限的用途

3
如果可以选择针对 F# 3.0,那么类型提供程序可能也会引起兴趣。 - kvb

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