Fix recursive function

This commit is contained in:
백현웅 2022-02-18 16:49:20 +09:00
parent 96d0c882b3
commit b6e00cd862

22
eval.ml
View file

@ -7,7 +7,8 @@ type value =
| Bool of bool | Bool of bool
| String of string | String of string
| Symbol of string | Symbol of string
| Function of string * expr * env (* (name), arg, expression, name *)
| Function of string option * string * expr * env
| External of string | External of string
| Nop (* return of system operations (will be deprecated) *) | Nop (* return of system operations (will be deprecated) *)
@ -255,7 +256,7 @@ let rec eval env ast =
| Nbool b -> Bool b | Nbool b -> Bool b
| Nstring s -> String s | Nstring s -> String s
| Nsymbol s -> Symbol s | Nsymbol s -> Symbol s
| Nfunction (arg, e) -> Function (arg, e, env) | Nfunction (arg, e) -> Function (None, arg, e, env)
| Nexternal f -> External f | Nexternal f -> External f
| Var v -> begin match Env.get_opt env v with | Var v -> begin match Env.get_opt env v with
@ -282,11 +283,10 @@ let rec eval env ast =
| Apply (v, args) -> | Apply (v, args) ->
begin match aux v with begin match aux v with
| Function (var, e, env) as f -> | Function (itself, var, e, env) as f ->
begin match args with begin match args with
| [] -> f | [] -> f
| a::args -> | a::args ->
let itself = match v with Var v -> Some v | _ -> None in
let env = let env =
(* binding itself into env for recursion *) (* binding itself into env for recursion *)
Option.fold Option.fold
@ -327,9 +327,11 @@ let rec eval env ast =
aux ast aux ast
let eval_top env_ref ast = let eval_top env_ref ast =
match ast with let var, v = match ast with
| Let (var, e) -> | Let (var, Nfunction (arg, e)) ->
let v = eval !env_ref e in var, Function (Some var, arg, e, !env_ref)
env_ref := Env.bind (var, v) !env_ref; | Let (var, e) -> var, eval !env_ref e
var, v | ast -> "-", eval !env_ref ast
| ast -> "-", eval !env_ref ast in
if var <> "-" then env_ref := Env.bind (var, v) !env_ref;
var, v