2017-08-08 5 views
1

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?

+1

Pourquoi des types arbitraires? Sûrement le 'f' dans votre programme principal a un type de résultat attendu? – Bergi

+0

La calculatrice veut afficher le résultat du calcul. Tous les types de pervasive peuvent être imprimés comme une chaîne. –

+0

GADT pourrait être un moyen d'ajouter un support pour quelques types. –

Répondre

2

GADT (Type de données algébriques généralisées) à sauver.

Bien que GADT existe depuis longtemps, c'est un sujet relativement nouveau dans OCaml. Cela aide beaucoup à écrire des bibliothèques génériques dans OCaml en toute sécurité.

module Value = struct 
    type 'a t 

    module Packed = struct 
    type 'a unpacked = 'a t 
    type t = T : 'a unpacked -> t 
    end 

end 

Value.Packed.t est un type de données compressé que nous voulons. Théotiquement, tout type de données 'a peut être emballé.