46 lines
722 B
C
46 lines
722 B
C
#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);
|