use fresh variables

This commit is contained in:
Mylloon 2023-12-18 19:26:12 +01:00
parent 13efd4ad65
commit 709ad1f43f
Signed by: Anri
GPG key ID: A82D63DFF8D1317F

View file

@ -344,6 +344,8 @@ let translate (p : S.t) env =
| S.LChar c -> T.LChar c
and identifier (S.Id x) = T.Id x
and function_identifier (S.Id x) = T.FunId x
and old_env = make_fresh_variable ()
and curr_env = make_fresh_variable ()
(* Ici, on rajoute notre fonction anonyme dans la liste des
définitions de fonctions *)
and add_liste_funcdef env fid x expr =
@ -356,7 +358,7 @@ let translate (p : S.t) env =
in
List.fold_right aux dfs ([], expr)
in
dfs @ [ T.DefineFunction (fid, T.Id "oldenvironment" :: x, expr) ]
dfs @ [ T.DefineFunction (fid, old_env :: x, expr) ]
(* Traitement des fonctions anonymes *)
and fonction_anonyme ?name ?block env f x e =
(* On commence par générer de nouveaux identifiants pour nos fonctions *)
@ -372,16 +374,14 @@ let translate (p : S.t) env =
let env =
match name with
| None -> env
| Some name -> bind_var env name (T.Variable (T.Id "oldenvironment"))
| Some name -> bind_var env name (T.Variable old_env)
in
match block with
| None ->
(* Cas où on a une simple fonction anonyme *)
let new_clot = new_cloture 0 free_vars in
let blocks, env =
add_to_cloture env fname (T.Variable (T.Id "environment")) free_vars []
in
T.Define (T.Id "environment", new_clot, blocks), env
let blocks, env = add_to_cloture env fname (T.Variable curr_env) free_vars [] in
T.Define (curr_env, new_clot, blocks), env
| Some (block, rdefs) ->
(* Cas pour les fonctions mutuellements récursive *)
add_to_cloture env fname (T.Variable block) free_vars rdefs
@ -402,9 +402,7 @@ let translate (p : S.t) env =
(* Pour chaque élément de la liste ...
On commence par lié la variable dans le nouvelle environnement
qui se trouve dans l'ancien environnement *)
let new_env =
bind_var env id (read_block (T.Variable (T.Id "oldenvironment")) (lint k))
in
let curr_env = bind_var env id (read_block (T.Variable old_env) (lint k)) in
(* On cherche la valeur de la variable dans
le dictionnaire du programme *)
let new_valeur =
@ -418,7 +416,7 @@ let translate (p : S.t) env =
(* On rappelle notre fonction avec le nouvelle environnement,
en rajoutant notre instruction à la liste d'instruction,
et en incrémentant l'index *)
new_env, new_instr :: list, k + 1)
curr_env, new_instr :: list, k + 1)
(* On commence notre fonction avec l'env de base,
la liste d'instruction vide et l'indice à 1
(0 étant l'initialisation du début) *)
@ -430,11 +428,9 @@ let translate (p : S.t) env =
let env, vars_fun, _ =
List.fold_left
(fun (env, list, k) (id, id_var) ->
let new_env =
bind_var env id (read_block (T.Variable (T.Id "oldenvironment")) (lint k))
in
let curr_env = bind_var env id (read_block (T.Variable old_env) (lint k)) in
let new_instr = write_block env_var (lint k) (T.Variable id_var) in
new_env, new_instr :: list, k + 1)
curr_env, new_instr :: list, k + 1)
(* On commence avec k car on a mis k variables libres juste avant *)
(env, [], k)
rdefs