Lines
72.22 %
Functions
33.33 %
Branches
100 %
use crate::ast::{Expr, Program};
use crate::compiler::expr::{eval_value, format_expr};
use crate::error::{Error, Result};
use crate::runtime::{SymbolTable, Value};
pub fn eval_program(symbols: &mut SymbolTable, program: &Program) -> Result<Value> {
if program.exprs.is_empty() {
return Ok(Value::Nil);
}
for expr in &program.exprs[..program.exprs.len() - 1] {
eval_value(symbols, expr)?;
let value = eval_value(symbols, program.exprs.last().unwrap())?;
expr_to_value(&value)
fn expr_to_value(expr: &Expr) -> Result<Value> {
match expr {
Expr::Nil => Ok(Value::Nil),
Expr::Bool(b) => Ok(Value::Bool(*b)),
Expr::Number(n) => Ok(Value::Number(*n)),
Expr::String(s) => Ok(Value::String(s.clone())),
Expr::Symbol(s) => Ok(Value::Symbol(s.clone())),
Expr::Quote(inner) => quoted_to_value(inner),
Expr::List(_) => Ok(Value::String(format_expr(expr))),
Expr::Lambda(_, _) => Ok(Value::String(format_expr(expr))),
Expr::RuntimeValue(val) => Ok(val.clone()),
_ => Err(Error::Compile(format!("unsupported expression: {expr:?}"))),
fn quoted_to_value(inner: &Expr) -> Result<Value> {
match inner {
Expr::List(elems) => {
let inner: Vec<_> = elems.iter().map(format_expr).collect();
Ok(Value::String(format!("({})", inner.join(" "))))
_ => Err(Error::Compile(format!(
"unsupported quoted expression: {inner:?}"
))),