#ifndef PEBBLISP_H #define PEBBLISP_H #include "object.h" #include "env.h" #ifndef STANDALONE #include #define printd(...) copySlice(NULL, NULL) #endif #ifdef DEBUG #define printd(...) printf(__VA_ARGS__) #else #define printd(...) copySlice(NULL, NULL) #endif struct Slice { const char *text; char length; }; typedef struct Result { Object obj; struct Slice *slices; } Result; Object eval(const Object *obj, struct Environment *env); Result parse(struct Slice *slices); Result readSeq(struct Slice *slices); Object parseAtom(struct Slice *slice); Object parseEval(const char *input, struct Environment *env); void evalForms(Object *destList, const Object *src, struct Environment *env); void copySlice(char * dest, struct Slice *src); Object evalLambdaArgs(const Object *arg_forms); // Slices void copySlice(char * dest, struct Slice *src); void debugSlice(struct Slice *s); #define BASIC_OP(_name) \ Object _name(Object obj1, Object obj2, struct Environment *env); BASIC_OP(add); BASIC_OP(sub); BASIC_OP(mul); BASIC_OP(dvi); BASIC_OP(mod); BASIC_OP(equ); BASIC_OP(gth); BASIC_OP(lth); #undef BASIC_OP Object catObjects(const Object obj1, const Object obj2, struct Environment *env); Object filter(Object obj1, Object obj2, struct Environment *env); Object append(Object list, Object newElement, struct Environment *env); Object prepend(Object list, Object newElement, struct Environment *env); Object at(Object index, Object list, struct Environment *env); Object rest(Object list, Object ignore, struct Environment *env); Object reverse(Object _list, Object ignore, struct Environment *ignore2); Object isNum(Object test, Object ignore, struct Environment *ignore2); Object isString(Object test, Object ignore, struct Environment *ignore2); Object isErr(Object test, Object ignore, struct Environment *ignore2); Object print(Object p, Object ignore, struct Environment *ignore2); Object pChar(Object c, Object i1, struct Environment *i2); Object printEnvO(Object i1, Object i2, struct Environment *env); Object parseEvalO(Object text, Object ignore, struct Environment *env); #ifdef STANDALONE Object takeInput(Object i1, Object i2, struct Environment *i3); #endif #endif