-let a:Nat; d:Nat; c:Nat; b:Nat;
Hmmm Je crois que le lexer traite "a:Nat" comme un seul token. IOW il faut des espaces autour de ":".
-let odd: (int -> int);
Et, si j'ai réussi à définir les précédences correctement, la ligne ci-dessus peut s'écrire sans parenthèses.
+(* Evaluation reduce an expression x to an Lexp.Imm *) +let rec eval lxp ctx: (lexp * runtime_env) =
Le résultat de "eval" devrait être une valeur fermée (i.e. qui n'a pas de variable libre), donc il devrait être inutile de renvoyer le "runtime_env" ici.
D'autre part, Les valeurs renvoyées ne seront pas toutes des "Lexp.Imm" (aka des Sexp).
Normalement, on définit un nouveau type (genre "Value") qui est une sorte de sous-ensemble de Lexp (i.e. il va inclure un cas Imm pour inclure les Sexp, mais il aura aussi des constructeurs pour les fermetures, les objects inductifs, ...).
Stefan