#include /* NETLISP -- event driven simulator embedded in 'lisp' -- cjt (3/80) */ #define OBJPAGESIZE 128 /* number of objects per page */ #if defined(vax) || defined(mips) /* basic lisp object -- 32 bit version */ typedef long object; typedef int value; struct obj_fields { int obj_val:24, obj_type:7, obj_gc:1; }; #define VALUE(x) (((struct obj_fields *)&(x))->obj_val) #ifdef mips /* expecting addresses to only occupy the lower 24 bits is a total hack. * In mips, data lives in 0x10000000, code in 0x00000000. */ #define ADDR(x) ((VALUE(x) == 0 || TYPE(x) == 5) ? \ VALUE(x) : VALUE(x) | 0x10000000) #else #define ADDR(x) VALUE(x) #endif #define SETVALUE(x,y) VALUE(x)=(value)(y) #define TYPE(x) (((struct obj_fields *)&(x))->obj_type) #define SETTYPE(x,y) TYPE(x)=(y) #define GCBIT(x) (((struct obj_fields *)&(x))->obj_gc) #define SETGCBIT(x) GCBIT(x)=1 #define CLEARGCBIT(x) GCBIT(x)=0 #define SVALUE(x) ((VALUE(x)<<8)>>8) #define MAXFIX 8388607 /* 2^23 - 1 */ #define FLOSIZE 3 /* number of objects in a flonum structure */ #define CONSSIZE 2 /* number of objects in a cons structure */ #define SYMSIZE 5 /* number of objects in a symbol structure */ #endif #if defined(mc68000) || defined(sparc) /* basic lisp object -- 32 bit version for big-endians */ typedef long object; typedef int value; struct obj_fields { int obj_gc:1, obj_type:7, obj_val:24; }; #define VALUE(x) (((struct obj_fields *)&(x))->obj_val) #define ADDR(x) VALUE(x) #define SETVALUE(x,y) VALUE(x)=(value)(y) #define TYPE(x) (((struct obj_fields *)&(x))->obj_type) #define SETTYPE(x,y) TYPE(x)=(y) #define GCBIT(x) (((struct obj_fields *)&(x))->obj_gc) #define SETGCBIT(x) GCBIT(x)=1 #define CLEARGCBIT(x) GCBIT(x)=0 #define SVALUE(x) ((VALUE(x)<<8)>>8) #define MAXFIX 8388607 /* 2^23 - 1 */ #define FLOSIZE 3 /* number of objects in a flonum structure */ #define CONSSIZE 2 /* number of objects in a cons structure */ #define SYMSIZE 5 /* number of objects in a symbol structure */ #endif #ifdef pdp10 /* basic lisp object -- 36 bit version */ typedef int object; typedef int value; struct obj_fields { int obj_gc:1, obj_type:7, obj_val:28; }; #define VALUE(x) (((struct obj_fields *)&(x))->obj_val) #define ADDR(x) VALUE(x) #define SETVALUE(x,y) VALUE(x)=(value)(y) #define TYPE(x) (((struct obj_fields *)&(x))->obj_type) #define SETTYPE(x,y) TYPE(x)=(y) #define GCBIT(x) (((struct obj_fields *)&(x))->obj_gc) #define SETGCBIT(x) GCBIT(x)=1 #define CLEARGCBIT(x) GCBIT(x)=0 #define SVALUE(x) ((VALUE(x)<<8)>>8) #define MAXFIX 134217727 /* 2^27 - 1 */ #define FLOSIZE 2 /* number of objects in a flonum structure */ #define CONSSIZE 2 /* number of objects in a cons structure */ #define SYMSIZE 5 /* number of objects in a symbol structure */ #endif #ifdef cray /* basic lisp object for cray */ typedef long object; typedef int value; #define VALUE(x) ((x) & 0xFFFFFF) #define ADDR(x) VALUE(x) #define SETVALUE(x,y) (x) &= ~0xFFFFFF; (x) |= ((value)(y) & 0xFFFFFF) #define TYPE(x) (((x)>>24) & 0x7F) #define SETTYPE(x,y) (x) &= ~0x7F000000; (x) |= (((value)(y) & 0x7F) << 24) #define GCBIT(x) ((x) & 0x80000000) #define SETGCBIT(x) (x) |= 0x80000000 #define CLEARGCBIT(x) (x) &= ~0x80000000 #define SVALUE(x) (((x) & 0x800000) ? (((-1) & ~0xFFFFFF) | (x)) : (x)) #define MAXFIX 8388607 /* 2^23 - 1 */ #define FLOSIZE 2 /* number of objects in a flonum structure */ #define CONSSIZE 2 /* number of objects in a cons structure */ #define SYMSIZE 5 /* number of objects in a symbol structure */ #endif typedef object *objptr; typedef object page[OBJPAGESIZE]; /* primitive types */ #define FREE 0 #define FIXNUM 1 #define FLONUM 2 #define SYMBOL 3 #define CONS 4 #define SUBR 5 #define STRING 6 #define NODE 7 #define TRANS 8 #define NTYPES 9 /* number of primitive types defined */ /* type testing macros */ #define ISFIX(x) (TYPE(x) == FIXNUM) #define ISFLOAT(x) (TYPE(x) == FLONUM) #define ISSYMBOL(x) (TYPE(x) == SYMBOL) #define ISCONS(x) (TYPE(x) == CONS) #define ISSUBR(x) (TYPE(x) == SUBR) #define MARKED(x) (GCBIT(x) != 0) struct Cons { object car, cdr; }; /* your basic lisp cell */ #define CAR(x) (((cons *)VALUE(x))->car) #define CDR(x) (((cons *)VALUE(x))->cdr) struct Symbol { object sym_value; /* value cell */ object sym_function; /* function defintion */ object sym_plist; /* property list */ object sym_pname; /* print name */ object sym_hlink; /* hash link */ }; struct Flonum { object flo_header; /* some place to put mark bit */ double flo_value; }; typedef struct Cons cons; typedef struct Symbol symbol; typedef struct Flonum flonum; /* external declarations */ extern object push(); /* in stack.c */ extern object pop(); extern object nth_stack(); extern object nth_exch(); extern page *al_page(); /* in storage.c */ extern object al_obj(); extern char *al_bytes(); extern object nil,t; extern object intern(); /* in symbol.c */ extern object m_string(); extern object obj_read(); /* in read.c */ extern object eval(); /* in eval.c */ extern object ev_list(); #ifdef vax11c #define WOPEN(fname) fdopen(creat(fname,0,"rat=cr","rfm=var"),"w") #endif #ifndef vax11c #define WOPEN(fname) fopen(fname,"w") #endif