Add eval
This commit is contained in:
+29
-5
@@ -111,6 +111,17 @@ static ALWAYS_INLINE bool OBJECT_MARKED_P(LispVal *val) {
|
||||
return ((LispObject *) val)->gc.mark;
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE void SET_OBJECT_HAS_LOCAL_REFERENCE(LispVal *val,
|
||||
bool has_local_ref) {
|
||||
assert(OBJECTP(val));
|
||||
((LispObject *) val)->gc.has_local_ref = has_local_ref;
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE bool OBJECT_HAS_LOCAL_REFERENCE_P(LispVal *val) {
|
||||
assert(OBJECTP(val));
|
||||
return ((LispObject *) val)->gc.has_local_ref;
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE LispValType TYPE_OF(LispVal *val) {
|
||||
if (FIXNUMP(val)) {
|
||||
return TYPE_FIXNUM;
|
||||
@@ -131,8 +142,9 @@ static ALWAYS_INLINE bool LISP_TYPEP(LispVal *val, LispValType type) {
|
||||
}
|
||||
}
|
||||
|
||||
noreturn void signal_type_error(LispVal *obj, size_t count,
|
||||
const LispValType types[count]);
|
||||
noreturn void
|
||||
internal_CHECK_TYPE_signal_type_error(LispVal *obj, size_t count,
|
||||
const LispValType types[count]);
|
||||
static ALWAYS_INLINE void internal_CHECK_TYPE(LispVal *obj, size_t count,
|
||||
LispValType v1, LispValType v2,
|
||||
LispValType v3, LispValType v4,
|
||||
@@ -144,7 +156,7 @@ static ALWAYS_INLINE void internal_CHECK_TYPE(LispVal *obj, size_t count,
|
||||
}
|
||||
}
|
||||
// Failed
|
||||
signal_type_error(obj, count, types);
|
||||
internal_CHECK_TYPE_signal_type_error(obj, count, types);
|
||||
}
|
||||
#define internal_CHECK_TYPE1(obj, type) internal_CHECK_TYPE(obj, v1, )
|
||||
#define internal_CHECK_TYPE_SUB(obj, count, a1, a2, a3, a4, a5, a6, ...) \
|
||||
@@ -154,6 +166,8 @@ static ALWAYS_INLINE void internal_CHECK_TYPE(LispVal *obj, size_t count,
|
||||
TYPE_FIXNUM, TYPE_FIXNUM, TYPE_FIXNUM, \
|
||||
TYPE_FIXNUM, TYPE_FIXNUM, TYPE_FIXNUM)
|
||||
|
||||
noreturn void signal_type_error(LispVal *obj, LispVal *typespec);
|
||||
|
||||
#define DEFOBJTYPE(Name, NAME, NAME_P, body) \
|
||||
typedef struct { \
|
||||
LispObject header; \
|
||||
@@ -218,6 +232,8 @@ DEFOBJTYPE(Vector, VECTOR, VECTORP, {
|
||||
const size_t internal_F##cname##_docstr_len = sizeof(doc) - 1; \
|
||||
LispVal *Q##cname; \
|
||||
LispVal *F##cname cargs
|
||||
#define DEFSPECIAL(cname, lisp_name, cargs, lisp_args, doc) \
|
||||
DEFUN(cname, lisp_name, cargs, lisp_args, doc)
|
||||
|
||||
#define REGISTER_GLOBAL_SYMBOL(cname) \
|
||||
{ \
|
||||
@@ -231,6 +247,14 @@ DEFOBJTYPE(Vector, VECTOR, VECTORP, {
|
||||
((LispSymbol *) Q##cname)->function = BUILTIN_FUNCTION_OBJ(cname); \
|
||||
}
|
||||
|
||||
#define REGISTER_GLOBAL_SPECIAL(cname) \
|
||||
{ \
|
||||
REGISTER_GLOBAL_SYMBOL(cname); \
|
||||
((LispSymbol *) Q##cname)->function = BUILTIN_FUNCTION_OBJ(cname); \
|
||||
((LispFunction *) ((LispSymbol *) Q##cname)->function) \
|
||||
->flags.no_eval_args = true; \
|
||||
}
|
||||
|
||||
DECLARE_SYMBOL(nil);
|
||||
DECLARE_SYMBOL(t);
|
||||
DECLARE_SYMBOL(unbound);
|
||||
@@ -242,6 +266,7 @@ static ALWAYS_INLINE bool NILP(LispVal *val) {
|
||||
// Some core functions
|
||||
DECLARE_FUNCTION(id, (LispVal * obj));
|
||||
DECLARE_FUNCTION(eq, (LispVal * obj1, LispVal *obj2));
|
||||
DECLARE_FUNCTION(quote, (LispVal * form));
|
||||
|
||||
// TODO probably move these to another file
|
||||
LispVal *make_vector(LispVal **data, size_t length, bool take);
|
||||
@@ -249,8 +274,7 @@ DECLARE_FUNCTION(make_symbol, (LispVal * name));
|
||||
DECLARE_FUNCTION(intern, (LispVal * name));
|
||||
DECLARE_FUNCTION(symbol_function, (LispVal * sym, LispVal *resolve));
|
||||
|
||||
// TODO these are actually special-forms
|
||||
DECLARE_SYMBOL(quote);
|
||||
// Defined in lisp code (eventually) but used in read.c
|
||||
DECLARE_SYMBOL(backquote);
|
||||
DECLARE_SYMBOL(comma);
|
||||
DECLARE_SYMBOL(comma_at);
|
||||
|
||||
Reference in New Issue
Block a user