From 399686fc983afd8bcf72fbcd74b59853ec90074e Mon Sep 17 00:00:00 2001 From: YannAhlgrim Date: Sun, 12 Jul 2026 15:34:29 +0200 Subject: [PATCH] fix: add evironment to eval program --- src/evaluator/mod.rs | 6 ++++-- src/evaluator/tests.rs | 7 ++++++- src/repl/mod.rs | 7 ++++++- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/evaluator/mod.rs b/src/evaluator/mod.rs index 1c8f7ef..80d5e96 100644 --- a/src/evaluator/mod.rs +++ b/src/evaluator/mod.rs @@ -8,8 +8,10 @@ const NULL: Null = Null; const BOOL_TRUE: object::Boolean = object::Boolean { value: true }; const BOOL_FALSE: object::Boolean = object::Boolean { value: false }; -pub fn eval_program(program: ast::Program) -> Option> { - let env = Rc::new(RefCell::new(Environment::new())); +pub fn eval_program( + program: ast::Program, + env: Rc>, +) -> Option> { let mut result: Option> = None; for stmt in program.statements { diff --git a/src/evaluator/tests.rs b/src/evaluator/tests.rs index 221ff30..123da9d 100644 --- a/src/evaluator/tests.rs +++ b/src/evaluator/tests.rs @@ -1,12 +1,17 @@ +use std::cell::RefCell; +use std::rc::Rc; + use super::*; use crate::lexer; +use crate::object::Environment; use crate::parser::new_parser; fn test_eval(input: &str) -> Option> { let lexer = lexer::new(input.to_string()); let mut parser = new_parser(lexer); let program = parser.parse_program(); - eval_program(program) + let env = Rc::new(RefCell::new(Environment::new())); + eval_program(program, env) } fn test_integer_object(obj: &dyn Object, expected: i64) { diff --git a/src/repl/mod.rs b/src/repl/mod.rs index cb783ce..ba09512 100644 --- a/src/repl/mod.rs +++ b/src/repl/mod.rs @@ -1,5 +1,9 @@ +use std::cell::RefCell; +use std::rc::Rc; + use crate::evaluator; use crate::lexer::new; +use crate::object::Environment; use crate::parser::Parser; use crate::parser::new_parser; @@ -7,6 +11,7 @@ const PROMPT: &str = ">> "; pub fn start_repl() { println!("Welcome to the REPL! Type 'exit' to quit."); + let env = Rc::new(RefCell::new(Environment::new())); loop { print!("{}", PROMPT); let mut input = String::new(); @@ -20,7 +25,7 @@ pub fn start_repl() { let lexer = new(input.to_string()); let mut parser: Parser = new_parser(lexer); let program = parser.parse_program(); - let evaluated = evaluator::eval_program(program); + let evaluated = evaluator::eval_program(program, Rc::clone(&env)); for err in parser.errors() { eprintln!("ERROR: {}", err);