2016-06-12 73 views
0

我的標籤列表:OCaml的動態函數名

let tags = ["div", "h1", "p"] 

我可以生成包含這些標籤的名稱功能模塊?

/*不介意的語法,這是Facebook的原因(新接口ocaml的)*/

let module DOM = { 
    let div props children => Js.Unsafe.fun_call 
     (Js.Unsafe.get dom (Js.string "div")) [|Js.Unsafe.inject props, Js.Unsafe.inject children|]; 
    let h1 props children => Js.Unsafe.fun_call 
     (Js.Unsafe.get dom (Js.string "h1")) [|Js.Unsafe.inject props, Js.Unsafe.inject children|]; 
let p props children => Js.Unsafe.fun_call 
     (Js.Unsafe.get dom (Js.string "p")) [|Js.Unsafe.inject props, Js.Unsafe.inject children|]; 

} 

標籤名稱應該成爲模塊中的功能... 這可能嗎?

+0

這是一個問題的切線,但你是否知道[tyxml](https://ocsigen.org/tyxml/manual/)(和相關的[js_of_ocaml接口](https://ocsigen.org) /js_of_ocaml/2.7/api/Tyxml_js))? – Drup

+0

不,我不是。我會看看它。感謝你! – Seneca

+0

但是,您可以生成映射或散列表,將字符串映射到函數。 – ivg

回答

4

假設你想要做的是從一個string list建立與名稱的模塊,而程序運行,

簡短的回答:不,OCaml的是靜態類型語言,你不能建立,同時程序執行一個新的變量名。

較長的答案:你可以使用元編程:用你想要的名字構建一個源代碼然後編譯它並動態鏈接編譯後的模塊。但這根本不是使用OCaml的常規方式。另外,查看你的環境,OCaml(或Reason)輸出Js代碼,你可能需要爲Js編譯一個OCaml(或Reason)編譯器,這很難並且應該避免。

結論:不,你不能。

+0

我很擔心。感謝你的回答! – Seneca