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 : 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 
*)
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 : 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 ?