fix: add evironment to eval program

This commit is contained in:
YannAhlgrim
2026-07-12 15:34:29 +02:00
parent e747ba1562
commit 399686fc98
3 changed files with 16 additions and 4 deletions
+4 -2
View File
@@ -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<Box<dyn Object>> {
let env = Rc::new(RefCell::new(Environment::new()));
pub fn eval_program(
program: ast::Program,
env: Rc<RefCell<Environment>>,
) -> Option<Box<dyn Object>> {
let mut result: Option<Box<dyn Object>> = None;
for stmt in program.statements {
+6 -1
View File
@@ -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<Box<dyn Object>> {
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) {
+6 -1
View File
@@ -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);