2020-05-05 13:42:28 -04:00
|
|
|
#ifndef OBJECT_H
|
|
|
|
#define OBJECT_H
|
|
|
|
|
|
|
|
#define MAX_TOK_LEN 4 // 11
|
|
|
|
#define MAX_TOK_CNT 128 // 128
|
|
|
|
#define MAX_ENV_ELM 15 // 50
|
|
|
|
|
|
|
|
enum errorCode {
|
|
|
|
BAD_LIST_OF_SYMBOL_STRINGS,
|
|
|
|
TYPE_LIST_NOT_CAUGHT,
|
|
|
|
NULL_ENV,
|
|
|
|
BUILT_IN_NOT_FOUND,
|
2020-05-05 19:21:54 -04:00
|
|
|
NULL_PARSE,
|
|
|
|
NULL_LAMBDA_LIST,
|
|
|
|
LAMBDA_ARGS_NOT_LIST
|
2020-05-05 13:42:28 -04:00
|
|
|
};
|
|
|
|
|
2020-05-05 19:21:54 -04:00
|
|
|
#ifdef STANDALONE
|
|
|
|
static const char *errorText[] = {
|
|
|
|
"BAD_LIST_OF_SYMBOL_STRINGS",
|
|
|
|
"TYPE_LIST_NOT_CAUGHT",
|
|
|
|
"NULL_ENV",
|
|
|
|
"BUILT_IN_NOT_FOUND",
|
|
|
|
"NULL_PARSE",
|
|
|
|
"NULL_LAMBDA_LIST",
|
|
|
|
"LAMBDA_ARGS_NOT_LIST"
|
|
|
|
};
|
|
|
|
#endif
|
|
|
|
|
2020-05-05 13:42:28 -04:00
|
|
|
typedef enum Type {
|
|
|
|
TYPE_NUMBER,
|
|
|
|
TYPE_BOOL,
|
|
|
|
TYPE_LIST,
|
|
|
|
TYPE_FUNC,
|
|
|
|
TYPE_SYMBOL,
|
|
|
|
TYPE_LAMBDA,
|
|
|
|
TYPE_ERROR // Currently unused
|
|
|
|
} Type;
|
|
|
|
|
|
|
|
typedef struct Object Object;
|
|
|
|
struct Lambda;
|
|
|
|
|
|
|
|
struct Object {
|
|
|
|
Type type;
|
|
|
|
Object *forward;
|
|
|
|
union {
|
|
|
|
int number;
|
|
|
|
Object *list;
|
|
|
|
char name[MAX_TOK_LEN];
|
|
|
|
Object (*func)(Object, Object);
|
|
|
|
struct Lambda *lambda; // Maybe better as not a pointer
|
|
|
|
enum errorCode err;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
// Maybe better as pointers
|
|
|
|
struct Lambda {
|
|
|
|
Object params;
|
|
|
|
Object body;
|
|
|
|
};
|
|
|
|
|
|
|
|
char* stringObj(char *dest, const Object *obj);
|
|
|
|
void printList(const Object *list);
|
|
|
|
void printObj(const Object *obj);
|
|
|
|
|
|
|
|
Object *tail(const Object *listObj);
|
|
|
|
void addToList(Object *dest, Object src);
|
|
|
|
void deleteList(const Object *dest);
|
|
|
|
int listLength(const Object *listObj);
|
|
|
|
Object *itemAt(const Object *listObj, int n);
|
|
|
|
void copyList(Object *dest, const Object *src);
|
|
|
|
|
2020-05-05 19:21:54 -04:00
|
|
|
void cleanObject(Object *target);
|
|
|
|
|
|
|
|
Object newObject(Type type);
|
2020-05-05 13:42:28 -04:00
|
|
|
Object listObject();
|
|
|
|
Object numberObject(int num);
|
|
|
|
Object lambdaObject();
|
2020-05-05 19:21:54 -04:00
|
|
|
Object constructLambda(const Object *params, const Object *body);
|
|
|
|
Object errorObject(enum errorCode err);
|
2020-05-05 13:42:28 -04:00
|
|
|
|
|
|
|
#endif
|