#pragma once #define TYPE(x) ((x).type) #define CONS(x) ((x).value.consCell) #define CAR(x) (((x).value.consCell)->car) #define CDR(x) (((x).value.consCell)->cdr) #define NUM(x) ((x).value.number) #define SYM(x) ((x).value.symbol) #define ERR(x) ((x).value.err) typedef enum { nilObject, consObject, numberObject, symbolObject, errorObject } dataType; typedef enum { improperListError, typeError, unrecognizedSymbolError, notApplicableError, divisionByZeroError, argumentNumberError, syntaxError } error; typedef struct object object; typedef struct cons cons; struct object { dataType type; union { error err; char *symbol; long long int number; cons *consCell; } value; }; struct cons { object car; object cdr; }; int properList(object list); int listLength(object list); void deleteObject(object input); object copyObject(object input);