scheme.h 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. /* SCHEME.H */
  2. #ifndef _SCHEME_H
  3. #define _SCHEME_H
  4. #include <stdio.h>
  5. /*
  6. * Default values for #define'd symbols
  7. */
  8. #ifndef STANDALONE /* If used as standalone interpreter */
  9. # define STANDALONE 1
  10. #endif
  11. #ifndef _MSC_VER
  12. # define USE_STRCASECMP 1
  13. # ifndef USE_STRLWR
  14. # define USE_STRLWR 1
  15. # endif
  16. # define SCHEME_EXPORT
  17. #else
  18. # define USE_STRCASECMP 0
  19. # define USE_STRLWR 0
  20. # ifdef _SCHEME_SOURCE
  21. # define SCHEME_EXPORT __declspec(dllexport)
  22. # else
  23. # define SCHEME_EXPORT __declspec(dllimport)
  24. # endif
  25. #endif
  26. #if USE_NO_FEATURES
  27. # define USE_MATH 0
  28. # define USE_CHAR_CLASSIFIERS 0
  29. # define USE_ASCII_NAMES 0
  30. # define USE_STRING_PORTS 0
  31. # define USE_ERROR_HOOK 0
  32. # define USE_TRACING 0
  33. # define USE_COLON_HOOK 0
  34. # define USE_DL 0
  35. # define USE_PLIST 0
  36. #endif
  37. /*
  38. * Leave it defined if you want continuations, and also for the Sharp Zaurus.
  39. * Undefine it if you only care about faster speed and not strict Scheme compatibility.
  40. */
  41. #define USE_SCHEME_STACK
  42. #if USE_DL
  43. # define USE_INTERFACE 1
  44. #endif
  45. #ifndef USE_MATH /* If math support is needed */
  46. # define USE_MATH 1
  47. #endif
  48. #ifndef USE_CHAR_CLASSIFIERS /* If char classifiers are needed */
  49. # define USE_CHAR_CLASSIFIERS 1
  50. #endif
  51. #ifndef USE_ASCII_NAMES /* If extended escaped characters are needed */
  52. # define USE_ASCII_NAMES 1
  53. #endif
  54. #ifndef USE_STRING_PORTS /* Enable string ports */
  55. # define USE_STRING_PORTS 1
  56. #endif
  57. #ifndef USE_TRACING
  58. # define USE_TRACING 1
  59. #endif
  60. #ifndef USE_PLIST
  61. # define USE_PLIST 0
  62. #endif
  63. /* To force system errors through user-defined error handling (see *error-hook*) */
  64. #ifndef USE_ERROR_HOOK
  65. # define USE_ERROR_HOOK 1
  66. #endif
  67. #ifndef USE_COLON_HOOK /* Enable qualified qualifier */
  68. # define USE_COLON_HOOK 1
  69. #endif
  70. #ifndef USE_STRCASECMP /* stricmp for Unix */
  71. # define USE_STRCASECMP 0
  72. #endif
  73. #ifndef USE_STRLWR
  74. # define USE_STRLWR 1
  75. #endif
  76. #ifndef STDIO_ADDS_CR /* Define if DOS/Windows */
  77. # define STDIO_ADDS_CR 0
  78. #endif
  79. #ifndef INLINE
  80. # define INLINE
  81. #endif
  82. #ifndef USE_INTERFACE
  83. # define USE_INTERFACE 0
  84. #endif
  85. typedef struct scheme scheme;
  86. typedef struct cell *pointer;
  87. typedef void * (*func_alloc)(size_t);
  88. typedef void (*func_dealloc)(void *);
  89. /* num, for generic arithmetic */
  90. typedef struct num {
  91. char is_fixnum;
  92. union {
  93. long ivalue;
  94. double rvalue;
  95. } value;
  96. } num;
  97. SCHEME_EXPORT scheme *scheme_init_new();
  98. SCHEME_EXPORT scheme *scheme_init_new_custom_alloc(func_alloc malloc, func_dealloc free);
  99. SCHEME_EXPORT int scheme_init(scheme *sc);
  100. SCHEME_EXPORT int scheme_init_custom_alloc(scheme *sc, func_alloc, func_dealloc);
  101. SCHEME_EXPORT void scheme_deinit(scheme *sc);
  102. void scheme_set_input_port_file(scheme *sc, FILE *fin);
  103. void scheme_set_input_port_string(scheme *sc, char *start, char *past_the_end);
  104. SCHEME_EXPORT void scheme_set_output_port_file(scheme *sc, FILE *fin);
  105. void scheme_set_output_port_string(scheme *sc, char *start, char *past_the_end);
  106. SCHEME_EXPORT void scheme_load_file(scheme *sc, FILE *fin);
  107. SCHEME_EXPORT void scheme_load_string(scheme *sc, const char *cmd);
  108. void scheme_apply0(scheme *sc, const char *procname);
  109. SCHEME_EXPORT pointer scheme_apply1(scheme *sc, const char *procname, pointer);
  110. void scheme_set_external_data(scheme *sc, void *p);
  111. SCHEME_EXPORT void scheme_define(scheme *sc, pointer env, pointer symbol, pointer value);
  112. typedef pointer (*foreign_func)(scheme *, pointer);
  113. pointer _cons(scheme *sc, pointer a, pointer b, int immutable);
  114. pointer mk_integer(scheme *sc, long num);
  115. pointer mk_real(scheme *sc, double num);
  116. pointer mk_symbol(scheme *sc, const char *name);
  117. pointer gensym(scheme *sc);
  118. pointer mk_string(scheme *sc, const char *str);
  119. pointer mk_counted_string(scheme *sc, const char *str, int len);
  120. pointer mk_character(scheme *sc, int c);
  121. pointer mk_foreign_func(scheme *sc, foreign_func f);
  122. void putstr(scheme *sc, const char *s);
  123. #if USE_INTERFACE
  124. struct scheme_interface {
  125. void (*scheme_define)(scheme *sc, pointer env, pointer symbol, pointer value);
  126. pointer (*cons)(scheme *sc, pointer a, pointer b);
  127. pointer (*immutable_cons)(scheme *sc, pointer a, pointer b);
  128. pointer (*reserve_cells)(scheme *sc, int n);
  129. pointer (*mk_integer)(scheme *sc, long num);
  130. pointer (*mk_real)(scheme *sc, double num);
  131. pointer (*mk_symbol)(scheme *sc, const char *name);
  132. pointer (*gensym)(scheme *sc);
  133. pointer (*mk_string)(scheme *sc, const char *str);
  134. pointer (*mk_counted_string)(scheme *sc, const char *str, int len);
  135. pointer (*mk_character)(scheme *sc, int c);
  136. pointer (*mk_vector)(scheme *sc, int len);
  137. pointer (*mk_foreign_func)(scheme *sc, foreign_func f);
  138. void (*putstr)(scheme *sc, const char *s);
  139. void (*putcharacter)(scheme *sc, int c);
  140. int (*is_string)(pointer p);
  141. char *(*string_value)(pointer p);
  142. int (*is_number)(pointer p);
  143. num (*nvalue)(pointer p);
  144. long (*ivalue)(pointer p);
  145. double (*rvalue)(pointer p);
  146. int (*is_integer)(pointer p);
  147. int (*is_real)(pointer p);
  148. int (*is_character)(pointer p);
  149. long (*charvalue)(pointer p);
  150. int (*is_vector)(pointer p);
  151. long (*vector_length)(pointer vec);
  152. void (*fill_vector)(pointer vec, pointer elem);
  153. pointer (*vector_elem)(pointer vec, int ielem);
  154. pointer (*set_vector_elem)(pointer vec, int ielem, pointer newel);
  155. int (*is_port)(pointer p);
  156. int (*is_pair)(pointer p);
  157. pointer (*pair_car)(pointer p);
  158. pointer (*pair_cdr)(pointer p);
  159. pointer (*set_car)(pointer p, pointer q);
  160. pointer (*set_cdr)(pointer p, pointer q);
  161. int (*is_symbol)(pointer p);
  162. char *(*symname)(pointer p);
  163. int (*is_syntax)(pointer p);
  164. int (*is_proc)(pointer p);
  165. int (*is_foreign)(pointer p);
  166. char *(*syntaxname)(pointer p);
  167. int (*is_closure)(pointer p);
  168. int (*is_macro)(pointer p);
  169. pointer (*closure_code)(pointer p);
  170. pointer (*closure_env)(pointer p);
  171. int (*is_continuation)(pointer p);
  172. int (*is_promise)(pointer p);
  173. int (*is_environment)(pointer p);
  174. int (*is_immutable)(pointer p);
  175. void (*setimmutable)(pointer p);
  176. void (*load_file)(scheme *sc, FILE *fin);
  177. void (*load_string)(scheme *sc, const char *input);
  178. };
  179. #endif
  180. #endif