diff options
Diffstat (limited to 'users/tazjin/rlox/src/interpreter.rs')
-rw-r--r-- | users/tazjin/rlox/src/interpreter.rs | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/users/tazjin/rlox/src/interpreter.rs b/users/tazjin/rlox/src/interpreter.rs index ef188b797fa8..f04d767dc5a9 100644 --- a/users/tazjin/rlox/src/interpreter.rs +++ b/users/tazjin/rlox/src/interpreter.rs @@ -41,7 +41,7 @@ impl<'a> Callable<'a> { } lox.interpret_block(Rc::new(RwLock::new(fn_env)), &func.body) - }, + } } } } @@ -220,7 +220,7 @@ impl<'a> Interpreter<'a> { Statement::Block(block) => return self.interpret_block(Default::default(), block), Statement::If(if_stmt) => return self.interpret_if(if_stmt), Statement::While(while_stmt) => return self.interpret_while(while_stmt), - Statement::Function(_) => unimplemented!(), + Statement::Function(func) => return self.interpret_function(func.clone()), }; Ok(value) @@ -278,6 +278,13 @@ impl<'a> Interpreter<'a> { Ok(value) } + fn interpret_function(&mut self, stmt: Rc<parser::Function<'a>>) -> Result<Value<'a>, Error> { + let name = stmt.name.clone(); + let value = Value::Callable(Callable::Function(stmt)); + self.define_var(&name, value.clone())?; + Ok(value) + } + fn eval(&mut self, expr: &Expr<'a>) -> Result<Value<'a>, Error> { match expr { Expr::Assign(assign) => self.eval_assign(assign), |