1
use crate::ast::{Expr, Program};
2
use crate::compiler::expr::{eval_value, format_expr};
3
use crate::error::{Error, Result};
4
use crate::runtime::{SymbolTable, Value};
5

            
6
3696
pub fn eval_program(symbols: &mut SymbolTable, program: &Program) -> Result<Value> {
7
3696
    if program.exprs.is_empty() {
8
        return Ok(Value::Nil);
9
3696
    }
10
4224
    for expr in &program.exprs[..program.exprs.len() - 1] {
11
4224
        eval_value(symbols, expr)?;
12
    }
13
3652
    let value = eval_value(symbols, program.exprs.last().unwrap())?;
14
3212
    expr_to_value(&value)
15
3696
}
16

            
17
3212
fn expr_to_value(expr: &Expr) -> Result<Value> {
18
3212
    match expr {
19
308
        Expr::Nil => Ok(Value::Nil),
20
836
        Expr::Bool(b) => Ok(Value::Bool(*b)),
21
792
        Expr::Number(n) => Ok(Value::Number(*n)),
22
132
        Expr::String(s) => Ok(Value::String(s.clone())),
23
44
        Expr::Symbol(s) => Ok(Value::Symbol(s.clone())),
24
880
        Expr::Quote(inner) => quoted_to_value(inner),
25
88
        Expr::List(_) => Ok(Value::String(format_expr(expr))),
26
        Expr::Lambda(_, _) => Ok(Value::String(format_expr(expr))),
27
88
        Expr::RuntimeValue(val) => Ok(val.clone()),
28
44
        _ => Err(Error::Compile(format!("unsupported expression: {expr:?}"))),
29
    }
30
3212
}
31

            
32
880
fn quoted_to_value(inner: &Expr) -> Result<Value> {
33
880
    match inner {
34
        Expr::Nil => Ok(Value::Nil),
35
        Expr::Bool(b) => Ok(Value::Bool(*b)),
36
        Expr::Number(n) => Ok(Value::Number(*n)),
37
        Expr::String(s) => Ok(Value::String(s.clone())),
38
352
        Expr::Symbol(s) => Ok(Value::Symbol(s.clone())),
39
528
        Expr::List(elems) => {
40
528
            let inner: Vec<_> = elems.iter().map(format_expr).collect();
41
528
            Ok(Value::String(format!("({})", inner.join(" "))))
42
        }
43
        _ => Err(Error::Compile(format!(
44
            "unsupported quoted expression: {inner:?}"
45
        ))),
46
    }
47
880
}