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

            
17
5751
fn expr_to_value(expr: &Expr) -> Result<Value> {
18
5751
    match expr {
19
497
        Expr::Nil => Ok(Value::Nil),
20
1349
        Expr::Bool(b) => Ok(Value::Bool(*b)),
21
1704
        Expr::Number(n) => Ok(Value::Number(*n)),
22
213
        Expr::String(s) => Ok(Value::String(s.clone())),
23
71
        Expr::Symbol(s) => Ok(Value::Symbol(s.clone())),
24
        Expr::Bytes(b) => Ok(Value::Bytes(b.clone())),
25
1491
        Expr::Quote(inner) => quoted_to_value(inner),
26
142
        Expr::List(_) => Ok(Value::String(format_expr(expr))),
27
        Expr::Lambda(_, _) => Ok(Value::String(format_expr(expr))),
28
213
        Expr::RuntimeValue(val) => Ok(val.clone()),
29
71
        _ => Err(Error::Compile(format!("unsupported expression: {expr:?}"))),
30
    }
31
5751
}
32

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