gerbv  2.10.1-dev~93f1b5
scheme-private.h
Go to the documentation of this file.
1 /* scheme-private.h */
2 
8 #ifndef _SCHEME_PRIVATE_H
9 #define _SCHEME_PRIVATE_H
10 
11 #include "scheme.h"
12 
13 enum scheme_port_kind {
14  port_free = 0,
15  port_file = 1,
16  port_string = 2,
17  port_input = 16,
18  port_output = 32
19 };
20 
21 typedef struct port {
22  unsigned char kind;
23 
24  union {
25  struct {
26  FILE* file;
27  int closeit;
28  } stdio;
29 
30  struct {
31  char* start;
32  char* past_the_end;
33  char* curr;
34  } string;
35  } rep;
36 } port;
37 
38 /* cell structure */
39 struct cell {
40  unsigned int _flag;
41 
42  union {
43  struct {
44  char* _svalue;
45  int _length;
46  } _string;
47 
48  num _number;
49  port* _port;
50  foreign_func _ff;
51 
52  struct {
53  struct cell* _car;
54  struct cell* _cdr;
55  } _cons;
56  } _object;
57 };
58 
59 struct scheme {
60  /* arrays for segments */
61  func_alloc malloc;
62  func_dealloc free;
63 
64  /* return code */
65  int retcode;
66  int tracing;
67 
68 #define CELL_SEGSIZE 5000 /* # of cells in one segment */
69 #define CELL_NSEGMENT 10 /* # of segments for cells */
70  char* alloc_seg[CELL_NSEGMENT];
71  pointer cell_seg[CELL_NSEGMENT];
72  int last_cell_seg;
73 
74  /* We use 4 registers. */
75  pointer args; /* register for arguments of function */
76  pointer envir; /* stack register for current environment */
77  pointer code; /* register for current code */
78  pointer dump; /* stack register for next evaluation */
79 
80  int interactive_repl; /* are we in an interactive REPL? */
81 
82  struct cell _sink;
83  pointer sink; /* when mem. alloc. fails */
84  struct cell _NIL;
85  pointer NIL; /* special cell representing empty cell */
86  struct cell _HASHT;
87  pointer T; /* special cell representing #t */
88  struct cell _HASHF;
89  pointer F; /* special cell representing #f */
90  struct cell _EOF_OBJ;
91  pointer EOF_OBJ; /* special cell representing end-of-file object */
92  pointer oblist; /* pointer to symbol table */
93  pointer global_env; /* pointer to global environment */
94 
95  /* global pointers to special symbols */
96  pointer LAMBDA; /* pointer to syntax lambda */
97  pointer QUOTE; /* pointer to syntax quote */
98 
99  pointer QQUOTE; /* pointer to symbol quasiquote */
100  pointer UNQUOTE; /* pointer to symbol unquote */
101  pointer UNQUOTESP; /* pointer to symbol unquote-splicing */
102  pointer FEED_TO; /* => */
103  pointer COLON_HOOK; /* *colon-hook* */
104  pointer ERROR_HOOK; /* *error-hook* */
105  pointer SHARP_HOOK; /* *sharp-hook* */
106 
107  pointer free_cell; /* pointer to top of free cells */
108  long fcells; /* # of free cells */
109 
110  pointer inport;
111  pointer outport;
112  pointer save_inport;
113  pointer loadport;
114 
115 #define MAXFIL 64
116  port load_stack[MAXFIL]; /* Stack of open files for port -1 (LOADing) */
117  int nesting_stack[MAXFIL];
118  int file_i;
119  int nesting;
120 
121  char gc_verbose; /* if gc_verbose is not zero, print gc status */
122  char no_memory; /* Whether mem. alloc. has failed */
123 
124 #define LINESIZE 1024
125  char linebuff[LINESIZE];
126  char strbuff[256];
127 
128  FILE* tmpfp;
129  int tok;
130  int print_flag;
131  pointer value;
132  int op;
133 
134  void* ext_data; /* For the benefit of foreign functions */
135  long gensym_cnt;
136 
137  struct scheme_interface* vptr;
138  void* dump_base; /* pointer to base of allocated dump stack */
139  int dump_size; /* number of frames allocated for dump stack */
140 };
141 
142 /* operator code */
143 enum scheme_opcodes {
144 #define _OP_DEF(A, B, C, D, E, OP) OP,
145 #include "opdefines.h"
146  OP_MAXDEFINED
147 };
148 
149 #define cons(sc, a, b) _cons(sc, a, b, 0)
150 #define immutable_cons(sc, a, b) _cons(sc, a, b, 1)
151 
152 int is_string(pointer p);
153 char* string_value(pointer p);
154 int is_number(pointer p);
155 num nvalue(pointer p);
156 long ivalue(pointer p);
157 double rvalue(pointer p);
158 int is_integer(pointer p);
159 int is_real(pointer p);
160 int is_character(pointer p);
161 long charvalue(pointer p);
162 int is_vector(pointer p);
163 
164 int is_port(pointer p);
165 
166 int is_pair(pointer p);
167 pointer pair_car(pointer p);
168 pointer pair_cdr(pointer p);
169 pointer set_car(pointer p, pointer q);
170 pointer set_cdr(pointer p, pointer q);
171 
172 int is_symbol(pointer p);
173 char* symname(pointer p);
174 int hasprop(pointer p);
175 
176 int is_syntax(pointer p);
177 int is_proc(pointer p);
178 int is_foreign(pointer p);
179 char* syntaxname(pointer p);
180 int is_closure(pointer p);
181 #ifdef USE_MACRO
182 int is_macro(pointer p);
183 #endif
184 pointer closure_code(pointer p);
185 pointer closure_env(pointer p);
186 
187 int is_continuation(pointer p);
188 int is_promise(pointer p);
189 int is_environment(pointer p);
190 int is_immutable(pointer p);
191 void setimmutable(pointer p);
192 
193 #endif
More support data for the TinyScheme parser.
Header info for the TinyScheme compiler.