fix: don't include void nodes in eval result
This commit is contained in:
parent
b582d66fcf
commit
b1ddc907e6
2 changed files with 9 additions and 5 deletions
2
src/env/core.rs
vendored
2
src/env/core.rs
vendored
|
@ -282,7 +282,7 @@ pub(super) fn core() -> HashMap<String, Node> {
|
||||||
|
|
||||||
env.set(key, val.clone());
|
env.set(key, val.clone());
|
||||||
|
|
||||||
Ok(val)
|
Ok(Node::Void)
|
||||||
}),
|
}),
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
|
|
|
@ -7,13 +7,18 @@ use crate::error::Error;
|
||||||
use crate::node::Node;
|
use crate::node::Node;
|
||||||
|
|
||||||
pub fn eval(env: &Environment, ast: Vec<Node>) -> Result<Vec<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 {
|
for node in ast {
|
||||||
res.push(eval_node(env, node)?);
|
let res = eval_node(env, node)?;
|
||||||
|
if let Node::Void = res {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
exprs.push(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(res)
|
Ok(exprs)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn eval_node(env: &Environment, ast_node: Node) -> Result<Node> {
|
pub fn eval_node(env: &Environment, ast_node: Node) -> Result<Node> {
|
||||||
|
@ -133,7 +138,6 @@ mod test {
|
||||||
#[case("(count {})", "0")]
|
#[case("(count {})", "0")]
|
||||||
#[case("(count {:a 1})", "1")]
|
#[case("(count {:a 1})", "1")]
|
||||||
// Environment manipulation
|
// Environment manipulation
|
||||||
#[case("(define! asdf (+ 2 2)) (+ asdf 2)", "4\n6")]
|
|
||||||
#[case("(let* (a 2) (+ a 2))", "4")]
|
#[case("(let* (a 2) (+ a 2))", "4")]
|
||||||
// Branching
|
// Branching
|
||||||
#[case("(if true true false)", "true")]
|
#[case("(if true true false)", "true")]
|
||||||
|
|
Loading…
Reference in a new issue