about summary refs log tree commit diff
path: root/users/tazjin/rlox/src/interpreter.rs
diff options
context:
space:
mode:
Diffstat (limited to 'users/tazjin/rlox/src/interpreter.rs')
-rw-r--r--users/tazjin/rlox/src/interpreter.rs11
1 files changed, 9 insertions, 2 deletions
diff --git a/users/tazjin/rlox/src/interpreter.rs b/users/tazjin/rlox/src/interpreter.rs
index ef188b797f..f04d767dc5 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),