Je me souviens plus pourquoi que l'on voulait utiliser une liste de Meyers ?
Pour que l'accès aux variables dans l'environnement soit O(log N) au lieu de O(N).
Il me semblait que l'on avait dit que
let a = b, c = d in
devient
let a = b in let c = d in
Nous n'avons donc pas besoin que Lexp.Let(location * (vdef * lexp * ltype) list * lexp) et nous pouvons utiliser location Lexp.Let(location * (vdef * lexp * ltype)
- lexp) à la place.
Non, parce qu'il y a aussi le cas
let odd : int -> int; even : int -> int; odd n = case n | 0 => false | S n' => even (n'); even n = case n | 0 => true | S n' => odd (n'); in <exp>
qui ne peut pas se décomposer.
Je vais créer un type temporaire Lexp.UnknownType(loc) pour remplacer les types qui ne sont pas encore inféré
OK. Sinon tu peux aussi simplement utiliser type_int.
Est-ce bien un exemple correcte d'un let dans typer ?
let a::Nat, a = b in
Presque. L'annotation de type utilise ":" plutôt que "::" et le séparateur entre déclarations est ";" plutôt que ",".
Stefan