diff --git a/src/interpreter.rs b/src/interpreter.rs index 40ab403..4192fe2 100644 --- a/src/interpreter.rs +++ b/src/interpreter.rs @@ -135,8 +135,8 @@ pub fn interpret(exp: &Datum, env: &mut Env) -> Datum { List(v) if has_tag(v, "cond") => panic!("cond-not-supported"), List(v) if has_tag(v, "let") => panic!("let-not-supported"), List(v) if has_tag(v, "begin") => interpret_begin(v, env), + List(v) if has_tag(v, "quote") => v[1].clone(), List(v) => interpret_application(v, env), - // TODO: quoted _ => panic!("unknown-expression {:?}", exp), } } diff --git a/src/parser.rs b/src/parser.rs index d9bf201..23f748e 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -52,11 +52,19 @@ fn parse_datum(tokens: &Tokens, ix: usize) -> (Datum, usize) { Token::Identifier(s) => (Datum::Symbol(s.to_string()), ix + 1), Token::Boolean(b) => (Datum::Boolean(*b), ix + 1), Token::Number(n) => (Datum::Number(*n), ix + 1), + Token::Quote => parse_quote(tokens, ix + 1), Token::LeftRoundBracket => parse_list(tokens, ix + 1), _ => panic!("Unexpected token {:?}", tokens[ix]), } } +pub fn parse_quote(tokens: &Tokens, ix: usize) -> (Datum, usize) { + let mut datums = vec![make_symbol("quote")]; + let (datum, ix) = parse_datum(tokens, ix); + datums.push(datum); + (Datum::List(datums), ix) +} + pub fn parse_list(tokens: &Tokens, mut ix: usize) -> (Datum, usize) { let mut datums = vec![];