Précédent Index Suivant

3.4   Environnement de typage

L'environnement de typage, nécessaire lors du typage pour les variables libres (comme les primitives ou les paramètres formels) d'expressions est représenté par une liste d'association (string * quantified_type) list.

Il est nécessaire de faire une distinction entre les variables d'un type si elles sont quantifiées (variables liées) ou si elles ne le sont pas (variables libres).

let rec vars_of_type t =
* let rec vars vl = function
* Const_type ® vl
* Var_type (ref (Unknown n)) ® if mem n vl then vl else n::vl
* Var_type (ref (Instanciated t)) ® vars vl t
* Pair_type (t1,t2) ® vars (vars vl t1) t2
* List_type t ® vars vl t
* Fun_type (t1,t2) ® vars (vars vl t1) t2
* in
* vars [  ] t
* ;;
* vars_of_type : ml_type ® int list = áfunñ

Pour calculer les variables libres et liées d'un schéma de type,

let free_vars_of_type (bv,t) =
* subtract (vars_of_type t) bv
* and bound_vars_of_type (fv,t) =
* subtract (vars_of_type t) fv
* ;;
* free_vars_of_type : int list * ml_type ® int list = áfunñ
* bound_vars_of_type : int list * ml_type ® int list = áfunñ let append l1 l2 = l1@l2;;
* append : a list ® a list ® a list = áfunñ let flat ll = list_it append ll [  ];;
* flat : a list list ® a list = áfunñ let free_vars_of_type_env l =
* flat ( map (function (id,Forall gvt) ® free_vars_of_type gvt) l)
* ;;
* free_vars_of_type_env : (a * quantified_type) list ® int list = áfunñ

Lors du typage d'un identificateur dans un environnement C, le vérificateur cherche dans l'environnement le type quantifié associé à cet identificateur et en retourne une instance, où les variables quantifiées valent de nouvelles variables (ou inconnues).

let type_instance st =
* match st with Forall(gv,t) ®
* let unknowns = map (function n ® n,new_unknown()) gv
* in
* let rec instance = function
* Var_type (ref(Unknown n)) as t ® (try assoc n unknowns with Not_found ® t)
* Var_type (ref(Instanciated t)) ® instance t
* Const_type ct as t ® t
* Pair_type (t1,t2) ® Pair_type (instance t1, instance t2)
* List_type t ® List_type (instance t)
* Fun_type (t1,t2) ® Fun_type (instance t1, instance t2)
* in
* instance t
* ;;
* type_instance : quantified_type ® ml_type = áfunñ


Précédent Index Suivant