From 6b498f0726a38efc7802dad29a47633ad5aed6e7 Mon Sep 17 00:00:00 2001 From: Matthias Andreas Benkard Date: Wed, 2 Jul 2008 14:49:02 +0200 Subject: Interpreter: Implement SET and %FSET. --- MLKInterpreter.m | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) (limited to 'MLKInterpreter.m') 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: ... -- cgit v1.2.3