fix: nil and () are identical
This commit is contained in:
parent
f93baad338
commit
f5ac02aedb
1 changed files with 12 additions and 3 deletions
|
@ -39,7 +39,7 @@ impl std::fmt::Display for Expression {
|
|||
Expression::Boolean(false) => write!(f, "false"),
|
||||
Expression::Keyword(val) => write!(f, ":{}", val),
|
||||
Expression::String(val) => write!(f, "{}", val),
|
||||
Expression::Nil => write!(f, "nil"),
|
||||
Expression::Nil => write!(f, "()"),
|
||||
|
||||
Expression::Vector(vec) => {
|
||||
let s = vec
|
||||
|
@ -93,6 +93,12 @@ pub fn eval(env: Rc<Environment>, ast: Vec<Node>) -> Result<Vec<Rc<Expression>>>
|
|||
fn eval_ast_node(env: Rc<Environment>, ast_node: Node) -> Result<Rc<Expression>> {
|
||||
let expr = match ast_node {
|
||||
Node::List(list) => {
|
||||
// Empty lists are nil in scheme
|
||||
if list.is_empty() {
|
||||
return Ok(NIL.with(|v| v.clone()));
|
||||
}
|
||||
|
||||
// We always assume lists evaluate
|
||||
let mut list = list.into_iter();
|
||||
let operator = eval_ast_node(env.clone(), list.next().ok_or(Error::InvalidOperator)?)?;
|
||||
|
||||
|
@ -135,10 +141,13 @@ mod test {
|
|||
use rstest::rstest;
|
||||
|
||||
#[rstest]
|
||||
// Basic test of raw values
|
||||
// Raw values
|
||||
#[case("1", "1")]
|
||||
#[case("\"uwu\"", "uwu")]
|
||||
#[case(":owo", ":owo")]
|
||||
#[case("()", "()")]
|
||||
#[case("nil", "()")]
|
||||
// Arithmetic
|
||||
#[case("(+ 1 2)", "3")]
|
||||
#[case("(- 5 1)", "4")]
|
||||
#[case("(* 8 9)", "72")]
|
||||
|
@ -161,7 +170,7 @@ mod test {
|
|||
// Environment manipulation
|
||||
#[case("(define! asdf (+ 2 2)) (+ asdf 2)", "4\n6")]
|
||||
#[case("(let* (a 2) (+ a 2))", "4")]
|
||||
// If-else
|
||||
// Branching
|
||||
#[case("(if true true false)", "true")]
|
||||
#[case("(if nil true false)", "true")]
|
||||
#[case("(if false true false)", "false")]
|
||||
|
|
Loading…
Reference in a new issue