2017-08-03 5 views
0

Par exemple, je veux charger dynamiquement les fichiers suivants dans mon programme et imprimer le résultat.Comment évaluer dynamiquement un morceau de code OCaml dans le programme OCaml?

input1.txt -> imprimer 100

let x = 10 in x * x 

input2.txt -> imprimer 3

let x = 1 and y = 2 in x + y 

input3.txt -> imprimer 4

let ls = [1;2;3;4] in List.length ls 

ocaml_plugin pourrait être utile à ce projet. Je voudrais savoir plus de détails sur la façon de l'implémenter. Merci!

+0

Pouvez-vous expliquer pourquoi vous voulez faire cela? – Drup

+0

Je construis ma propre calculatrice graphique d'exécution. Un noeud de base est une expression OCaml, par exemple, 'a = let x = 100 dans x * x'. Un nœud peut être une formule d'autres nœuds, par exemple 'b = a * a'. Un nœud de base peut prendre n'importe quelle expression OCaml autonome. Après la modification de l'entrée d'un nœud de base, tous les nœuds qui en dépendent seront réévalués. –

Répondre

2

La partie pertinente dans le manuel de référence OCaml est le chapitre sur le dynlink library (un tutoriel peut être trouvé here). ocaml_plugin fournit un wrapper autour de cette bibliothèque et compile votre code automatiquement.

Sinon, vous devez compiler avant de les charger vos fichiers dans .ml.cmo fichiers avec dynlink, soit avant ou en appelant le compilateur de votre programme (ou, être aventureux, directement par le compiler front-end). Dans vos exemples, il semble y avoir un modèle commun (c'est-à-dire, une fonction qui ne prend aucun argument et renvoie un entier) et on peut définir une interface autour de cela.