use crate::env::Env;
use crate::heap::Address;
use crate::syntax::{Expr, VarName};
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Value {
Closure {
param: VarName,
body: Expr,
env: Env,
},
Ref(Address),
}
impl Value {
#[must_use]
pub fn closure(param: VarName, body: Expr, env: Env) -> Self {
Self::Closure { param, body, env }
}
#[must_use]
pub fn reference(address: Address) -> Self {
Self::Ref(address)
}
}
impl std::fmt::Display for Value {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Closure { param, body, .. } => write!(f, "\\{param}. {body}"),
Self::Ref(address) => write!(f, "ref({address})"),
}
}
}