summaryrefslogtreecommitdiff
path: root/MLKInterpreter.m
diff options
context:
space:
mode:
authorMatthias Andreas Benkard <matthias@benkard.de>2008-08-24 20:23:53 +0200
committerMatthias Andreas Benkard <matthias@benkard.de>2008-08-24 20:23:53 +0200
commitcad4fe0ea19220fd4eddeccec5bd5102498711eb (patch)
tree204e8c38750f53b387fb224aa0df95c334860e22 /MLKInterpreter.m
parent601eca17f57383a70077c50ac7e4079daa30bacf (diff)
Interpreter: Handle forms returning no values correctly.
Diffstat (limited to 'MLKInterpreter.m')
-rw-r--r--MLKInterpreter.m52
1 files changed, 28 insertions, 24 deletions
diff --git a/MLKInterpreter.m b/MLKInterpreter.m
index f4718e8..9871cfa 100644
--- a/MLKInterpreter.m
+++ b/MLKInterpreter.m
@@ -60,6 +60,19 @@
#endif
+#define RETURN_VALUE(thing) \
+{ return [NSArray arrayWithObject:nullify(thing)]; }
+
+static id
+PRIMARY (id array)
+{
+ if ([array count] > 0)
+ return [array objectAtIndex:0];
+ else
+ return nil;
+}
+
+
@implementation MLKInterpreter
+(void) initialize
{
@@ -68,10 +81,9 @@
+(id) compile:(id)object inContext:(MLKLexicalContext *)context
{
- return [[self eval:object
- inLexicalContext:context
- withEnvironment:[MLKLexicalEnvironment globalEnvironment]]
- objectAtIndex:0];
+ return PRIMARY ([self eval:object
+ inLexicalContext:context
+ withEnvironment:[MLKLexicalEnvironment globalEnvironment]]);
}
+(NSArray*) eval:(id)program
@@ -159,10 +171,6 @@
@end
-#define RETURN_VALUE(thing) \
-{ return [NSArray arrayWithObject:nullify(thing)]; }
-
-
@implementation MLKForm (MLKInterpretation)
-(NSArray *) interpret
{
@@ -243,7 +251,7 @@
NSArray *values;
MLKDynamicContext *newctx;
- catchTag = [[_tagForm interpretWithEnvironment:env] objectAtIndex:0];
+ catchTag = PRIMARY ([_tagForm interpretWithEnvironment:env]);
NS_DURING
{
@@ -335,7 +343,7 @@
@implementation MLKIfForm (MLKInterpretation)
-(NSArray *) reallyInterpretWithEnvironment:(MLKLexicalEnvironment *)env
{
- id cndval = denullify([[_conditionForm interpretWithEnvironment:env] objectAtIndex:0]);
+ id cndval = denullify(PRIMARY([_conditionForm interpretWithEnvironment:env]));
if (cndval)
return [_consequentForm interpretWithEnvironment:env];
else
@@ -420,9 +428,8 @@
for (i = 0; i < [_variableBindingForms count]; i++)
{
id variable = [[_variableBindingForms objectAtIndex:i] name];
- id value = [[[_variableBindingForms objectAtIndex:i]
- interpretWithEnvironment:env]
- objectAtIndex:0];
+ id value = PRIMARY([[_variableBindingForms objectAtIndex:i]
+ interpretWithEnvironment:env]);
if ([_bodyContext variableIsLexical:variable])
{
[newenv addValue:value forSymbol:variable];
@@ -481,7 +488,7 @@
{
NSMutableArray *results = [NSMutableArray array];
int i;
- id <MLKFuncallable> function = [[_functionForm interpretWithEnvironment:env] objectAtIndex:0];
+ id <MLKFuncallable> function = PRIMARY ([_functionForm interpretWithEnvironment:env]);
for (i = 0; i < [_bodyForms count]; i++)
{
@@ -521,10 +528,8 @@
@implementation MLKProgVForm (MLKInterpretation)
-(NSArray *) reallyInterpretWithEnvironment:(MLKLexicalEnvironment *)env
{
- id variables = [[_variableListForm interpretWithEnvironment:env]
- objectAtIndex:0];
- id values = [[_valueListForm interpretWithEnvironment:env]
- objectAtIndex:0];
+ id variables = PRIMARY([_variableListForm interpretWithEnvironment:env]);
+ id values = PRIMARY([_valueListForm interpretWithEnvironment:env]);
MLKDynamicContext *dynctx;
id result;
@@ -581,7 +586,7 @@
NSArray *values;
NSDictionary *userInfo;
- catchTag = [[_tagForm interpretWithEnvironment:env] objectAtIndex:0];
+ catchTag = PRIMARY([_tagForm interpretWithEnvironment:env]);
values = [_valueForm interpretWithEnvironment:env];
userInfo = [NSDictionary dictionaryWithObjectsAndKeys:
@@ -641,9 +646,8 @@
for (i = 0; i < [_argumentForms count]; i++)
{
- id result = [[[_argumentForms objectAtIndex:i]
- interpretWithEnvironment:env]
- objectAtIndex:0];
+ id result = PRIMARY([[_argumentForms objectAtIndex:i]
+ interpretWithEnvironment:env]);
[args addObject:result];
}
@@ -687,7 +691,7 @@
for (i = 0; i < [_variables count]; i++)
{
id symbol = denullify([_variables objectAtIndex:i]);
- value = [[[_valueForms objectAtIndex:i] interpretWithEnvironment:env] objectAtIndex:0];
+ value = PRIMARY([[_valueForms objectAtIndex:i] interpretWithEnvironment:env]);
if ([_context variableIsLexical:symbol])
[env setValue:value forSymbol:symbol];
@@ -713,7 +717,7 @@
for (i = 0; i < [_functionNames count]; i++)
{
id symbol = denullify([_functionNames objectAtIndex:i]);
- value = [[[_valueForms objectAtIndex:i] interpretWithEnvironment:env] objectAtIndex:0];
+ value = PRIMARY([[_valueForms objectAtIndex:i] interpretWithEnvironment:env]);
if ([_context symbolNamesFunction:symbol])
{