diff options
author | Matthias Benkard <mulk@minimulk.mst-plus> | 2008-08-18 16:13:54 +0200 |
---|---|---|
committer | Matthias Benkard <mulk@minimulk.mst-plus> | 2008-08-18 16:13:54 +0200 |
commit | eec88254d7e37ecb07b0503a9e87abfb81ce2460 (patch) | |
tree | d96aa76e24b4b090383623134b35eaf6a10f3431 /MLKLexicalEnvironment.m | |
parent | 5cd4de577c08637cb5d78d1c3376b1ff80e74065 (diff) | |
parent | 054dc70426505f72a1e9856c9e48c0ae3349d68d (diff) |
Merge branch 'master' of http://matthias.benkard.de/code/mulklisp
Diffstat (limited to 'MLKLexicalEnvironment.m')
-rw-r--r-- | MLKLexicalEnvironment.m | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/MLKLexicalEnvironment.m b/MLKLexicalEnvironment.m index ca6b4a9..723c955 100644 --- a/MLKLexicalEnvironment.m +++ b/MLKLexicalEnvironment.m @@ -107,17 +107,43 @@ static MLKLexicalEnvironment *global_environment; -(id) valueForSymbol:(MLKSymbol *)symbol { - return [_variables valueForSymbol:symbol]; + if (![_variables environmentForSymbol:symbol] + || [_variables environmentForSymbol:symbol] == global_environment->_variables) + { + id *cell = [[MLKLexicalContext globalContext] bindingCellForSymbol:symbol]; + return [*cell value]; + } + else + { + return [_variables valueForSymbol:symbol]; + } } -(void) setValue:(id)value forSymbol:(MLKSymbol *)symbol { - [_variables setValue:value forSymbol:symbol]; + if (![_variables environmentForSymbol:symbol] + || [_variables environmentForSymbol:symbol] == global_environment->_variables) + { + id *cell = [[MLKLexicalContext globalContext] bindingCellForSymbol:symbol]; + [*cell setValue:value forSymbol:symbol]; + } + else + { + [_variables setValue:value forSymbol:symbol]; + } } -(void) addValue:(id)value forSymbol:(MLKSymbol *)symbol { - [_variables addValue:value forSymbol:symbol]; + if (self == global_environment) + { + id *cell = [[MLKLexicalContext globalContext] bindingCellForSymbol:symbol]; + [*cell setValue:value forSymbol:symbol]; + } + else + { + [_variables addValue:value forSymbol:symbol]; + } } -(void) addBindingForSymbol:(MLKSymbol *)symbol |