diff --git a/src/env/core.rs b/src/env/core.rs index 146faea..1e151cc 100644 --- a/src/env/core.rs +++ b/src/env/core.rs @@ -313,6 +313,7 @@ pub(super) fn core() -> HashMap { let func = Node::Function { params: args, + env: env.clone(), body: Box::new(body), }; @@ -364,7 +365,7 @@ pub(super) fn core() -> HashMap { _ => Err(Error::ExpectedList), }?; - Ok(Node::Closure { + Ok(Node::Function { params: args, env: env.clone(), body: Box::new(body), diff --git a/src/evaluator.rs b/src/evaluator.rs index b82fbfa..c3bfc14 100644 --- a/src/evaluator.rs +++ b/src/evaluator.rs @@ -47,24 +47,7 @@ pub fn eval_node(env: &Environment, ast_node: Node) -> Result { let args = list.collect(); func(env, args)? } - - Node::Function { params, body } => { - let args = list; - if args.len() != params.len() { - Err(Error::MismatchedArgCount(params.len(), args.len()))? - } - - let args = args - .map(|node| eval_node(env, node)) - .collect::>>()?; - - let records = params.iter().map(|k| k.to_owned()).zip(args).collect(); - let env = env.wrap(records); - - eval_node(&env, *(*body).clone())? - } - - Node::Closure { + Node::Function { params, env: inner_env, body, diff --git a/src/node.rs b/src/node.rs index 4813481..aeba052 100644 --- a/src/node.rs +++ b/src/node.rs @@ -18,10 +18,6 @@ pub enum Node { Vector(Vec), Map(HashMap), Function { - params: Vec, - body: Box, - }, - Closure { params: Vec, env: Environment, body: Box, @@ -72,11 +68,7 @@ impl std::fmt::Display for Node { write!(f, "{{{res}}}") } - Node::Function { params: _, body: _ } => { - write!(f, "#") - } - - Node::Closure { + Node::Function { params: _, env: _, body: _,