#include #include #include #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; }