scheme-private.h

Go to the documentation of this file.
00001 /* scheme-private.h */
00002 
00008 #ifndef _SCHEME_PRIVATE_H
00009 #define _SCHEME_PRIVATE_H
00010 
00011 #include "scheme.h"
00012 
00013 enum scheme_port_kind { 
00014   port_free=0, 
00015   port_file=1, 
00016   port_string=2, 
00017   port_input=16, 
00018   port_output=32 
00019 };
00020 
00021 typedef struct port {
00022   unsigned char kind;
00023   union {
00024     struct {
00025       FILE *file;
00026       int closeit;
00027     } stdio;
00028     struct {
00029       char *start;
00030       char *past_the_end;
00031       char *curr;
00032     } string;
00033   } rep;
00034 } port;
00035 
00036 /* cell structure */
00037 struct cell {
00038   unsigned int _flag;
00039   union {
00040     struct {
00041       char   *_svalue;
00042       int   _length;
00043     } _string;
00044     num _number;
00045     port *_port;
00046     foreign_func _ff;
00047     struct {
00048       struct cell *_car;
00049       struct cell *_cdr;
00050     } _cons;
00051   } _object;
00052 };
00053 
00054 struct scheme {
00055 /* arrays for segments */
00056 func_alloc malloc;
00057 func_dealloc free;
00058 
00059 /* return code */
00060 int retcode;
00061 int tracing;
00062 
00063 #define CELL_SEGSIZE    5000  /* # of cells in one segment */
00064 #define CELL_NSEGMENT   10    /* # of segments for cells */
00065 char *alloc_seg[CELL_NSEGMENT];
00066 pointer cell_seg[CELL_NSEGMENT];
00067 int     last_cell_seg;
00068 
00069 /* We use 4 registers. */
00070 pointer args;            /* register for arguments of function */
00071 pointer envir;           /* stack register for current environment */
00072 pointer code;            /* register for current code */
00073 pointer dump;            /* stack register for next evaluation */
00074 
00075 int interactive_repl;    /* are we in an interactive REPL? */
00076 
00077 struct cell _sink;
00078 pointer sink;            /* when mem. alloc. fails */
00079 struct cell _NIL;
00080 pointer NIL;             /* special cell representing empty cell */
00081 struct cell _HASHT;
00082 pointer T;               /* special cell representing #t */
00083 struct cell _HASHF;
00084 pointer F;               /* special cell representing #f */
00085 struct cell _EOF_OBJ;
00086 pointer EOF_OBJ;         /* special cell representing end-of-file object */
00087 pointer oblist;          /* pointer to symbol table */
00088 pointer global_env;      /* pointer to global environment */
00089 
00090 /* global pointers to special symbols */
00091 pointer LAMBDA;               /* pointer to syntax lambda */
00092 pointer QUOTE;           /* pointer to syntax quote */
00093 
00094 pointer QQUOTE;               /* pointer to symbol quasiquote */
00095 pointer UNQUOTE;         /* pointer to symbol unquote */
00096 pointer UNQUOTESP;       /* pointer to symbol unquote-splicing */
00097 pointer FEED_TO;         /* => */
00098 pointer COLON_HOOK;      /* *colon-hook* */
00099 pointer ERROR_HOOK;      /* *error-hook* */
00100 pointer SHARP_HOOK;  /* *sharp-hook* */
00101 
00102 pointer free_cell;       /* pointer to top of free cells */
00103 long    fcells;          /* # of free cells */
00104 
00105 pointer inport;
00106 pointer outport;
00107 pointer save_inport;
00108 pointer loadport;
00109 
00110 #define MAXFIL 64
00111 port load_stack[MAXFIL];     /* Stack of open files for port -1 (LOADing) */
00112 int nesting_stack[MAXFIL];
00113 int file_i;
00114 int nesting;
00115 
00116 char    gc_verbose;      /* if gc_verbose is not zero, print gc status */
00117 char    no_memory;       /* Whether mem. alloc. has failed */
00118 
00119 #define LINESIZE 1024
00120 char    linebuff[LINESIZE];
00121 char    strbuff[256];
00122 
00123 FILE *tmpfp;
00124 int tok;
00125 int print_flag;
00126 pointer value;
00127 int op;
00128 
00129 void *ext_data;     /* For the benefit of foreign functions */
00130 long gensym_cnt;
00131 
00132 struct scheme_interface *vptr;
00133 void *dump_base;      /* pointer to base of allocated dump stack */
00134 int dump_size;               /* number of frames allocated for dump stack */
00135 };
00136 
00137 /* operator code */
00138 enum scheme_opcodes { 
00139 #define _OP_DEF(A,B,C,D,E,OP) OP, 
00140 #include "opdefines.h" 
00141   OP_MAXDEFINED 
00142 }; 
00143 
00144 
00145 #define cons(sc,a,b) _cons(sc,a,b,0)
00146 #define immutable_cons(sc,a,b) _cons(sc,a,b,1)
00147 
00148 int is_string(pointer p);
00149 char *string_value(pointer p);
00150 int is_number(pointer p);
00151 num nvalue(pointer p);
00152 long ivalue(pointer p);
00153 double rvalue(pointer p);
00154 int is_integer(pointer p);
00155 int is_real(pointer p);
00156 int is_character(pointer p);
00157 long charvalue(pointer p);
00158 int is_vector(pointer p);
00159 
00160 int is_port(pointer p);
00161 
00162 int is_pair(pointer p);
00163 pointer pair_car(pointer p);
00164 pointer pair_cdr(pointer p);
00165 pointer set_car(pointer p, pointer q);
00166 pointer set_cdr(pointer p, pointer q);
00167 
00168 int is_symbol(pointer p);
00169 char *symname(pointer p);
00170 int hasprop(pointer p);
00171 
00172 int is_syntax(pointer p);
00173 int is_proc(pointer p);
00174 int is_foreign(pointer p);
00175 char *syntaxname(pointer p);
00176 int is_closure(pointer p);
00177 #ifdef USE_MACRO
00178 int is_macro(pointer p);
00179 #endif
00180 pointer closure_code(pointer p);
00181 pointer closure_env(pointer p);
00182 
00183 int is_continuation(pointer p);
00184 int is_promise(pointer p);
00185 int is_environment(pointer p);
00186 int is_immutable(pointer p);
00187 void setimmutable(pointer p);
00188 
00189 #endif

Generated on Tue Aug 19 00:14:49 2008 for gerbv by  doxygen 1.5.6