diff options
author | Matthias Andreas Benkard <matthias@benkard.de> | 2008-07-02 14:49:02 +0200 |
---|---|---|
committer | Matthias Andreas Benkard <matthias@benkard.de> | 2008-07-02 14:49:02 +0200 |
commit | 6b498f0726a38efc7802dad29a47633ad5aed6e7 (patch) | |
tree | 1fbe420d5dc6feb6cf1c05ef07b667c9628313f2 /MLKInterpreter.m | |
parent | e2b4ef8369024d4cc4749f4262e8d39a59e3859d (diff) |
Interpreter: Implement SET and %FSET.
Diffstat (limited to 'MLKInterpreter.m')
-rw-r--r-- | MLKInterpreter.m | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/MLKInterpreter.m b/MLKInterpreter.m index 95381d0..5dd6cc7 100644 --- a/MLKInterpreter.m +++ b/MLKInterpreter.m @@ -69,6 +69,8 @@ static MLKSymbol *FUNCALL; static MLKSymbol *EVAL; static MLKSymbol *QUOTE; static MLKSymbol *SETQ; +static MLKSymbol *SET; +static MLKSymbol *_FSET; static MLKSymbol *PROGV; static MLKSymbol *VALUES; static MLKSymbol *_DEFMACRO; @@ -94,6 +96,8 @@ static MLKSymbol *_LAMBDA; EVAL = [cl intern:@"EVAL"]; QUOTE = [cl intern:@"QUOTE"]; SETQ = [cl intern:@"SETQ"]; + SET = [cl intern:@"SET"]; + _FSET = [sys intern:@"%FSET"]; PROGV = [cl intern:@"PROGV"]; VALUES = [cl intern:@"VALUES"]; _DEFMACRO = [sys intern:@"%DEFMACRO"]; @@ -350,6 +354,44 @@ static MLKSymbol *_LAMBDA; //FIXME: ... //FIXME: Don't forget handling symbol macros correctly. } + else if (car == SET) + { + MLKDynamicContext *ctx = [MLKDynamicContext currentContext]; + id symbol = [[self eval:[[program cdr] car] + inLexicalContext:context + withEnvironment:lexenv] + objectAtIndex:0]; + id value = [[self eval:[[[program cdr] cdr] car] + inLexicalContext:context + withEnvironment:lexenv] + objectAtIndex:0]; + + if ([ctx bindingForSymbol:symbol]) + [ctx setValue:value forSymbol:symbol]; + else + [[MLKDynamicContext globalContext] + addValue:value forSymbol:symbol]; + + return [NSArray arrayWithObject:symbol]; + } + else if (car == _FSET) + { + // Like SET, but for the function cell. + id symbol = [[self eval:[[program cdr] car] + inLexicalContext:context + withEnvironment:lexenv] + objectAtIndex:0]; + id value = [[self eval:[[[program cdr] cdr] car] + inLexicalContext:context + withEnvironment:lexenv] + objectAtIndex:0]; + + [[MLKLexicalContext globalContext] addFunction:symbol]; + [[MLKLexicalEnvironment globalEnvironment] addFunction:value + forSymbol:symbol]; + + return [NSArray arrayWithObject:symbol]; + } else if (car == TAGBODY) { //FIXME: ... |