fix: add evironment to eval program
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user