我有一个标签列表:
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 :(得分:4)
假设你想要做的是在程序执行时构建一个名为string list
的模块,
简答:不,OCaml是一种静态类型语言,在程序执行时无法构建新的变量名。
更长的答案:您可以使用元编程:使用您想要的名称构建源代码然后编译它并动态链接已编译的模块。但这根本不是使用OCaml的常规方法。另外,看看你的环境,OCaml(或Reason)输出Js代码,你可能需要将一个OCaml(或Reason)编译器编译成Js,这很难,应该避免。
结论:不,你不能。