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
|
| 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
|
||||||
|
|
Reference in a new issue