summaryrefslogtreecommitdiff
path: root/MLKInterpreter.m
diff options
context:
space:
mode:
authorMatthias Andreas Benkard <matthias@benkard.de>2008-07-02 14:49:02 +0200
committerMatthias Andreas Benkard <matthias@benkard.de>2008-07-02 14:49:02 +0200
commit6b498f0726a38efc7802dad29a47633ad5aed6e7 (patch)
tree1fbe420d5dc6feb6cf1c05ef07b667c9628313f2 /MLKInterpreter.m
parente2b4ef8369024d4cc4749f4262e8d39a59e3859d (diff)
Interpreter: Implement SET and %FSET.
Diffstat (limited to 'MLKInterpreter.m')
-rw-r--r--MLKInterpreter.m42
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: ...