> 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