complexpr/src/interpreter.rs

29 lines
958 B
Rust
Raw Normal View History

2022-09-06 13:52:29 +00:00
use std::{cell::RefCell, rc::Rc};
use crate::{value::Value, lexer::Lexer, parser::Parser, eval::{Environment, eval_stmt, eval_expr, EnvRef}, expr::Stmt, stdlib};
2022-09-06 13:52:29 +00:00
pub fn interpret(src: &str, fname: Option<String>, env: Option<EnvRef>, repl: bool) -> Result<Value, Box<dyn std::error::Error>> {
2022-09-07 20:11:51 +00:00
let mut lexer = Lexer::new(src, fname);
2022-09-06 13:52:29 +00:00
lexer.lex()?;
2022-09-07 20:11:51 +00:00
let mut parser = Parser::new(lexer.into_tokens(), repl);
2022-09-06 13:52:29 +00:00
let ast = parser.parse()?;
let environ;
if let Some(env) = env {
environ = env;
} else {
environ = Rc::new(RefCell::new(Environment::new()));
stdlib::load(&mut environ.borrow_mut());
2022-09-06 13:52:29 +00:00
}
2022-09-06 13:52:29 +00:00
let mut result = Value::Nil;
for stmt in ast {
if let Stmt::Expr{expr} = stmt {
result = eval_expr(&expr, environ.clone())?;
} else {
2022-09-11 05:01:53 +00:00
eval_stmt(&stmt, environ.clone()).map_err(|e| e.as_error())?;
2022-09-06 13:52:29 +00:00
result = Value::Nil;
}
}
Ok(result)
2022-09-11 17:02:18 +00:00
}