diff --git a/src/environment.rs b/src/environment.rs index 28d2105..75a2b14 100644 --- a/src/environment.rs +++ b/src/environment.rs @@ -5,6 +5,7 @@ use std::mem; type Mapping = (Datum, Datum); +#[derive(Debug)] pub struct Frame<'a> { mappings: Vec, outer: Option<&'a Frame<'a>>, diff --git a/src/interpreter.rs b/src/interpreter.rs index 798a579..534f0f8 100644 --- a/src/interpreter.rs +++ b/src/interpreter.rs @@ -83,8 +83,17 @@ fn interpret_define(args: &Vec, env: &mut Env) -> Datum { } } -fn interpret_cond(_vec: &Vec, _env: &mut Env) -> Datum { - Datum::Unspecified +fn interpret_cond(vec: &Vec, env: &mut Env) -> Datum { + for i in 1..vec.len() { + if let List(v) = &vec[i] { + if has_tag(v, "else") || is_true(&interpret(&v[0], env)) { + return interpret_begin(v, env); + } + } else { + panic!("INTERPRET-COND -- not a list {:?}", vec[i]) + } + } + panic!("INTERPRET-COND -- missing else statement? {:?}", vec) } fn interpret_begin(vec: &Vec, env: &mut Env) -> Datum { diff --git a/src/primitives.rs b/src/primitives.rs index 90b9e7c..968a9e6 100644 --- a/src/primitives.rs +++ b/src/primitives.rs @@ -94,7 +94,7 @@ pub fn display(args: Vec) -> Datum { Number(n) => print!("{}", n), String(s) => print!("{}", s), List(v) => print!("{:?}", v), - _ => panic!("DISPLAY -- cannot-print {:?}", args[1]), + _ => panic!("DISPLAY -- cannot-print {:?}", args[i]), }; } io::stdout().flush().ok().expect("Could not flush stdout");