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