summaryrefslogtreecommitdiff
path: root/MLKLexicalEnvironment.m
diff options
context:
space:
mode:
authorMatthias Benkard <mulk@minimulk.mst-plus>2008-08-18 16:13:54 +0200
committerMatthias Benkard <mulk@minimulk.mst-plus>2008-08-18 16:13:54 +0200
commiteec88254d7e37ecb07b0503a9e87abfb81ce2460 (patch)
treed96aa76e24b4b090383623134b35eaf6a10f3431 /MLKLexicalEnvironment.m
parent5cd4de577c08637cb5d78d1c3376b1ff80e74065 (diff)
parent054dc70426505f72a1e9856c9e48c0ae3349d68d (diff)
Merge branch 'master' of http://matthias.benkard.de/code/mulklisp
Diffstat (limited to 'MLKLexicalEnvironment.m')
-rw-r--r--MLKLexicalEnvironment.m32
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