From 00ac922bd0f1216b9c2b37f92b9b1b980c66002d Mon Sep 17 00:00:00 2001 From: Roman Godmaire Date: Sat, 4 May 2024 21:55:17 -0400 Subject: [PATCH] feat: basic quoting ... I think this is right? --- src/env/core.rs | 8 ++++++++ src/evaluator.rs | 5 +++++ 2 files changed, 13 insertions(+) diff --git a/src/env/core.rs b/src/env/core.rs index 641521e..c82586e 100644 --- a/src/env/core.rs +++ b/src/env/core.rs @@ -35,6 +35,14 @@ pub(super) fn core() -> HashMap { eval_node(env, Node::List(list)) }), ), + ( + "quote", + Node::Special(|_env, args| { + arg_count!(1, args.len()); + let val = args.into_iter().next().unwrap(); + Ok(val) + }), + ), // Arithmetic operations ( "+", diff --git a/src/evaluator.rs b/src/evaluator.rs index f86a31a..859bf86 100644 --- a/src/evaluator.rs +++ b/src/evaluator.rs @@ -69,6 +69,7 @@ pub fn eval_node(env: &Environment, ast_node: Node) -> Result { _ => Err(Error::InvalidOperator)?, } } + Node::Symbol(sym) => env.get(&sym).ok_or(Error::NotInEnv(sym))?.to_owned(), val => val, @@ -95,6 +96,10 @@ mod test { // Meta #[case("(eval (list + 1 1))", "2")] #[case("(apply + (list 1 2 3))", "6")] + #[case("'(1 2 3)", "(1 2 3)")] + #[case("(quote (1 2 3))", "(1 2 3)")] + #[case("'(1 2 (4 5) 6 7)", "(1 2 (4 5) 6 7)")] + #[case("(quote (1 2 (4 5) 6 7))", "(1 2 (4 5) 6 7)")] // Arithmetic #[case("(+ 1 2)", "3")] #[case("(- 5 1)", "4")]