From f5348e04a2d52fbf707a7def7ebcee944795dede Mon Sep 17 00:00:00 2001 From: Matthias Andreas Benkard Date: Sun, 15 Jun 2008 12:48:38 +0200 Subject: MLKDynamicContext, MLKEnvironment: Add -addBinding:, -boundp:, and -makunbound:. --- MLKEnvironment.m | 55 +++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 49 insertions(+), 6 deletions(-) (limited to 'MLKEnvironment.m') diff --git a/MLKEnvironment.m b/MLKEnvironment.m index 8c26519..8488dd2 100644 --- a/MLKEnvironment.m +++ b/MLKEnvironment.m @@ -16,14 +16,23 @@ * along with this program. If not, see . */ -#import #import +#import +#import #import "MLKEnvironment.h" #import "MLKUndefinedVariableException.h" +static id UNBOUND; + + @implementation MLKEnvironment ++(void) initialize +{ + UNBOUND = [[NSObject alloc] init]; +} + -(MLKEnvironment *) init { return [self initWithParent:nil bindings:nil]; @@ -60,7 +69,7 @@ -(void) setBinding:(MLKSymbol *)symbol to:(id)value inEnvironment:(MLKEnvironment *)env { - if ([[_bindings allKeys] containsObject:symbol]) + if ([_bindings objectForKey:symbol]) [_bindings setObject:value forKey:symbol]; else if (_parent) @@ -78,8 +87,18 @@ -(id) valueForBinding:(MLKSymbol *)symbol inEnvironment:(MLKEnvironment *)env { - if ([[_bindings allKeys] containsObject:symbol]) - return [_bindings objectForKey:symbol]; + id value; + if ((value = [_bindings objectForKey:symbol])) + { + if (value == [NSNull null]) + return nil; + else if (value == UNBOUND) + [[[MLKUndefinedVariableException alloc] initWithEnvironment:env + variableName:symbol] + raise]; + else + return value; + } else if (_parent) return [_parent valueForBinding:symbol]; @@ -87,7 +106,7 @@ [[[MLKUndefinedVariableException alloc] initWithEnvironment:env variableName:symbol] raise]; - + return nil; // avoid a stupid compiler warning } @@ -101,9 +120,14 @@ [_bindings setObject:value forKey:symbol]; } +-(void) addBinding:(MLKSymbol *)symbol +{ + [_bindings setObject:UNBOUND forKey:symbol]; +} + -(MLKEnvironment *) environmentForBinding:(MLKSymbol *)symbol { - if ([[_bindings allKeys] containsObject:symbol]) + if ([_bindings objectForKey:symbol]) return self; else if (_parent) return [_parent environmentForBinding:symbol]; @@ -111,6 +135,25 @@ return nil; } +-(BOOL) boundp:(MLKSymbol *)symbol +{ + id value; + if ((value = [_bindings objectForKey:symbol])) + return (value != UNBOUND); + else if (_parent) + return [_parent boundp:symbol]; + else + return NO; +} + +-(void) makunbound:(MLKSymbol *)symbol +{ + if ([_bindings objectForKey:symbol]) + [_bindings setObject:UNBOUND forKey:symbol]; + else if (_parent) + return [_parent makunbound:symbol]; +} + -(void) dealloc { RELEASE (_bindings); -- cgit v1.2.3