我正在使用 Yojson 库,使用的构造函数之一称为“Bool”(带有反引号)。我正在使用使用camlp5 的OCaml 源代码,以便对反引号包围的文本进行不同的解释(例如,将文本转换为OCaml 数据结构)。
我遇到的问题是,当 `Bool 出现在我的源代码中时,camlp5/OCaml 看到反引号并认为它是引号的开头,从而导致错误。如何确保这被解释为“Bool OCaml 术语”?有什么方法可以暂时关闭 campl5 的功能吗?我可以使用某种转义字符?
由于您使用的是覆盖反引号行为的语法扩展,因此您不能在同一文件中使用像 `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。翻译是有成本的,但如果是你的情况,你应该选择修改语法扩展。