fix: don't include void nodes in eval result

This commit is contained in:
Roman Godmaire 2024-05-04 18:44:38 -04:00
parent b582d66fcf
commit b1ddc907e6
2 changed files with 9 additions and 5 deletions

2
src/env/core.rs vendored
View file

@ -282,7 +282,7 @@ pub(super) fn core() -> HashMap<String, Node> {
env.set(key, val.clone());
Ok(val)
Ok(Node::Void)
}),
),
(

View file

@ -7,13 +7,18 @@ use crate::error::Error;
use crate::node::Node;
pub fn eval(env: &Environment, ast: Vec<Node>) -> Result<Vec<Node>> {
let mut res = Vec::new();
let mut exprs = Vec::new();
for node in ast {
res.push(eval_node(env, node)?);
let res = eval_node(env, node)?;
if let Node::Void = res {
continue;
}
Ok(res)
exprs.push(res);
}
Ok(exprs)
}
pub fn eval_node(env: &Environment, ast_node: Node) -> Result<Node> {
@ -133,7 +138,6 @@ mod test {
#[case("(count {})", "0")]
#[case("(count {:a 1})", "1")]
// Environment manipulation
#[case("(define! asdf (+ 2 2)) (+ asdf 2)", "4\n6")]
#[case("(let* (a 2) (+ a 2))", "4")]
// Branching
#[case("(if true true false)", "true")]