r_index
/
- [4] Nat = [..]
- [3] a = [..] r_index r_offset
- [2] b = [..] \ /
- [1] zero = Nat [..] || Nat DBI = 4 - 1 = 3 (zero, a, b)
- [0] one = Nat [..] || Nat DBI = 4 - 0 = 4
|| Zero DBI = 1
Dans le cas d'une récursion j'ai besoin de repérer les variables libres pour les push dans le contexte de la lambda.
Non. Si tu as
a : <type1> b : <type2> c : <type3> a = <exp1> b = <exp2> c = <exp3>
alors a, b, et c sont tous les trois placés dans le même `let` et <exp1>, <exp2>, et <exp3> utilisent le même environnement (celui qui contient a, b, et c (plus tout ce qui vient avant)).
Cela est vrai indépendemment des variables libres de a, b, et c.
Cette étape va être faite deux fois, une fois pendant le lexp parsing pour déterminer l'index et une fois pendant l'évaluation pour créer le contexte de la lambda.
Non, pour l'évaluateur, un let récursif comme notre `Let` s'interprète généralement de la manière suivante:
newenv = append ([ERROR, ERROR, ERROR], oldenv) (nth 0 newenv) := eval exp1 newenv (nth 1 newenv) := eval exp2 newenv (nth 2 newenv) := eval exp3 newenv
Stefan