J'utilise ocaml_plugin pour écrire une calculatrice capable d'évaluer des expressions OCaml lors de l'exécution.Interface de types arbitraires pour OCaml Plugin
Ceci est mon interface de plugin.
open Ocaml_plugin.Std
module type S = sig
val f : unit -> float
end
let univ_constr : (module S) Ocaml_dynloader.Univ_constr.t =
Ocaml_dynloader.Univ_constr.create()
Je suis en mesure de charger des fonctions avec la signature unit -> float
, par exemple,
let f() = 3.14159
let f() = 1.5 *. 1.5 *. 3.
et appel f() dans le programme principal d'évaluer l'expression dans le corps de la fonction. Cependant, il ne supporte que le type float.
Que dois-je faire si je veux qu'il prenne en charge int? Time.t? Ou tout type OCaml arbitraire dans Pervasive?
let f() = List.length [1;2;3] (* int *)
let f() = Time.now() (* Time.t *)
let f() = "hello world!!!" (* string *)
Pour évaluer à l'exécution, ocaml_plugin semble être la seule solution. Cependant, pour que le chargeur/compilateur sache ce qui est chargé dynamiquement, je dois écrire une interface. Comment dois-je changer le fichier d'interface pour qu'il prenne en charge d'autres types?
Pourquoi des types arbitraires? Sûrement le 'f' dans votre programme principal a un type de résultat attendu? – Bergi
La calculatrice veut afficher le résultat du calcul. Tous les types de pervasive peuvent être imprimés comme une chaîne. –
GADT pourrait être un moyen d'ajouter un support pour quelques types. –