Add lexical scope and redefining variables in functions (#3015)
* Fix to allow variable shadowing inside functions * Implement closures * Fix KCL test code to not reference future tag definition * Remove tag declarator from function parameters This is an example where the scoping change revealed a subtle issue with TagDeclarators. You cannot bind a new tag using a function parameter. The issue is that evaluating a TagDeclarator like $foo binds an identifier to its corresponding TagIdentifier, but returns the TagDeclarator. If you have a TagDeclarator passed in as a parameter to a function, you can never get its corresponding TagIdentifier. This seems like a case where TagDeclarator evaluation needs to be revisited, especially now that we have scoped tags. * Fix to query return, functions, and tag declarator AST nodes correctly
This commit is contained in:
@ -31,7 +31,7 @@ use crate::{
|
||||
ast::types::FunctionExpression,
|
||||
docs::StdLibFn,
|
||||
errors::KclError,
|
||||
executor::{MemoryItem, SketchGroup, SketchSurface},
|
||||
executor::{MemoryItem, ProgramMemory, SketchGroup, SketchSurface},
|
||||
std::kcl_stdlib::KclStdLibFn,
|
||||
};
|
||||
pub use args::Args;
|
||||
@ -281,6 +281,7 @@ pub enum Primitive {
|
||||
pub struct FnAsArg<'a> {
|
||||
pub func: &'a crate::executor::MemoryFunction,
|
||||
pub expr: Box<FunctionExpression>,
|
||||
pub memory: Box<ProgramMemory>,
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
|
Reference in New Issue
Block a user