00001
00002
00008 #ifndef _SCHEME_H
00009 #define _SCHEME_H
00010
00011 #include <stdio.h>
00012
00013 #ifdef HAVE_CONFIG_H
00014 #include <config.h>
00015 #endif
00016
00017
00018
00019
00020 #ifndef STANDALONE
00021 # define STANDALONE 1
00022 #endif
00023
00024
00025 #if !defined(_MSC_VER) && !defined(__MINGW32__)
00026 # define USE_STRCASECMP 1
00027 # define USE_STRLWR 1
00028 # define SCHEME_EXPORT
00029 #else
00030 # define USE_STRCASECMP 0
00031 # define USE_STRLWR 0
00032 # if defined(__MINGW32__)
00033 # define SCHEME_EXPORT
00034 # else
00035 # ifdef _SCHEME_SOURCE
00036 # define SCHEME_EXPORT __declspec(dllexport)
00037 # else
00038 # define SCHEME_EXPORT __declspec(dllimport)
00039 # endif
00040 # endif
00041 #endif
00042
00043
00044
00045 #if USE_NO_FEATURES
00046 # define USE_MATH 0
00047 # define USE_CHAR_CLASSIFIERS 0
00048 # define USE_ASCII_NAMES 0
00049 # define USE_STRING_PORTS 0
00050 # define USE_ERROR_HOOK 0
00051 # define USE_TRACING 0
00052 # define USE_COLON_HOOK 0
00053 # define USE_DL 0
00054 # define USE_PLIST 0
00055 #endif
00056
00057
00058
00059
00060
00061 #define USE_SCHEME_STACK
00062
00063 #if USE_DL
00064 # define USE_INTERFACE 1
00065 #endif
00066
00067
00068 #ifndef USE_MATH
00069 # define USE_MATH 1
00070 #endif
00071
00072 #ifndef USE_CHAR_CLASSIFIERS
00073 # define USE_CHAR_CLASSIFIERS 1
00074 #endif
00075
00076 #ifndef USE_ASCII_NAMES
00077 # define USE_ASCII_NAMES 1
00078 #endif
00079
00080 #ifndef USE_STRING_PORTS
00081 # define USE_STRING_PORTS 1
00082 #endif
00083
00084 #ifndef USE_TRACING
00085 # define USE_TRACING 1
00086 #endif
00087
00088 #ifndef USE_PLIST
00089 # define USE_PLIST 0
00090 #endif
00091
00092
00093 #ifndef USE_ERROR_HOOK
00094 # define USE_ERROR_HOOK 1
00095 #endif
00096
00097 #ifndef USE_COLON_HOOK
00098 # define USE_COLON_HOOK 1
00099 #endif
00100
00101 #ifndef USE_STRCASECMP
00102 # define USE_STRCASECMP 0
00103 #endif
00104
00105 #ifndef USE_STRLWR
00106 # define USE_STRLWR 1
00107 #endif
00108
00109 #ifndef STDIO_ADDS_CR
00110 # define STDIO_ADDS_CR 0
00111 #endif
00112
00113 #ifndef INLINE
00114 # define INLINE
00115 #endif
00116
00117 #ifndef USE_INTERFACE
00118 # define USE_INTERFACE 0
00119 #endif
00120
00121 typedef struct scheme scheme;
00122 typedef struct cell *pointer;
00123
00124 typedef void * (*func_alloc)(size_t);
00125 typedef void (*func_dealloc)(void *);
00126
00127
00128 typedef struct num {
00129 char is_fixnum;
00130 union {
00131 long ivalue;
00132 double rvalue;
00133 } value;
00134 } num;
00135
00136 SCHEME_EXPORT scheme *scheme_init_new();
00137 SCHEME_EXPORT scheme *scheme_init_new_custom_alloc(func_alloc malloc, func_dealloc free);
00138 SCHEME_EXPORT int scheme_init(scheme *sc);
00139 SCHEME_EXPORT int scheme_init_custom_alloc(scheme *sc, func_alloc, func_dealloc);
00140 SCHEME_EXPORT void scheme_deinit(scheme *sc);
00141 void scheme_set_input_port_file(scheme *sc, FILE *fin);
00142 void scheme_set_input_port_string(scheme *sc, char *start, char *past_the_end);
00143 SCHEME_EXPORT void scheme_set_output_port_file(scheme *sc, FILE *fin);
00144 void scheme_set_output_port_string(scheme *sc, char *start, char *past_the_end);
00145 SCHEME_EXPORT void scheme_load_file(scheme *sc, FILE *fin);
00146 SCHEME_EXPORT void scheme_load_string(scheme *sc, const char *cmd);
00147 void scheme_apply0(scheme *sc, const char *procname);
00148 SCHEME_EXPORT pointer scheme_apply1(scheme *sc, const char *procname, pointer);
00149 void scheme_set_external_data(scheme *sc, void *p);
00150 SCHEME_EXPORT void scheme_define(scheme *sc, pointer env, pointer symbol, pointer value);
00151
00152 typedef pointer (*foreign_func)(scheme *, pointer);
00153
00154 pointer _cons(scheme *sc, pointer a, pointer b, int immutable);
00155 pointer mk_integer(scheme *sc, long num);
00156 pointer mk_real(scheme *sc, double num);
00157 pointer mk_symbol(scheme *sc, const char *name);
00158 pointer gensym(scheme *sc);
00159 pointer mk_string(scheme *sc, const char *str);
00160 pointer mk_counted_string(scheme *sc, const char *str, int len);
00161 pointer mk_character(scheme *sc, int c);
00162 pointer mk_foreign_func(scheme *sc, foreign_func f);
00163 void putstr(scheme *sc, const char *s);
00164
00165
00166 #if USE_INTERFACE
00167 struct scheme_interface {
00168 void (*scheme_define)(scheme *sc, pointer env, pointer symbol, pointer value);
00169 pointer (*cons)(scheme *sc, pointer a, pointer b);
00170 pointer (*immutable_cons)(scheme *sc, pointer a, pointer b);
00171 pointer (*mk_integer)(scheme *sc, long num);
00172 pointer (*mk_real)(scheme *sc, double num);
00173 pointer (*mk_symbol)(scheme *sc, const char *name);
00174 pointer (*gensym)(scheme *sc);
00175 pointer (*mk_string)(scheme *sc, const char *str);
00176 pointer (*mk_counted_string)(scheme *sc, const char *str, int len);
00177 pointer (*mk_character)(scheme *sc, int c);
00178 pointer (*mk_vector)(scheme *sc, int len);
00179 pointer (*mk_foreign_func)(scheme *sc, foreign_func f);
00180 void (*putstr)(scheme *sc, const char *s);
00181 void (*putcharacter)(scheme *sc, int c);
00182
00183 int (*is_string)(pointer p);
00184 char *(*string_value)(pointer p);
00185 int (*is_number)(pointer p);
00186 num (*nvalue)(pointer p);
00187 long (*ivalue)(pointer p);
00188 double (*rvalue)(pointer p);
00189 int (*is_integer)(pointer p);
00190 int (*is_real)(pointer p);
00191 int (*is_character)(pointer p);
00192 long (*charvalue)(pointer p);
00193 int (*is_vector)(pointer p);
00194 long (*vector_length)(pointer vec);
00195 void (*fill_vector)(pointer vec, pointer elem);
00196 pointer (*vector_elem)(pointer vec, int ielem);
00197 pointer (*set_vector_elem)(pointer vec, int ielem, pointer newel);
00198 int (*is_port)(pointer p);
00199
00200 int (*is_pair)(pointer p);
00201 pointer (*pair_car)(pointer p);
00202 pointer (*pair_cdr)(pointer p);
00203 pointer (*set_car)(pointer p, pointer q);
00204 pointer (*set_cdr)(pointer p, pointer q);
00205
00206 int (*is_symbol)(pointer p);
00207 char *(*symname)(pointer p);
00208
00209 int (*is_syntax)(pointer p);
00210 int (*is_proc)(pointer p);
00211 int (*is_foreign)(pointer p);
00212 char *(*syntaxname)(pointer p);
00213 int (*is_closure)(pointer p);
00214 int (*is_macro)(pointer p);
00215 pointer (*closure_code)(pointer p);
00216 pointer (*closure_env)(pointer p);
00217
00218 int (*is_continuation)(pointer p);
00219 int (*is_promise)(pointer p);
00220 int (*is_environment)(pointer p);
00221 int (*is_immutable)(pointer p);
00222 void (*setimmutable)(pointer p);
00223 void (*load_file)(scheme *sc, FILE *fin);
00224 void (*load_string)(scheme *sc, const char *input);
00225 };
00226 #endif
00227
00228 #endif
00229