Je retourne un environnent car eval est aussi utilisée pour ajouter des définitions.
Je ne comprends pas exactement ce que cela signifie. Eval prend une Lexp, et une Lexp peut utiliser des définitions locales, mais elles n'existent pas à l'extérieur de cette Lexp, donc l'évaluation ne peut pas "ajouter des définitions".
Peut-être que tu veux une manière d'évaluer une *déclaration* (i.e. une de ces choses qui apparaissent au top-level d'un fichier, ou entre le "let" et le "in"), auquel cas il faudrait définir une nouvelle fonction `eval_decl` qui prend un argument qui est une déclaration (plutôt qu'un Lexp).
a = lambda x -> x + x
Est-ce que j'aurais du utiliser la liste de myers que j'ai construite pendant le lexp parsing comme environnement ?
Je ne sais pas de quelle liste de Myers tu parles (on en construit tout plein pendant le parsing d'une lexp). L'environnement de l'évaluateur devrait avoir un type du genre `Value myers`, qui est donc différent du type de l'environnement utilisé pendant le "lparse".
case x | z ->
Nous n'avons pas l'information nécessaire pour savoir si z est un constructeur sans argument ou si z est une variable.
En effet. C'est un des choix de design du langage dont je te parlais l'autre jour: pour ne pas avoir à décider quels symboles Unicode sont majuscules ou minuscules, Typer n'a pas de règle lexicale pour distinguer les constructeurs et les variables.
Donc à la place il faut regarder dans le contexte s'il existe un constructeur qui a ce nom (ou plus spécifiquement, une variable qui a ce nom et qui est définie comme un constructeur), et si oui, présumer que le code fait référence à ce constructeur.
Cette solution est aussi utilisée par Standard ML.
Sinon, il faudrait introduire une syntaxe supplémentaire pour distinguer les variables des constructeurs.
En ce moment, je suis entrain de déboguer la fonction suivante:
tonum = lambda x -> case x | (succ y) => (1 + (tonum y)) | _ => 0;
(tonum x);
L'évaluation de tonum est bloqué à l'évaluation de y.
[ les parenthèses autour de (succ y), de (tonum y), et de (1 + (tonum y)) ne devraient pas être nécessaires. ]
Je ne pense pas avoir le temps d'y jeter un coup d'œil à court terme, malheureusement,
Stefan