2011-11-13 40 views
1

我正在使用Yojson库,并且所用的构造函数之一被称为`Bool(带反引号)。我使用的是使用camlp5的OCaml源代码,以便反引号包围的文本以不同的方式进行解释(例如将文本转换为OCaml数据结构)。不能在术语名称中使用反引号作为反引号引号被camlp5使用(OCaml)

我遇到的问题是,当Bool出现在我的源代码中时,camlp5/OCaml正在看到反向并认为它是引用的开始,导致错误。我怎样才能确保这被解释为一个`Bool OCaml术语呢?有没有办法暂时关闭campl5的功能?某种我可以使用的转义字符?

+2

'Bool是OCaml针对多态变体的标准符号,Camlp5正确支持该符号。你的问题一定是别的。 –

+0

谢谢。任何提示可能是什么?我的代码通过启动OCaml新鲜而正常工作。当我加载我正在使用的项目的代码时,Bool符号停止工作。该项目允许使用反引号引用文本作为特殊符号。我猜是通过Camlp5。 – maltbar

+4

maltbar,提供一些最小可重现的例子,否则我们将难以猜测解决方案。我的猜测 - 一些语法扩展被打破。 – ygrek

回答

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