2011-11-13 37 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。翻譯有成本,但如果是這種情況,您應該選擇修改語法擴展。