edelib 2.0.0

edelib/Scheme.h

00001 /*
00002  * $Id$
00003  *
00004  * Scheme interpeter
00005  * Copyright (c) 2005-2011 edelib authors
00006  *
00007  * This library is free software; you can redistribute it and/or
00008  * modify it under the terms of the GNU Lesser General Public
00009  * License as published by the Free Software Foundation; either
00010  * version 2 of the License, or (at your option) any later version.
00011  *
00012  * This library is distributed in the hope that it will be useful,
00013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
00015  * Lesser General Public License for more details.
00016  *
00017  * You should have received a copy of the GNU Lesser General Public License
00018  * along with this library. If not, see <http://www.gnu.org/licenses/>.
00019  */
00020 
00021 #ifndef __EDELIB_SCHEME_H__
00022 #define __EDELIB_SCHEME_H__
00023 
00024 #ifndef SKIP_DOCS
00025 # include "ts/scheme.h"
00026 # include "ts/scheme-private.h"  
00027 #endif
00028 
00052 scheme *edelib_scheme_init(void);
00053 
00058 #define edelib_scheme_init_raw scheme_init_new
00059   
00064 #define edelib_scheme_deinit scheme_deinit
00065 
00070 #define edelib_scheme_load_file scheme_load_file
00071 
00076 #define edelib_scheme_load_string  scheme_load_string
00077 
00082 #define edelib_scheme_set_external_data scheme_set_external_data
00083 
00088 #define edelib_scheme_get_external_data(sc) (sc)->ext_data
00089 
00094 #define edelib_scheme_define scheme_define
00095 
00100 #define edelib_scheme_call scheme_call
00101 
00106 #define edelib_scheme_set_input_port_file scheme_set_input_port_file
00107 
00112 #define edelib_scheme_set_output_port_file scheme_set_output_port_file
00113 
00118 #define edelib_scheme_set_input_port_string scheme_set_input_port_string
00119 
00124 #define edelib_scheme_set_output_port_string scheme_set_output_port_string 
00125 
00126 /* try to avoid vpr by using function like macros */
00127 #define edelib_scheme_gensym(sc)                 (sc)->vptr->gensym(sc)
00128 #define edelib_scheme_cons(sc, a, b)             (sc)->vptr->cons(sc, a, b)      
00129 #define edelib_scheme_immutable_cons(sc, a, b)   (sc)->vptr->immutable_cons(sc, a, b)
00130 #define edelib_scheme_reserve_cells(sc, n)       (sc)->vptr->reserve_cells(sc, n)
00131 #define edelib_scheme_mk_int(sc, num)            (sc)->vptr->mk_integer(sc, num)
00132 #define edelib_scheme_mk_double(sc, num)         (sc)->vptr->mk_real(sc, num)
00133 #define edelib_scheme_mk_symbol(sc, sym)         (sc)->vptr->mk_symbol(sc, sym)
00134 #define edelib_scheme_mk_string(sc, str)         (sc)->vptr->mk_string(sc, str)
00135 #define edelib_scheme_mk_string_counted(sc, str) (sc)->vptr->mk_counted_string(sc, str)
00136 #define edelib_scheme_mk_character(sc, c)        (sc)->vptr->mk_character(sc, c)
00137 #define edelib_scheme_mk_vector(sc, len)         (sc)->vptr->mk_vector(sc, len) 
00138 #define edelib_scheme_mk_foreign_func(sc, func)  (sc)->vptr->mk_foreign_func(sc, func)
00139 #define edelib_scheme_putstr(sc, str)            (sc)->vptr->putstr(sc, str)
00140 #define edelib_scheme_putcharacter(sc, c)        (sc)->vptr->putcharacter(sc, c)
00141 
00142 #define edelib_scheme_is_string(sc, p)    (sc)->vptr->is_string(p) 
00143 #define edelib_scheme_string_value(sc, p) (sc)->vptr->string_value(p)
00144 #define edelib_scheme_is_int(sc, p)       (sc)->vptr->is_number(p) 
00145 #define edelib_scheme_int_value(sc, p)    (int)((sc)->vptr->ivalue(p))
00146 #define edelib_scheme_is_double(sc, p)    (sc)->vptr->is_real(p)
00147 #define edelib_scheme_double_value(sc, p) (sc)->vptr->rvalue(p)
00148 #define edelib_scheme_is_char(sc, p)      (sc)->vptr->is_character(p)
00149 #define edelib_scheme_char_value(sc, p)   (sc)->vptr->charvalue(p)
00150 #define edelib_scheme_is_vector(sc, p)    (sc)->vptr->is_vector(p)
00151 #define edelib_scheme_vector_len(sc, p)   (sc)->vptr->vector_length(p)
00152 #define edelib_scheme_vector_fill(sc, vec, v) (sc)->vptr->fill_vector(vec, v)  
00153 #define edelib_scheme_vector_elem(sc, vec, i) (sc)->vptr->vector_elem(vec, i)  
00154 #define edelib_scheme_vector_elem_set(sc, vec, i, newel) (sc)->vptr->set_vector_elem(vec, i, newel) 
00155 #define edelib_scheme_is_port(sc, p)      (sc)->vptr->is_port(p) 
00156 #define edelib_scheme_is_pair(sc, p)      (sc)->vptr->is_pair(p) 
00157 #define edelib_scheme_pair_car(sc, p)      (sc)->vptr->pair_car(p) 
00158 #define edelib_scheme_pair_cdr(sc, p)      (sc)->vptr->pair_cdr(p) 
00159 #define edelib_scheme_car_set(sc, p, q)      (sc)->vptr->set_car(p, q)
00160 #define edelib_scheme_cdr_set(sc, p, q)      (sc)->vptr->set_cdr(p, q)
00161 #define edelib_scheme_is_symbol(sc, p)       (sc)->vptr->is_symbol(p) 
00162 #define edelib_scheme_symname(sc, p)         (sc)->vptr->symname(p)
00163 #define edelib_scheme_is_syntax(sc, p)         (sc)->vptr->is_syntax(p)
00164 #define edelib_scheme_syntaxname(sc, p)        (sc)->vptr->syntaxname(p) 
00165 #define edelib_scheme_is_proc(sc, p)         (sc)->vptr->is_proc(p)
00166 #define edelib_scheme_is_macro(sc, p)         (sc)->vptr->is_macro(p)
00167 #define edelib_scheme_is_foreign(sc, p)        (sc)->vptr->is_foreign(p) 
00168 #define edelib_scheme_closure_code(sc, p)         (sc)->vptr->closure_code(p)
00169 #define edelib_scheme_closure_env(sc, p)         (sc)->vptr->closure_env(p)
00170   
00171 #define edelib_scheme_is_continuation(sc, p) (sc)->vptr->is_continuation(p)
00172 #define edelib_scheme_is_promise(sc, p)      (sc)->vptr->is_promise(p)
00173 #define edelib_scheme_is_environment(sc, p)  (sc)->vptr->is_environment(p)
00174   
00175 #define edelib_scheme_is_immutable(sc, p)  (sc)->vptr->is_immutable(p)
00176 #define edelib_scheme_set_immutable(sc, p) (sc)->vptr->setimmutable(p)
00177  
00183 #define EDELIB_SCHEME_DEFINE(sc, func_ptr, func_name)                   \
00184   sc->vptr->scheme_define(sc, sc->global_env,                           \
00185                               sc->vptr->mk_symbol(sc, func_name),       \
00186                               sc->vptr->mk_foreign_func(sc, func_ptr))  
00187 
00193 #define EDELIB_SCHEME_DEFINE2(sc, func_ptr, func_name, doc)      \
00194   do {                                                           \
00195         scheme_load_string(sc, "(add-doc " #func_name "," #doc ")"); \
00196         EDELIB_SCHEME_DEFINE(sc, func_name, func_ptr);                           \
00197   } while(0)
00198 
00199 #define EDELIB_SCHEME_OBJECT(sc)     ((sc)->vptr)
00200 #define EDELIB_SCHEME_GLOBAL_ENV(sc) ((sc)->global_env)
00201 
00207 #define EDELIB_SCHEME_IS_NIL(sc, var) ((var) == sc->NIL)
00208 
00209 #endif