paramétrer un module par un autre module
Salut,
J'ai signalé dans un post précédent que je chercherais à paramétrer un module (environment) par un autre module (structure interne quelconque ayant une interface à la Hashtbl)
je suis parti sur la création d'une classe avec des méthodes statiques que je devrais surcharger.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
#light
#nowarn "62"
/// static type to represent any Hashtab-like type
type ('a,'b) IHashtab() =
static member create (i : int) : ('a,'b) IHashtab = IHashtab<'a,'b>()
static member add (m : ('a,'b) IHashtab) (key:'a) (value:'b) : unit = raise Not_found
static member replace (m : ('a,'b) IHashtab) (key:'a) (value:'b) : unit = raise Not_found
static member find (m : ('a,'b) IHashtab) (key:'a) : 'b = raise Not_found
static member iter (f : 'a -> 'b -> unit) (m : ('a,'b) IHashtab) : unit = ()
static member remove (m : ('a,'b) IHashtab) (key:'a) : unit = raise Not_found
exception Not_found
/////////////////////
open Ihashtab
open System.Reflection
type environment = IHashtab<string,valeur>
type 'a Environment() =
inherit IHashtab<string,valeur>()
static member create i : environment =
let typeA = typeof<'a>
let methodA = typeA.GetMethod("create")
methodA.Invoke(null,[|i|])
(*
static member find (env : environment) (v : string) : valeur = 'a.find env v
static member iter f (env : environment) = 'a.iter f env
static member add (env : environment) v val_expr = 'a.add env v val_expr
static member replace (env : environment) v val_expr = 'a.replace env v val_expr
static member assign (env : environment) (v : string) (val_expr : valeur) =
try
let _ = find env v
replace env v val_expr
with Not_found ->
add env v val_expr
*) |
Ensuite, il suffit de jouer avec l'introspection pour invoquer les méthodes, et de caster le résultat...
mais pour le moment, impossible de caster ^^
Code:
Error 1 Type constraint mismatch. The type obj is not compatibile with type environment.
ça me semble être une bonne approche pour garder l'aspect "module"
qu'en dites-vous ?