diff --git a/mute-interpreter/src/env/standard.rs b/mute-interpreter/src/env/standard.rs index afa7368..eb833cd 100644 --- a/mute-interpreter/src/env/standard.rs +++ b/mute-interpreter/src/env/standard.rs @@ -19,6 +19,12 @@ pub(super) fn standard() -> HashMap { (macro* (name args body) ~(define (,name (fn* ,args ,body))) ) }, ), + ( + "quote", + inline! { + (macro* (var) ~^,var) + }, + ), ] .into_iter() .map(|(k, v)| (k.to_string(), Value::Node(v))) diff --git a/mute-interpreter/src/evaluator.rs b/mute-interpreter/src/evaluator.rs index b599b4d..473d418 100644 --- a/mute-interpreter/src/evaluator.rs +++ b/mute-interpreter/src/evaluator.rs @@ -211,6 +211,7 @@ pub fn eval_node(env: &Environment, ast_node: Node) -> Result { Node::Eval(list) => unquote!(Do, list), Node::Apply(list) => unquote!(Apply, list), + Node::Quote(node) => Ok(Node::Quote(Box::new(unquote(env, *node)?))), Node::Unquote(_) => eval_node(env, node), node => Ok(node), } diff --git a/mute-parser/src/lexer.rs b/mute-parser/src/lexer.rs index 74e5fc9..13a84d0 100644 --- a/mute-parser/src/lexer.rs +++ b/mute-parser/src/lexer.rs @@ -92,6 +92,7 @@ fn next_token(input: &mut Peekable) -> Result, Error> { '{' => Token::LeftBrace, '}' => Token::RightBrace, + '^' => Token::Quote, '\'' => Token::Quote, '`' => Token::Quasiquote, '~' => Token::Quasiquote,