aboutsummaryrefslogtreecommitdiff
path: root/src/interp.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/interp.h')
-rw-r--r--src/interp.h42
1 files changed, 26 insertions, 16 deletions
diff --git a/src/interp.h b/src/interp.h
index 221eb19..15a8851 100644
--- a/src/interp.h
+++ b/src/interp.h
@@ -8,7 +8,6 @@
#include "algds/vec.h"
#include "sexp.h"
-
struct interp;
typedef struct interp Interp;
@@ -33,7 +32,6 @@ struct interp {
char *errmsg_buf;
};
-
void Interp_init(Interp *self);
void Interp_free(Interp *self);
SExp* Interp_ref(Interp *self, SExpRef ref);
@@ -41,26 +39,38 @@ void Interp_gc(Interp *self, SExpRef tmp_root);
void Interp_add_primitive(Interp *self, const char *name, LispPrimitive fn);
void Interp_add_userfunc(Interp *self, const char *name, LispUserFunc fn);
-SExpRef primitive_if(Interp *interp, SExpRef sexp);
-SExpRef primitive_cond(Interp *interp, SExpRef sexp);
-SExpRef primitive_progn(Interp *interp, SExpRef sexp);
-SExpRef primitive_setq(Interp *interp, SExpRef sexp);
-SExpRef primitive_let(Interp *interp, SExpRef sexp);
-
-SExpRef userfunc_list(Interp *interp, SExpRef sexp);
-SExpRef userfunc_car(Interp *interp, SExpRef sexp);
-SExpRef userfunc_cdr(Interp *interp, SExpRef sexp);
-SExpRef userfunc_cons(Interp *interp, SExpRef sexp);
-SExpRef userfunc_add(Interp *interp, SExpRef sexp);
-SExpRef userfunc_sub(Interp *interp, SExpRef sexp);
-
-void lisp_defun(Interp *interp, const char *name, SExpRef val);
+#define REF(_x) (Interp_ref(interp, (_x)))
+#define CONS(_x, _y) (lisp_cons(interp, (_x), (_y)))
+#define NILP(_x) (lisp_nilp(interp, (_x)))
+#define EVAL(_x) (lisp_eval(interp, (_x)))
+#define TRUEP(_x) (lisp_truep(interp, (_x)))
+#define ERRORP(_x) (REF((_x))->type == kErrSExp)
+#define VALTYPE(_x) (REF((_x))->type)
+#define NIL (interp->nil)
+#define CAR(_x) (lisp_car(interp, (_x)))
+#define CDR(_x) (lisp_cdr(interp, (_x)))
+#define CADR(_x) CAR(CDR(_x))
+#define CDDR(_x) CDR(CDR(_x))
+#define CADDR(_x) CAR(CDDR(_x))
+#define CDDDR(_x) CDR(CDDR(_x))
+#define CADDDR(_x) CAR(CDDDR(_x))
+#define CDDDDR(_x) CDR(CDDDR(_x))
+#define CADDDDR(_x) CAR(CDDDDR(_x))
+#define CDDDDDR(_x) CDR(CDDDDR(_x))
+#define PUSH_REG(_x) { interp->reg = CONS((_x), interp->reg); }
+#define POP_REG() { interp->reg = CDR(interp->reg); }
+
+void lisp_setfun(Interp *interp, const char *name, SExpRef val);
void lisp_print(Interp *interp, SExpRef obj, FILE *fp);
SExpRef lisp_lookup(Interp *interp, const char *name);
SExpRef lisp_lookup_func(Interp *interp, const char *name);
SExpRef lisp_cons(Interp *interp, SExpRef a, SExpRef b);
SExpRef lisp_dup(Interp *interp, SExpRef arg);
bool lisp_nilp(Interp *interp, SExpRef arg);
+bool lisp_truep(Interp *interp, SExpRef a);
+bool lisp_check_list(Interp *interp, SExpRef lst);
+SExpRef lisp_setq(Interp *interp, const char *name, SExpRef val);
+int lisp_length(Interp *interp, SExpRef lst);
SExpRef lisp_car(Interp *interp, SExpRef arg);
SExpRef lisp_cdr(Interp *interp, SExpRef arg);
SExpRef lisp_eval(Interp *interp, SExpRef arg);