diff options
author | Matthias Andreas Benkard <matthias@benkard.de> | 2008-06-30 21:04:34 +0200 |
---|---|---|
committer | Matthias Andreas Benkard <matthias@benkard.de> | 2008-06-30 21:04:34 +0200 |
commit | eb968f738101d87b2d0e170d757ea10a27bbb867 (patch) | |
tree | 3841ee113f61a48ce9ba6f08bc42e2ecd1418152 /MLKLexicalEnvironment.m | |
parent | ee2d7b7d9bb5ab87dc7986407ee44acd6bcad429 (diff) |
Create environments upon binding when needed.
Diffstat (limited to 'MLKLexicalEnvironment.m')
-rw-r--r-- | MLKLexicalEnvironment.m | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/MLKLexicalEnvironment.m b/MLKLexicalEnvironment.m index 1f7d920..78a3b93 100644 --- a/MLKLexicalEnvironment.m +++ b/MLKLexicalEnvironment.m @@ -115,11 +115,25 @@ static MLKLexicalEnvironment *global_environment; -(void) addValue:(id)value forSymbol:(MLKSymbol *)symbol { + if (_parent && _variables == _parent->_variables) + _variables = [[MLKEnvironment alloc] initWithParent:_parent->_variables + values:nil]; + else if (!_variables) + _variables = [[MLKEnvironment alloc] initWithParent:nil + values:nil]; + [_variables addValue:value forSymbol:symbol]; } -(void) addBindingForSymbol:(MLKSymbol *)symbol { + if (_parent && _variables == _parent->_variables) + _variables = [[MLKEnvironment alloc] initWithParent:_parent->_variables + values:nil]; + else if (!_variables) + _variables = [[MLKEnvironment alloc] initWithParent:nil + values:nil]; + [_variables addBindingForSymbol:symbol]; } @@ -145,6 +159,13 @@ static MLKLexicalEnvironment *global_environment; -(void) addFunction:(id)value forSymbol:(MLKSymbol *)symbol { + if (_parent && _functions == _parent->_functions) + _functions = [[MLKEnvironment alloc] initWithParent:_parent->_functions + values:nil]; + else if (!_functions) + _functions = [[MLKEnvironment alloc] initWithParent:nil + values:nil]; + [_functions addValue:value forSymbol:symbol]; } |