implemented while and for loops

This commit is contained in:
Moritz Gmeiner 2024-08-27 01:57:47 +02:00
commit 3bc871d434
4 changed files with 87 additions and 16 deletions

View file

@ -9,8 +9,9 @@ open Value
let value_of_literal (literal : literal) : Value.lox_value =
match literal with String s -> String s | Number x -> Number x | Bool b -> Bool b | Nil -> Nil
let rec interpret_expr (env : environment) (expr : expr_node) : (lox_value, runtime_error) result =
let { pos; expr } = expr in
let rec interpret_expr (env : environment) (expr_node : expr_node) :
(lox_value, runtime_error) result =
let { pos; expr } = expr_node in
match expr with
| Literal literal -> Ok (value_of_literal literal)
| Variable name -> (
@ -75,8 +76,8 @@ let rec interpret_expr (env : environment) (expr : expr_node) : (lox_value, runt
| And, false | Or, true -> Ok left (* short circuit *)
| _ -> interpret_expr env right)
let rec interpret_stmt (env : environment) (stmt : stmt_node) : (unit, runtime_error) result =
let { pos; stmt } = stmt in
let rec interpret_stmt (env : environment) (stmt_node : stmt_node) : (unit, runtime_error) result =
let { pos; stmt } = stmt_node in
ignore pos;
match stmt with
| Expr expr ->
@ -108,3 +109,10 @@ let rec interpret_stmt (env : environment) (stmt : stmt_node) : (unit, runtime_e
let cond = lox_value_to_bool cond in
if cond then interpret_stmt env then_
else Option.map (interpret_stmt env) else_ |> Option.value ~default:(Ok ())
| While { cond; body } ->
let* cond = interpret_expr env cond in
let cond = lox_value_to_bool cond in
if cond then
let* _ = interpret_stmt env body in
interpret_stmt env stmt_node
else Ok ()