use fresh variables
This commit is contained in:
parent
13efd4ad65
commit
709ad1f43f
1 changed files with 10 additions and 14 deletions
|
@ -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
|
||||
|
|
Reference in a new issue