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.
Ensuite, il suffit de jouer avec l'introspection pour invoquer les méthodes, et de caster le résultat...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 *)
mais pour le moment, impossible de caster ^^
Code : Sélectionner tout - Visualiser dans une fenêtre à part 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 ?
Partager