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

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

            
33
1428
fn quoted_to_value(inner: &Expr) -> Result<Value> {
34
1428
    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
544
        Expr::Symbol(s) => Ok(Value::Symbol(s.clone())),
40
68
        Expr::Bytes(b) => Ok(Value::Bytes(b.clone())),
41
816
        Expr::List(elems) => {
42
816
            let inner: Vec<_> = elems.iter().map(format_expr).collect();
43
816
            Ok(Value::String(format!("({})", inner.join(" "))))
44
        }
45
        _ => Err(Error::Compile(format!(
46
            "unsupported quoted expression: {inner:?}"
47
        ))),
48
    }
49
1428
}