#ifndef _OBJ_H #define _OBJ_H #include #include "mem.h" /* OBJECT TYPES */ #define TNULL MAKE_ARRAY_TYPE(0x01) #define TNULLVEC MAKE_ARRAY_TYPE(0x02) #define TNULLSTR MAKE_ARRAY_TYPE(0x03) #define TFALSE MAKE_ARRAY_TYPE(0x04) #define TTRUE MAKE_ARRAY_TYPE(0x05) #define TPRIM MAKE_ARRAY_TYPE(0x06) #define TSYNTAX MAKE_ARRAY_TYPE(0x07) #define TOPCODE MAKE_ARRAY_TYPE(0x08) #define TREFERENCE MAKE_ARRAY_TYPE(0x09) /* PARSING TYPES (USED BY THE LEX ONLY) */ #define TOPENPAREN MAKE_ARRAY_TYPE(0x0a) #define TCLOSEPAREN MAKE_ARRAY_TYPE(0x0b) #define TDOT MAKE_ARRAY_TYPE(0x0c) #define TQUOTE MAKE_ARRAY_TYPE(0x0d) #define TQUASIQUOTE MAKE_ARRAY_TYPE(0x0e) #define TUNQUOTE MAKE_ARRAY_TYPE(0x0f) #define THEX MAKE_ARRAY_TYPE(0x10) #define TBIN MAKE_ARRAY_TYPE(0x11) #define TSTRING MAKE_ARRAY_TYPE(0x12) #define TCHAR MAKE_ARRAY_TYPE(0x13) /* MORE OBJECT TYPES */ #define TINTEGER MAKE_ARRAY_TYPE(0x14) #define TREAL MAKE_ARRAY_TYPE(0x15) #define TSYMBOL MAKE_ARRAY_TYPE(0x16) #define TEOF MAKE_ARRAY_TYPE(0x17) #define TREPL MAKE_ARRAY_TYPE(0x18) #define TPAIR MAKE_VECTOR_TYPE(0x01) #define TNOP MAKE_VECTOR_TYPE(0x02) #define TVECTOR MAKE_VECTOR_TYPE(0x03) #define TPROCEDURE MAKE_VECTOR_TYPE(0x04) #define TCLOSURE MAKE_VECTOR_TYPE(0x05) #define TENV MAKE_VECTOR_TYPE(0x06) #define TBINDING MAKE_VECTOR_TYPE(0x07) #define TCONTINUATION MAKE_VECTOR_TYPE(0x08) #define TPUSH MAKE_VECTOR_TYPE(0x09) #define TPUSHBINDING MAKE_VECTOR_TYPE(0x0a) #define TPUSHREFERENCE MAKE_VECTOR_TYPE(0x0b) #define TSETBINDING MAKE_VECTOR_TYPE(0x0c) #define TSETREFERENCE MAKE_VECTOR_TYPE(0x0d) #define TAPPLY MAKE_VECTOR_TYPE(0x0e) #define TCALL MAKE_VECTOR_TYPE(0x0f) #define TCOMB MAKE_VECTOR_TYPE(0x10) #define TRET MAKE_VECTOR_TYPE(0x11) #define TPOPACC MAKE_VECTOR_TYPE(0x13) #define TIF MAKE_VECTOR_TYPE(0x14) #define TOR MAKE_VECTOR_TYPE(0x15) #define TDEFINE MAKE_VECTOR_TYPE(0x16) #define TSTACK MAKE_STACK_TYPE(0x01) #define TPORT MAKE_DIRTY_TYPE(0x01) #define is_prim(o) (obj_type(o)==TPRIM) #define is_syntax(o) (obj_type(o)==TSYNTAX) #define is_reference(o) (obj_type(o)==TREFERENCE) #define is_string(o) (obj_type(o)==TSTRING) #define is_integer(o) (obj_type(o)==TINTEGER) #define is_real(o) (obj_type(o)==TREAL) #define is_symbol(o) (obj_type(o)==TSYMBOL) #define is_eof(o) (obj_type(o)==TEOF) #define is_pair(o) (obj_type(o)==TPAIR) #define is_vector(o) (obj_type(o)==TVECTOR) #define is_closure(o) (obj_type(o)==TCLOSURE) #define is_env(o) (obj_type(o)==TENV) #define is_binding(o) (obj_type(o)==TBINDING) #define is_continuation(o)(obj_type(o)==TCONTINUATION) #define is_port(o) (obj_type(o)==TPORT) /* IMPLEMENTATION CONSTANTS */ extern OBJ null, nullvec, nullstr, false, true, eof; /* REGISTER ALIASES */ #define acc r0 #define signals r8 #define ip r9 #define env ra #define thread rb #define active rc #define asleep rd #define blocked re #define tge rf void tree_copy (void); /* COPIES TREE IN ACC INTO ACC */ void new_integer (S64 l); void new_real (R64 r); void new_symbol (char *s, U32 len); void new_prim (void(*fp)()); void new_syntax (void(*fp)()); void new_opcode (void(*fp)()); void new_reference (U32 generation, U32 offset); void new_pair (void); void new_comb (void); void new_vector (U32 l); void new_procedure (void); void new_closure (void); void new_binding (void); void new_continuation(void); void new_combination(void); void new_push (void); void new_setbinding (void); void new_setreference (void); void new_eval (void); void new_apply (void); void new_popacc (void); void new_if (void); void new_or (void); void new_define (void); void new_stack(U32 size); void new_port(int fp, char *filename, int flags, int mode); #define push(o) stack_push(o) #define pop() stack_pop() #define peek() stack_peek(0) #define car(a) mem_vec_obj((a),0) #define cdr(a) mem_vec_obj((a),1) S64 obj_integer (OBJ a); R64 obj_real (OBJ a); char* obj_symbol (OBJ a); U32 obj_symbol_len (OBJ a); U32 obj_vector_len (OBJ a); OBJ* obj_vector_ref (OBJ o, U32 i); U32 reference_generation (OBJ o); U32 reference_offset (OBJ o); FP obj_function (OBJ a); OBJ closure_env (OBJ p); OBJ closure_args (OBJ p); OBJ closure_body (OBJ p); OBJ env_parent (OBJ e); OBJ env_symbols (OBJ e); OBJ env_value (OBJ e, U32 i); OBJ binding_symbol (OBJ p); OBJ binding_value (OBJ p); int obj_port (OBJ o); #endif