2016-06-12 10 views
0

Ich habe eine Liste von Tags:OCaml dynamische Funktionsnamen

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

Kann ich ein Modul erzeugen, welche Funktionen mit diesen Tags als Namen enthält?

/* nicht die Syntax etwas dagegen, es ist Facebook die Vernunft (neue Schnittstelle zu 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|]; 

} 

Der Tag-Name eine Funktion im Modul werden soll ... Ist das möglich?

+0

Dies ist eine Art Tangente an die Frage, aber kennen Sie [Tyxml] (https://ocsigen.org/tyxml/manual/) (und die damit verbundene [js_of_ocaml Schnittstelle] (https://ocsigen.org /js_of_ocaml/2.7/api/Tyxml_js))? – Drup

+0

Nein, bin ich nicht. Ich werde es mir ansehen. Danke dafür! – Seneca

+0

Sie können jedoch eine Map oder eine Hashtabelle generieren, die Strings Funktionen zuordnet. – ivg

Antwort

4

Unter der Annahme, was Sie tun möchten, ist ein Modul mit Namen aus einer string list während der Programmausführung zu bauen,

Kurze Antwort: Nein, das ist OCaml eine statische typisierte Sprache und man kann nicht einen neuen Variablennamen während der Programmausführung bauen .

Längere Antwort: Sie können Meta-Programmierung verwenden: Erstellen Sie einen Quellcode mit Namen, die Sie wollen, dann kompilieren Sie es und verknüpfen Sie das kompilierte Modul dynamisch. Dies ist jedoch keine übliche Art, OCaml zu verwenden. Wenn Sie Ihre Umgebung, OCaml (oder Reason) ansehen, um Js-Code auszugeben, müssen Sie wahrscheinlich einen OCaml-Compiler (oder Reason-Compiler) für Js kompilieren, was schwierig ist und vermieden werden sollte.

Fazit: Nein, können Sie nicht.

+0

Ich befürchtete so viel. Danke für die Antwort! – Seneca