#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 ERRMSG(x) ((x).value.errmsg) typedef struct object object; typedef struct cons cons; typedef enum { nilObject, consObject, numberObject, symbolObject, errorObject } dataType; struct object { dataType type; union { char *errmsg; 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);