moved for loop to separate Stmt and added continue

This commit is contained in:
Moritz Gmeiner 2024-08-27 17:15:35 +02:00
commit be28dad67e
6 changed files with 113 additions and 61 deletions

View file

@ -87,6 +87,7 @@ let rec interpret_stmt (env : environment) (stmt_node : stmt_node) : (unit, runt
(* print_endline "break!";
Ok () (* TODO *) *)
RuntimeError.break () |> Result.error
| Continue -> RuntimeError.continue () |> Result.error
| Print expr ->
let* value = interpret_expr env expr in
print_endline (Value.string_of_lox_value value);
@ -119,7 +120,31 @@ let rec interpret_stmt (env : environment) (stmt_node : stmt_node) : (unit, runt
if cond then
let result = interpret_stmt env body in
match result with
| Error { is_break = true; _ } -> Ok ()
| Ok () | Error Continue -> interpret_stmt env stmt_node
| Error Break -> Ok ()
| Error e -> Error e
| _ -> interpret_stmt env stmt_node
else Ok ()
| For { init; cond; update; body } ->
let* _ = init |> Option.map (interpret_stmt env) |> Option.value ~default:(Ok ()) in
let eval_cond () =
cond
|> Option.map (interpret_expr env)
|> Option.value ~default:(Ok (Value.Bool true))
|> Result.map Value.lox_value_to_bool
in
let do_update () =
update |> Option.map (interpret_expr env) |> Option.value ~default:(Ok Value.Nil)
in
let rec loop () =
let* cond = eval_cond () in
if cond then
let result = interpret_stmt env body in
match result with
| Ok () | Error Continue ->
let* _ = do_update () in
loop ()
| Error Break -> Ok ()
| Error e -> Error e
else Ok ()
in
loop ()