pebblisp/src/object.h

113 lines
2.5 KiB
C
Raw Normal View History

2020-05-05 13:42:28 -04:00
#ifndef OBJECT_H
#define OBJECT_H
#define MAX_TOK_LEN 10 // 11
2020-05-05 13:42:28 -04:00
#define MAX_TOK_CNT 128 // 128
#define MAX_ENV_ELM 15 // 50
enum errorCode {
2020-05-08 02:29:06 -04:00
MISMATCHED_PARENS,
2020-05-05 13:42:28 -04:00
BAD_LIST_OF_SYMBOL_STRINGS,
TYPE_LIST_NOT_CAUGHT,
NULL_ENV,
EMPTY_ENV,
2020-05-05 13:42:28 -04:00
BUILT_IN_NOT_FOUND,
2020-05-05 19:21:54 -04:00
NULL_PARSE,
NULL_LAMBDA_LIST,
2020-05-07 20:32:01 -04:00
NULL_MAP_ARGS,
LAMBDA_ARGS_NOT_LIST,
DID_NOT_FIND_SYMBOL,
2020-05-07 20:32:01 -04:00
BAD_TYPE,
UNEXPECTED_FORM
2020-05-05 13:42:28 -04:00
};
2020-05-07 20:32:01 -04:00
//#ifdef STANDALONE
static const char *errorText[] = {
2020-05-08 02:29:06 -04:00
"MISMATCHED_PARENS",
2020-05-07 20:32:01 -04:00
"BAD_LIST_OF_SYMBOL_STRINGS",
"TYPE_LIST_NOT_CAUGHT",
"NULL_ENV",
"EMPTY_ENV",
2020-05-07 20:32:01 -04:00
"BUILT_IN_NOT_FOUND",
"NULL_PARSE",
"NULL_LAMBDA_LIST",
"NULL_MAP_ARGS",
"LAMBDA_ARGS_NOT_LIST",
"DID_NOT_FIND_SYMBOL",
"BAD_TYPE",
"UNEXPECTED_FORM"
};
//#endif
#define MALLOC_FLAG 64
2020-05-05 19:21:54 -04:00
2020-05-05 13:42:28 -04:00
typedef enum Type {
TYPE_NUMBER,
TYPE_BOOL,
TYPE_LIST,
TYPE_FUNC,
TYPE_SYMBOL,
TYPE_LAMBDA,
2020-05-07 20:32:01 -04:00
TYPE_ERROR
2020-05-05 13:42:28 -04:00
} 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?
2020-05-05 13:42:28 -04:00
enum errorCode err;
};
};
// Maybe better as pointers?
2020-05-05 13:42:28 -04:00
struct Lambda {
Object params;
Object body;
};
char* stringObj(char *dest, const Object *obj);
void printList(const Object *list);
void printObj(const Object *obj);
void debugObj(const Object *obj);
2020-05-07 20:32:01 -04:00
void printErr(const Object *obj);
int wasMalloc(const Object *obj);
int getType(const Object *obj);
2020-05-05 13:42:28 -04:00
int isEmpty(const Object *obj);
2020-05-05 13:42:28 -04:00
Object *tail(const Object *listObj);
void insertIntoList(Object *dest, unsigned ind, const Object src);
2020-05-07 20:32:01 -04:00
void replaceListing(Object *list, int i, const Object src);
void nf_addToList(Object *dest, Object src);
void deleteList(Object *dest);
2020-05-05 13:42:28 -04:00
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);
2020-05-07 20:32:01 -04:00
void printAndClean(Object *target);
void allocObject(Object **spot, const Object src);
2020-05-05 19:21:54 -04:00
Object newObject(Type type);
2020-05-05 13:42:28 -04:00
Object listObject();
Object startList(const Object start);
2020-05-05 13:42:28 -04:00
Object lambdaObject();
Object symbolObject();
Object boolObject(int b);
Object numberObject(int num);
2020-05-05 19:21:54 -04:00
Object errorObject(enum errorCode err);
Object constructLambda(const Object *params, const Object *body);
2020-05-05 13:42:28 -04:00
// Object version of listLength()
Object len(Object obj1, Object ignore);
2020-05-05 13:42:28 -04:00
#endif