mirror of
https://github.com/MorizzG/MLox.git
synced 2025-12-06 04:22:41 +00:00
moved for loop to separate Stmt and added continue
This commit is contained in:
parent
957783a926
commit
be28dad67e
6 changed files with 113 additions and 61 deletions
|
|
@ -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 ()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue