summaryrefslogtreecommitdiff
path: root/MLKInterpreter.m
diff options
context:
space:
mode:
authorMatthias Andreas Benkard <matthias@benkard.de>2008-07-02 17:43:00 +0200
committerMatthias Andreas Benkard <matthias@benkard.de>2008-07-02 17:43:00 +0200
commita579f93456607eae5d6bdaef32befbfd80bf5d59 (patch)
tree6b1e9b82b0c2762bf87c50d4db64a63598ab6af0 /MLKInterpreter.m
parentd889c23d138e8df1342bb50bc472e0315b821491 (diff)
SETQ: Recognise symbol macros as assignment locations.
Diffstat (limited to 'MLKInterpreter.m')
-rw-r--r--MLKInterpreter.m18
1 files changed, 17 insertions, 1 deletions
diff --git a/MLKInterpreter.m b/MLKInterpreter.m
index 4ecd42d..229661d 100644
--- a/MLKInterpreter.m
+++ b/MLKInterpreter.m
@@ -69,6 +69,7 @@ static MLKSymbol *FUNCALL;
static MLKSymbol *EVAL;
static MLKSymbol *QUOTE;
static MLKSymbol *SETQ;
+static MLKSymbol *SETF;
static MLKSymbol *SET;
static MLKSymbol *_FSET;
static MLKSymbol *PROGV;
@@ -96,6 +97,7 @@ static MLKSymbol *_LAMBDA;
EVAL = [cl intern:@"EVAL"];
QUOTE = [cl intern:@"QUOTE"];
SETQ = [cl intern:@"SETQ"];
+ SETF = [cl intern:@"SETF"];
SET = [cl intern:@"SET"];
_FSET = [sys intern:@"%FSET"];
PROGV = [cl intern:@"PROGV"];
@@ -361,7 +363,21 @@ static MLKSymbol *_LAMBDA;
if (![program cdr])
return [NSArray arrayWithObject:[NSNull null]];
- //FIXME: Don't forget handling symbol macros correctly.
+ if ([context symbolNamesSymbolMacro:symbol])
+ {
+ id macrofun = [context macroForSymbol:program];
+ id expansion = [macrofun applyToArray:
+ [NSArray arrayWithObjects:
+ program, context, nil]];
+ return [self eval:
+ [MLKCons cons:SETF
+ with:
+ [MLKCons cons:expansion
+ with:
+ [[program cdr] cdr]]]
+ inLexicalContext:context
+ withEnvironment:lexenv];
+ }
if ([context variableIsLexical:symbol])
[lexenv setValue:value forSymbol:symbol];