2016-06-12 17 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コードを出力する環境を見てみると、OCaml(またはReason)コンパイラをJsにコンパイルする必要があります。これは難しく避けるべきです。

結論:いいえ、できません。

+0

私は同じくらい恐れていました。答えをありがとう! – Seneca