1

我正在使用 Yojson 库,使用的构造函数之一称为“Bool”(带有反引号)。我正在使用使用camlp5 的OCaml 源代码,以便对反引号包围的文本进行不同的解释(例如,将文本转换为OCaml 数据结构)。

我遇到的问题是,当 `Bool 出现在我的源代码中时,camlp5/OCaml 看到反引号并认为它是引号的开头,从而导致错误。如何确保这被解释为“Bool OCaml 术语”?有什么方法可以暂时关闭 campl5 的功能吗?我可以使用某种转义字符?

4

1 回答 1

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。翻译是有成本的,但如果是你的情况,你应该选择修改语法扩展。

于 2012-02-19T17:09:28.197 回答