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::Boolean(false) => write!(f, "false"),
|
||||||
Expression::Keyword(val) => write!(f, ":{}", val),
|
Expression::Keyword(val) => write!(f, ":{}", val),
|
||||||
Expression::String(val) => write!(f, "{}", val),
|
Expression::String(val) => write!(f, "{}", val),
|
||||||
Expression::Nil => write!(f, "nil"),
|
Expression::Nil => write!(f, "()"),
|
||||||
|
|
||||||
Expression::Vector(vec) => {
|
Expression::Vector(vec) => {
|
||||||
let s = 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>> {
|
fn eval_ast_node(env: Rc<Environment>, ast_node: Node) -> Result<Rc<Expression>> {
|
||||||
let expr = match ast_node {
|
let expr = match ast_node {
|
||||||
Node::List(list) => {
|
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 mut list = list.into_iter();
|
||||||
let operator = eval_ast_node(env.clone(), list.next().ok_or(Error::InvalidOperator)?)?;
|
let operator = eval_ast_node(env.clone(), list.next().ok_or(Error::InvalidOperator)?)?;
|
||||||
|
|
||||||
|
@ -135,10 +141,13 @@ mod test {
|
||||||
use rstest::rstest;
|
use rstest::rstest;
|
||||||
|
|
||||||
#[rstest]
|
#[rstest]
|
||||||
// Basic test of raw values
|
// Raw values
|
||||||
#[case("1", "1")]
|
#[case("1", "1")]
|
||||||
#[case("\"uwu\"", "uwu")]
|
#[case("\"uwu\"", "uwu")]
|
||||||
#[case(":owo", ":owo")]
|
#[case(":owo", ":owo")]
|
||||||
|
#[case("()", "()")]
|
||||||
|
#[case("nil", "()")]
|
||||||
|
// Arithmetic
|
||||||
#[case("(+ 1 2)", "3")]
|
#[case("(+ 1 2)", "3")]
|
||||||
#[case("(- 5 1)", "4")]
|
#[case("(- 5 1)", "4")]
|
||||||
#[case("(* 8 9)", "72")]
|
#[case("(* 8 9)", "72")]
|
||||||
|
@ -161,7 +170,7 @@ mod test {
|
||||||
// Environment manipulation
|
// Environment manipulation
|
||||||
#[case("(define! asdf (+ 2 2)) (+ asdf 2)", "4\n6")]
|
#[case("(define! asdf (+ 2 2)) (+ asdf 2)", "4\n6")]
|
||||||
#[case("(let* (a 2) (+ a 2))", "4")]
|
#[case("(let* (a 2) (+ a 2))", "4")]
|
||||||
// If-else
|
// Branching
|
||||||
#[case("(if true true false)", "true")]
|
#[case("(if true true false)", "true")]
|
||||||
#[case("(if nil true false)", "true")]
|
#[case("(if nil true false)", "true")]
|
||||||
#[case("(if false true false)", "false")]
|
#[case("(if false true false)", "false")]
|
||||||
|
|
Loading…
Reference in a new issue