由于camlp5(OCaml)正在使用反引号,因此无法在术语名称中使用反引号

时间:2011-11-13 22:22:07

标签: ocaml camlp4

我正在使用Yojson库,其中一个使用的构造函数叫做Bool(带有反引号)。我正在使用OCaml源码,其中使用了camlp5,因此反引号包围的文本被不同地解释(例如,文本被转换为OCaml数据结构)。

我遇到的问题是,当我的源代码中出现`Bool时,camlp5 / OCaml正在看到反引号并认为它是引用的开头,导致错误。我怎样才能确保将其解释为`Bool OCaml术语?有没有办法暂时关闭campl5的功能?我可以使用某种逃避角色吗?

1 个答案:

答案 0 :(得分:3)

由于您使用的语法扩展会覆盖反引号的行为,因此您无法在同一文件中使用类似`Bool的多态变体。

我建议您首先更改语法扩展名以使用与反引号不同的字符。为什么不以%%为例?

另一种解决方案很简单,但更详细:使用两个不同的文件,一个不使用语法扩展,另一个使用语法扩展。

在第一个文件(没有语法扩展名)中,您定义了一个类型与Yojson中使用的类似的类型,以及从多态变体转换为多态变体的函数:

type t = 
 | Bool of ...
 | ...

let to_yojson x = 
  match x with
   | Bool v -> `Bool v
   | ...

let from_yojson x =
  match x with
   | `Bool v -> Bool v
   | ...

这样,您可以使用语法扩展在代码中操作此新类型,而无需使用反引号,然后使用转换函数调用Yojson。翻译需要付费,但如果是这种情况,则应选择修改语法扩展名。