- match expr with
- | Imm s -> Hashtbl.hash s
Je recommande d'ajouter une constante différente dans le hash pour chaque constructeur. e.g.:
| Imm s -> 42 lxor (Hashtbl.hash s)
((apply_lxor (List.map (fun e -> let (n, lp, lt) = e in
Tu peux utiliser List.fold_(left|right) au lieu de `apply_lxor + List.map`, ça évite la création d'une liste intermédiaire.
+(* | Susp (lp, subst) -> (lexp_hash lp) lxor (Hashtbl.hash subst) *)
Il faudra définir un subst_hash et faire le hash_consing des substitutions (c'est aussi un des buts de cette réécriture).
let equal x y = (compare x y = 0)
let hash = Hashtbl.hash
let hash = lexp_hash
Il faudra aussi utiliser une autre fonction d'égalité que celle prédéfinie par OCaml. Cependant, il faudra faire attention que ce soit une fonction d'égalité qui obéit aux besoin de la table de hachage, i.e.
e1 "egal" e2 => lexp_hash e1 == lexp_hash e2
- -> SLlub (e1, e2)
- -> SLlub ((e1, lexp'_hash e1), (e2, lexp'_hash e2))
Soit tu t'arranges pour que `e1` et `e2` soient des `lexp` soit tu utilises `hc` pour les (re)convertir en `lexp`. Il ne faudra jamais construire de telles paires à la main: toujours passer par `hc`.
let mkSLsucc e = match e with | SortLevel _ | Var _ | Metavar _ | Susp _
- -> SLsucc e
- -> SLsucc (e, lexp'_hash e) | _ -> Log.log_fatal ~section:"internal" "SLsucc of non-level "
Ici je pense qu'il est préférable de faire `match lexp_to_lexp' e with` et donc garder `e` comme ayant type `lexp` plutôt que `lexp'`.
Stefan