2010-10-31 72 views
4

標題可能有些誤導,所以讓我解釋一下我試圖達到的目標。OCaml中的註釋

我正在編寫一個編程語言,它有許多運算符可以處理具有不同行爲的多種類型。實施正在發展,運營商正在改變/適應我在嘗試使用時發現更有用的東西。

問題是如何保持語言文檔,實現和語言的內聯幫助(具有某種REPL)之間的一致性。由於大多數行爲都是在大模式匹配塊內部定義的,我想知道是否可能以某種方式(可能用Camlp4)註釋代碼,以便預處理運行可以提取txt文件(或任何類似csv,html,無論)列出所有實施的運營商。

我的意思是,如果我有像

match instruction with 
    Plus -> ... 
    | Minus -> ... 

我想有像

match instruction with 
    (* Plus, +, int -> int -> int, computes the sum *) 
    Plus -> ... 
    (* Minus, -, int -> int -> int, computes the difference *) 
    | Minus -> ... 

在註釋中的信息(我使用的註釋語法,只是使用的東西,我真的沒有從未使用過OCaml預處理器,所以我不知道它是如何工作的)在我編譯我的項目時被提取並保存在某處。

也許問什麼是不可能的,我必須分別處理與ocaml預處理器/編譯器本身不同的東西。

任何線索?

編輯:我舉一個具體的例子來說明我想做些什麼......

例如加號指令編譯寫在我的語言這樣的程序:

| Plus -> (fun s -> 
     let o2 = vm_pop s and o1 = vm_pop s in 
      (match o1, o2 with 
       Float f1, Float f2 -> vm_push s (Float (f1 +. f2)) 
      | Float f, Int i -> vm_push s (Float (f +. float i)) 
      | Int i, Float f -> vm_push s (Float (float i +. f)) 
      | Int i1, Int i2 -> vm_push s (Int (i1 + i2)) 
      | Complex c1, Complex c2 -> vm_push s (Complex (Complex.add c1 c2)) 
      | String str, v -> vm_push s (String (Printf.sprintf "%s%s" str (string_value_short v))) 
      | List l, a -> l := a :: !l; vm_push s (Types.I.List l) 
      | (Set c as set), a -> c := Types.ValueSet.add a !c; vm_push s set; 
      | w, w2 -> throw_exc2 "+" w w2 
     ); s 
    ) 

我希望能夠詮釋這個模式匹配的東西的每個條款都像

(* Plus, +, float -> float -> float, sum, computes the sum between two floats *) 
(* Plus, +, string -> any -> string, append, appends the string representation of the value *) 
(* etc *) 
在我能夠預處理我的源代碼的方式

,並建立一種Ø f所有已實施操作的列表及其類型和說明,僅從註釋中獲取。我不需要修改代碼中的任何內容。只需要在一個地方保持一致性,而無需以單獨的方式跟蹤所有可用的指令(因爲我需要爲文檔和聯機幫助編制索引)。

我想在不使用任何外部處理工具的情況下做到這一點,這就是爲什麼我會問在編譯階段是否有能夠處理註釋或類似內容的東西。

在此先感謝

+0

你能給我們可以編譯和運行更詳細的例子,這將重現你的問題? – gasche 2010-10-31 15:27:11

+0

你的例子中「+」和「 - 」的狀態是什麼?你打算註釋somewhow隱含聲明中綴運算符'(+)'和'( - )'在模式條款的休息嗎? – gasche 2010-10-31 15:27:47

回答

1

什麼你試圖做聽起來很像編程書籍,所以我要建議ocamlweb,即使它是一個外部工具。

在標準發行版中,有ocamldoc,如 Pascal suggested,但對源語法或輸出結果沒有太多控制。

隨着CamlP4(標準ocaml的預處理器),你可以改變詞法分析器可以訪問到的意見,但我不認爲這是很容易的。這是一個更容易添加到包含字符串或者一個字符串擴展報價模式語法的入口,所以你喜歡寫東西| <:casedoc<Plus, +, int -> int -> int, computes the sum>> Plus -> ...

3

你看看ocamldoc

雖然它通常是接收註釋的.mli文件。在你的情況下,你介意在instruction類型的定義下寫文檔嗎?像:

(** Comment for type weather *) 
type weather = 
| Rain of int (** The comment for construtor Rain *) 
| Sun (** The comment for constructor Sun *) 
+0

的問題是,運營商polimorphic所以每一個可能的指令將有5-10-15應單獨介紹不同的情況。我可以通過在.ml本身註釋源代碼來做到這一點:( – Jack 2010-10-31 12:22:31