Handle lambdas

This commit is contained in:
Greg Shuflin 2021-10-24 19:05:41 -07:00
parent 4193971303
commit 37ce12b6d8

View File

@ -19,6 +19,7 @@ enum ScopeType {
Function { Function {
name: Rc<String> name: Rc<String>
}, },
Lambda,
//TODO add some notion of a let-like scope? //TODO add some notion of a let-like scope?
} }
@ -195,6 +196,23 @@ impl<'a> ASTVisitor for ScopeResolver<'a> {
NamedStruct { name, fields: _ } => { NamedStruct { name, fields: _ } => {
self.lookup_name_in_scope(name); self.lookup_name_in_scope(name);
}, },
Lambda { params, body, .. } => {
let param_names = params.iter().map(|param| param.name.clone());
//TODO need to properly handle closure scope, this is currently broken
//let mut new_scope = self.lexical_scopes.new_scope(Some(ScopeType::Function { name: signature.name.clone() }));
let mut new_scope = ScopeStack::new(Some(ScopeType::Lambda));
for (n, param) in param_names.enumerate().into_iter() {
new_scope.insert(param, NameType::Param(n as u8));
}
let mut new_resolver = ScopeResolver {
symbol_table: self.symbol_table,
lexical_scopes: new_scope,
};
walk_block(&mut new_resolver, body);
return Recursion::Stop;
}
_ => (), _ => (),
} }
Recursion::Continue Recursion::Continue