scheme-private.h 4.5 KB

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