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_TRUE: object::Boolean = object::Boolean { value: true };
const BOOL_FALSE: object::Boolean = object::Boolean { value: false }; const BOOL_FALSE: object::Boolean = object::Boolean { value: false };
pub fn eval_program(program: ast::Program) -> Option<Box<dyn Object>> { pub fn eval_program(
let env = Rc::new(RefCell::new(Environment::new())); program: ast::Program,
env: Rc<RefCell<Environment>>,
) -> Option<Box<dyn Object>> {
let mut result: Option<Box<dyn Object>> = None; let mut result: Option<Box<dyn Object>> = None;
for stmt in program.statements { for stmt in program.statements {
+6 -1
View File
@@ -1,12 +1,17 @@
use std::cell::RefCell;
use std::rc::Rc;
use super::*; use super::*;
use crate::lexer; use crate::lexer;
use crate::object::Environment;
use crate::parser::new_parser; use crate::parser::new_parser;
fn test_eval(input: &str) -> Option<Box<dyn Object>> { fn test_eval(input: &str) -> Option<Box<dyn Object>> {
let lexer = lexer::new(input.to_string()); let lexer = lexer::new(input.to_string());
let mut parser = new_parser(lexer); let mut parser = new_parser(lexer);
let program = parser.parse_program(); 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) { 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::evaluator;
use crate::lexer::new; use crate::lexer::new;
use crate::object::Environment;
use crate::parser::Parser; use crate::parser::Parser;
use crate::parser::new_parser; use crate::parser::new_parser;
@@ -7,6 +11,7 @@ const PROMPT: &str = ">> ";
pub fn start_repl() { pub fn start_repl() {
println!("Welcome to the REPL! Type 'exit' to quit."); println!("Welcome to the REPL! Type 'exit' to quit.");
let env = Rc::new(RefCell::new(Environment::new()));
loop { loop {
print!("{}", PROMPT); print!("{}", PROMPT);
let mut input = String::new(); let mut input = String::new();
@@ -20,7 +25,7 @@ pub fn start_repl() {
let lexer = new(input.to_string()); let lexer = new(input.to_string());
let mut parser: Parser = new_parser(lexer); let mut parser: Parser = new_parser(lexer);
let program = parser.parse_program(); 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() { for err in parser.errors() {
eprintln!("ERROR: {}", err); eprintln!("ERROR: {}", err);