function recursive
This commit is contained in:
parent
06b41d838a
commit
d461396636
1 changed files with 21 additions and 3 deletions
|
@ -352,12 +352,30 @@ and value_definition runtime = function
|
|||
(expression' runtime.environment runtime.memory expr)
|
||||
in
|
||||
{ runtime with environment = env' }
|
||||
| RecFunctions _rf ->
|
||||
| RecFunctions rf ->
|
||||
(* Ici on ajoute les noms des fonctions à l'environnement
|
||||
* pour qu'elles puissent s'appeller dans leur corps de fonction
|
||||
* => Retourne l'environnement modifié *)
|
||||
(* TODO *)
|
||||
runtime
|
||||
{ runtime with environment = define_rec runtime.environment rf }
|
||||
|
||||
and define_rec env rf =
|
||||
(* Ajoute les fonctions récursives dans l'environnement
|
||||
* par défaut on dit qu'elle renvoie Unit *)
|
||||
let env' =
|
||||
List.fold_left
|
||||
(fun curr_env (id, _, _) -> Environment.bind curr_env id.value VUnit)
|
||||
env
|
||||
rf
|
||||
in
|
||||
(* On associe les fonctions avec leur contenu en ignorant le type via
|
||||
* une closure en les rajoutant à l'environnement *)
|
||||
List.iter
|
||||
((fun env'' (name, _, FunctionDefinition (pattern, expr)) ->
|
||||
Environment.update name.position name.value env'' (VClosure (env'', pattern, expr)))
|
||||
env')
|
||||
rf;
|
||||
env'
|
||||
|
||||
and expression' environment memory e =
|
||||
expression (position e) environment memory (value e)
|
||||
|
@ -392,7 +410,7 @@ and expression _pos environment _memory = function
|
|||
| Define _ ->
|
||||
(* TODO *)
|
||||
failwith "Students! This is your job (Define)!"
|
||||
| Fun _ ->
|
||||
| Fun (FunctionDefinition _) ->
|
||||
(* TODO *)
|
||||
failwith "Students! This is your job (Fun)!"
|
||||
| Apply _ ->
|
||||
|
|
Reference in a new issue