feat: not operator
This commit is contained in:
parent
939bb15324
commit
fbd0070324
2 changed files with 19 additions and 1 deletions
|
@ -1,6 +1,6 @@
|
||||||
use std::{borrow::Borrow, cell::RefCell, collections::HashMap, rc::Rc};
|
use std::{borrow::Borrow, cell::RefCell, collections::HashMap, rc::Rc};
|
||||||
|
|
||||||
use super::{eval_ast_node, Error, Expression};
|
use super::{eval_ast_node, Error, Expression, FALSE, TRUE};
|
||||||
use crate::parser::Node;
|
use crate::parser::Node;
|
||||||
|
|
||||||
pub type RawEnvironment = HashMap<String, Rc<Expression>>;
|
pub type RawEnvironment = HashMap<String, Rc<Expression>>;
|
||||||
|
@ -127,6 +127,20 @@ pub fn core_environment() -> Rc<Environment> {
|
||||||
Ok(Rc::new(Expression::HashMap(res)))
|
Ok(Rc::new(Expression::HashMap(res)))
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
|
(
|
||||||
|
"not",
|
||||||
|
Expression::NativeFunc(|args| {
|
||||||
|
if args.len() != 1 {
|
||||||
|
Err(Error::MismatchedArgCount(1, args.len()))?
|
||||||
|
}
|
||||||
|
|
||||||
|
if FALSE.with(|inner| &args[0] == inner) {
|
||||||
|
return Ok(TRUE.with(|inner| inner.clone()));
|
||||||
|
}
|
||||||
|
|
||||||
|
return Ok(FALSE.with(|inner| inner.clone()));
|
||||||
|
}),
|
||||||
|
),
|
||||||
// Branching
|
// Branching
|
||||||
(
|
(
|
||||||
"if",
|
"if",
|
||||||
|
|
|
@ -219,6 +219,10 @@ mod test {
|
||||||
#[case("((fn* (a) a) 3)", "3")]
|
#[case("((fn* (a) a) 3)", "3")]
|
||||||
#[case("((fn* (a) (+ a 2)) 1)", "3")]
|
#[case("((fn* (a) (+ a 2)) 1)", "3")]
|
||||||
#[case("((fn* (a b) (+ a b)) 1 2)", "3")]
|
#[case("((fn* (a b) (+ a b)) 1 2)", "3")]
|
||||||
|
#[case("(not false)", "true")]
|
||||||
|
#[case("(not true)", "false")]
|
||||||
|
#[case("(not nil)", "false")]
|
||||||
|
#[case("(not 1)", "false")]
|
||||||
fn test_evaluator(#[case] input: &str, #[case] expected: &str) {
|
fn test_evaluator(#[case] input: &str, #[case] expected: &str) {
|
||||||
let env = core_environment();
|
let env = core_environment();
|
||||||
let tokens = lexer::read(input).unwrap();
|
let tokens = lexer::read(input).unwrap();
|
||||||
|
|
Loading…
Reference in a new issue