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_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 {
|
||||||
|
|||||||
@@ -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
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user