From 709ad1f43f7aa2d12926e1c5dd9adf598a866eae Mon Sep 17 00:00:00 2001 From: Mylloon Date: Mon, 18 Dec 2023 19:26:12 +0100 Subject: [PATCH] use fresh variables --- flap/src/fopix/hobixToFopix.ml | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/flap/src/fopix/hobixToFopix.ml b/flap/src/fopix/hobixToFopix.ml index d3518dc..ba84a84 100644 --- a/flap/src/fopix/hobixToFopix.ml +++ b/flap/src/fopix/hobixToFopix.ml @@ -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