fix: closures are functions, functions are closures

This commit is contained in:
Roman Godmaire 2024-05-04 19:23:25 -04:00
parent e6b487a09a
commit 527737f020
3 changed files with 4 additions and 28 deletions

3
src/env/core.rs vendored
View file

@ -313,6 +313,7 @@ pub(super) fn core() -> HashMap<String, Node> {
let func = Node::Function { let func = Node::Function {
params: args, params: args,
env: env.clone(),
body: Box::new(body), body: Box::new(body),
}; };
@ -364,7 +365,7 @@ pub(super) fn core() -> HashMap<String, Node> {
_ => Err(Error::ExpectedList), _ => Err(Error::ExpectedList),
}?; }?;
Ok(Node::Closure { Ok(Node::Function {
params: args, params: args,
env: env.clone(), env: env.clone(),
body: Box::new(body), body: Box::new(body),

View file

@ -47,24 +47,7 @@ pub fn eval_node(env: &Environment, ast_node: Node) -> Result<Node> {
let args = list.collect(); let args = list.collect();
func(env, args)? func(env, args)?
} }
Node::Function {
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::<Result<Vec<Node>>>()?;
let records = params.iter().map(|k| k.to_owned()).zip(args).collect();
let env = env.wrap(records);
eval_node(&env, *(*body).clone())?
}
Node::Closure {
params, params,
env: inner_env, env: inner_env,
body, body,

View file

@ -18,10 +18,6 @@ pub enum Node {
Vector(Vec<Node>), Vector(Vec<Node>),
Map(HashMap<String, Node>), Map(HashMap<String, Node>),
Function { Function {
params: Vec<String>,
body: Box<Node>,
},
Closure {
params: Vec<String>, params: Vec<String>,
env: Environment, env: Environment,
body: Box<Node>, body: Box<Node>,
@ -72,11 +68,7 @@ impl std::fmt::Display for Node {
write!(f, "{{{res}}}") write!(f, "{{{res}}}")
} }
Node::Function { params: _, body: _ } => { Node::Function {
write!(f, "#<function>")
}
Node::Closure {
params: _, params: _,
env: _, env: _,
body: _, body: _,