use std::collections::HashMap; use crate::{OpCode, LispValue}; pub struct LispState { table: HashMap, } impl LispState { pub fn new() -> LispState { let mut table = HashMap::new(); table.insert(String::from("print"), LispValue::RustFunction(String::from("print"), |x| { let mut strings = Vec::new(); for val in x { strings.push(val.to_string()); } let str = strings.join(" "); println!("{}", str); LispValue::Nil })); LispState { table } } pub fn execute(&self, instructions: Vec) { for op in instructions { match op { OpCode::Call(func, args) => { let f = self.table.get(&func).unwrap(); if let LispValue::RustFunction(_, f) = f { f(args); } else { todo!(); } }, OpCode::Eval(ins) => { self.execute(ins); } } } } }