31 lines
997 B
Rust
31 lines
997 B
Rust
use crate::parser::Datum;
|
|
use crate::parser::Datum::{Procedure, Symbol};
|
|
use crate::parser::make_symbol;
|
|
use crate::primitives;
|
|
|
|
type Mapping = (Datum, Datum);
|
|
type Frame = Vec<Mapping>;
|
|
pub type Env = Vec<Frame>;
|
|
|
|
pub fn get_global_environment() -> Env {
|
|
vec![vec![(make_symbol("+"), Procedure(primitives::add)),
|
|
(make_symbol("*"), Procedure(primitives::mul)),
|
|
(make_symbol("-"), Procedure(primitives::sub))]]
|
|
}
|
|
|
|
pub fn lookup_variable_value(exp: &Datum, env: &Env) -> Datum {
|
|
if let Symbol(symbol_name) = exp {
|
|
for frame in env {
|
|
for mapping in frame {
|
|
if let (Symbol(current_name), datum) = mapping {
|
|
if symbol_name == current_name {
|
|
return datum.clone();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
panic!("LOOKUP-VARIABLE-VALUE -- not-a-symbol {:?}", exp)
|
|
}
|
|
panic!("LOOKUP-VARIABLE-VALUE -- unbound-variable-error {:?}", exp)
|
|
} |