From be65935deffee2fd811c1839eb66b373c221d477 Mon Sep 17 00:00:00 2001 From: me Date: Wed, 17 Dec 2025 00:31:14 +0200 Subject: [PATCH] impl interpret block return --- src/ast/types.rs | 3 ++- src/interpret/interpret.rs | 25 ++++++++++++++++++++----- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/ast/types.rs b/src/ast/types.rs index 239b523..e693840 100644 --- a/src/ast/types.rs +++ b/src/ast/types.rs @@ -33,7 +33,6 @@ pub enum Expr { }, Continue, Break, - Return(Box), */ } @@ -203,6 +202,8 @@ impl Record { } } +pub const UNIT: Expr = Expr::Value(Value::Record(Record(BTreeMap::new()))); + #[derive(PartialEq, Debug, thiserror::Error)] pub enum Error { #[error("Label not found: {0:?}")] diff --git a/src/interpret/interpret.rs b/src/interpret/interpret.rs index cbdbc86..c4057fa 100644 --- a/src/interpret/interpret.rs +++ b/src/interpret/interpret.rs @@ -27,19 +27,27 @@ pub fn run( Ok(result) } +enum StatementResult { + Result(ast::Value), + Return(ast::Value), +} + fn eval_statement( expr_env: &mut Env, state: &mut State, statement: &ast::Statement, -) -> Result { +) -> Result { match statement { - ast::Statement::Expr(expr) => eval_expr(expr_env, state, expr), + ast::Statement::Expr(expr) => eval_expr(expr_env, state, expr).map(StatementResult::Result), ast::Statement::Let(ast::Definition { name, expr }) => { let result = eval_expr(expr_env, state, expr)?; expr_env.insert(name.clone(), result.clone()); - Ok(result) + Ok(StatementResult::Result(result)) } - ast::Statement::Return(_) => todo!(), + ast::Statement::Return(expr) => match expr { + Some(expr) => eval_expr(expr_env, state, expr).map(StatementResult::Return), + None => eval_expr(expr_env, state, &ast::UNIT).map(StatementResult::Return), + }, } } @@ -70,7 +78,14 @@ fn eval_expr(expr_env: &Env, state: &mut State, expr: &ast::Expr) -> Result, Error>(Some(result)) + match result { + StatementResult::Result(result) => { + Ok::, Error>(Some(result)) + } + StatementResult::Return(result) => { + return Ok::, Error>(Some(result)); + } + } })? { Ok(last) } else {