cirilisp/eval.c

95 lines
1.6 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "util.h"
#include "symtable.h"
object apply(object function, object parameters);
object eval(object input)
{
object result;
if (TYPE(input) == nilObject || TYPE(input) == numberObject ||
TYPE(input) == errorObject)
{
result = input;
}
else if (TYPE(input) == symbolObject)
{
if (symbolExists(SYM(input)))
{
result = input;
}
else
{
deleteObject(input);
TYPE(result) = errorObject;
ERR(result) = unrecognizedSymbolError;
}
}
else if (TYPE(input) == consObject)
{
if (!properList(input))
{
deleteObject(input);
TYPE(result) = errorObject;
ERR(result) = improperListError;
}
object *currentCell = &input;
int noErrors = 1;
while (TYPE(*currentCell) != nilObject)
{
CAR(*currentCell) = eval(CAR(*currentCell));
if (TYPE(CAR(*currentCell)) == errorObject)
{
noErrors = 0;
TYPE(result) = errorObject;
ERR(result) = ERR(CAR(*currentCell));
break;
}
currentCell = &CDR(*currentCell);
}
if (noErrors)
{
result = apply(CAR(input), CDR(input));
}
deleteObject(input);
}
return result;
}
object apply(object function, object parameters)
{
object result;
if (TYPE(function) != symbolObject)
{
deleteObject(function);
TYPE(result) = errorObject;
ERR(result) = notApplicableError;
}
else if (symbolExists(SYM(function)))
{
object(*f)();
if ((f = internalFunction(SYM(function))) != NULL)
{
result = f(parameters);
}
}
else
{
deleteObject(function);
TYPE(result) = errorObject;
ERR(result) = unrecognizedSymbolError;
}
return result;
}