~ubuntu-branches/ubuntu/maverick/uim/maverick

« back to all changes in this revision

Viewing changes to sigscheme/src/sigscheme.h

  • Committer: Bazaar Package Importer
  • Author(s): Masahito Omote
  • Date: 2008-06-25 19:56:33 UTC
  • mfrom: (3.1.18 intrepid)
  • Revision ID: james.westby@ubuntu.com-20080625195633-8jljph4rfq00l8o7
Tags: 1:1.5.1-2
* uim-tcode: provide tutcode-custom.scm, tutcode-bushudic.scm
  and tutcode-rule.scm (Closes: #482659)
* Fix FTBFS: segv during compile (Closes: #483078).
  I personally think this bug is not specific for uim but is a optimization
  problem on gcc-4.3.1. (https://bugs.freedesktop.org/show_bug.cgi?id=16477)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*===========================================================================
 
2
 *  Filename : sigscheme.h
 
3
 *  About    : Public header file
 
4
 *
 
5
 *  Copyright (C) 2005-2006 Kazuki Ohta <mover AT hct.zaq.ne.jp>
 
6
 *  Copyright (C) 2005-2006 Jun Inoue <jun.lambda AT gmail.com>
 
7
 *  Copyright (C) 2005-2006 YAMAMOTO Kengo <yamaken AT bp.iij4u.or.jp>
 
8
 *  Copyright (c) 2007-2008 SigScheme Project <uim-en AT googlegroups.com>
 
9
 *
 
10
 *  All rights reserved.
 
11
 *
 
12
 *  Redistribution and use in source and binary forms, with or without
 
13
 *  modification, are permitted provided that the following conditions
 
14
 *  are met:
 
15
 *
 
16
 *  1. Redistributions of source code must retain the above copyright
 
17
 *     notice, this list of conditions and the following disclaimer.
 
18
 *  2. Redistributions in binary form must reproduce the above copyright
 
19
 *     notice, this list of conditions and the following disclaimer in the
 
20
 *     documentation and/or other materials provided with the distribution.
 
21
 *  3. Neither the name of authors nor the names of its contributors
 
22
 *     may be used to endorse or promote products derived from this software
 
23
 *     without specific prior written permission.
 
24
 *
 
25
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS
 
26
 *  IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 
27
 *  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 
28
 *  PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
 
29
 *  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 
30
 *  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 
31
 *  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
 
32
 *  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
 
33
 *  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
 
34
 *  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 
35
 *  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
36
===========================================================================*/
 
37
#ifndef __SIGSCHEME_H
 
38
#define __SIGSCHEME_H
 
39
 
 
40
#include <sigscheme/config.h>
 
41
#define SCM_USE_VALUES_APPLIER 1
 
42
 
 
43
#include <limits.h>
 
44
#include <stddef.h>
 
45
#include <stdio.h>
 
46
#include <stdarg.h>
 
47
 
 
48
#include <gcroots.h>
 
49
#if (GCROOTS_API_REVISION < 1)
 
50
#error "libgcroots that has API revision >= 1 is required"
 
51
#endif
 
52
 
 
53
#include "scmint.h"
 
54
#include "global.h"
 
55
#if SCM_USE_MULTIBYTE_CHAR
 
56
#include "encoding.h"
 
57
#else
 
58
#include "encoding-dummy.h"
 
59
#endif
 
60
 
 
61
#ifdef __cplusplus
 
62
extern "C" {
 
63
#endif
 
64
 
 
65
/*=======================================
 
66
  Macro Definitions
 
67
=======================================*/
 
68
#define SSCM_VERSION_STRING     "0.8.3"
 
69
#define SSCM_VERSION_MAJOR      (0)
 
70
#define SSCM_VERSION_MINOR      (8)
 
71
#define SSCM_VERSION_PATCHLEVEL (3)
 
72
#define SSCM_VERSION_REQUIRE(major, minor, patchlevel)                       \
 
73
  ((major) < SSCM_VERSION_MAJOR                                              \
 
74
   || ((major) == SSCM_VERSION_MAJOR && (minor) < SSCM_VERSION_MINOR)        \
 
75
   || ((major) == SSCM_VERSION_MAJOR && (minor) == SSCM_VERSION_MINOR        \
 
76
       && (patchlevel) <= SSCM_VERSION_PATCHLEVEL))
 
77
 
 
78
#define SCM_ERRMSG_MEMORY_EXHAUSTED    "memory exhausted"
 
79
 
 
80
/* An empty definition is generally not a good idea.  (Consider for
 
81
 * example (FOO(), bar) where FOO() expands to only whitespaces.)
 
82
 * Simply using 0 prompts warnings everywhere, so we cast it to void.
 
83
 * There may be a better solution out there, so use this macro instead
 
84
 * of crudely writing out the same expression.  The idea is taken from
 
85
 * glibc's assert.h but it's barely even a line of code so it should
 
86
 * be OK as the copyright goes... anyone know for sure? */
 
87
#ifndef SCM_EMPTY_EXPR
 
88
#define SCM_EMPTY_EXPR ((void)0)
 
89
#endif
 
90
 
 
91
#if HAVE___ATTRIBUTE__
 
92
/* As a workaround for the noinline attribute vanishing bug on some Linux
 
93
 * distributions, we use ((__noinline__)) instead of ((noinline)). */
 
94
#define SCM_NOINLINE __attribute__((__noinline__))
 
95
#define SCM_NORETURN __attribute__((__noreturn__))
 
96
#define SCM_UNUSED   __attribute__((__unused__))
 
97
/* size-less ((__aligned__)) may not be sufficient for m68k */
 
98
#define SCM_SCMOBJ_ALIGNED __attribute__((__aligned__ (SIZEOF_SCMOBJ)))
 
99
#else /* HAVE___ATTRIBUTE__ */
 
100
#define SCM_NOINLINE
 
101
#define SCM_NORETURN
 
102
#define SCM_UNUSED
 
103
#define SCM_SCMOBJ_ALIGNED
 
104
#endif /* HAVE___ATTRIBUTE__ */
 
105
 
 
106
/* RFC: better names for the debug printing */
 
107
/* SCM_DBG((a, b, c)) */
 
108
#if SCM_DEBUG
 
109
#define SCM_CDBG(args) (scm_categorized_debug args)
 
110
#define SCM_DBG(args)  (scm_debug args)
 
111
#else /* SCM_DEBUG */
 
112
#define SCM_CDBG(args) SCM_EMPTY_EXPR
 
113
#define SCM_DBG(args)  SCM_EMPTY_EXPR
 
114
#endif /* SCM_DEBUG */
 
115
 
 
116
/*
 
117
 * Condition testers
 
118
 *
 
119
 * SigScheme uses these three types of condition testers.
 
120
 *
 
121
 * ASSERT: Asserts a condition that is expected as always true, as a contract
 
122
 * programming. No actual check is performed when (!SCM_SOFT_ASSERT &&
 
123
 * defined(NDEBUG)).
 
124
 *
 
125
 * ENSURE: Mandatory runtime check involving uncertain data. An exception is
 
126
 * raised if failed. Actual check is always performed regaradless of debug
 
127
 * configurations.
 
128
 *
 
129
 * CHECK: Optional runtime check. Actual check is performed only when
 
130
 * configured to do so. Since the behavior, codes that include a CHECK must be
 
131
 * sane even if the condition is false with no actual check.
 
132
 *
 
133
 */
 
134
 
 
135
#if SCM_SOFT_ASSERT
 
136
/* allows recovery from failed assertion */
 
137
#if 0
 
138
#define SCM_ASSERTION_MSG(cond) ("assertion failed at " "'" #cond "'")
 
139
#else
 
140
#define SCM_ASSERTION_MSG(cond) "assertion failed"
 
141
#endif
 
142
#define SCM_ASSERT(cond)                                                     \
 
143
    ((cond) || (scm_die(SCM_ASSERTION_MSG(cond), __FILE__, __LINE__), 1))
 
144
#elif HAVE_ASSERT_H
 
145
#include <assert.h>
 
146
#define SCM_ASSERT(cond) (assert(cond))
 
147
#else
 
148
#define SCM_ASSERT(cond) SCM_EMPTY_EXPR
 
149
#endif
 
150
 
 
151
#define SCM_ENSURE(cond)                                                     \
 
152
    ((cond) || (scm_die("invalid condition", __FILE__, __LINE__), 1))
 
153
 
 
154
#define SCM_ENSURE_ALLOCATED(p)                                              \
 
155
    ((p) || (scm_fatal_error(SCM_ERRMSG_MEMORY_EXHAUSTED), 1))
 
156
 
 
157
#if (SCM_USE_WARNING_SUPPRESSOR                                              \
 
158
     && !SCM_SOFT_ASSERT && (!HAVE_ASSERT_H || defined(NDEBUG)))
 
159
#include <stdlib.h>
 
160
#define SCM_NOTREACHED (abort())
 
161
#else
 
162
#define SCM_NOTREACHED SCM_ASSERT(scm_false)
 
163
#endif
 
164
 
 
165
 
 
166
#define SCM_VALID_ENVP(obj)    (scm_valid_environmentp(env))
 
167
 
 
168
#define SCM_ERROBJP(obj)       (TRUEP(scm_p_error_objectp(obj)))
 
169
 
 
170
#define SCM_SYMBOL_BOUNDP(sym) (!SCM_EQ(SCM_SYMBOL_VCELL(sym), SCM_UNBOUND))
 
171
 
 
172
#define SCM_CONS(kar, kdr)           (SCM_MAKE_CONS((kar), (kdr)))
 
173
#define SCM_IMMUTABLE_CONS(kar, kdr) (SCM_MAKE_IMMUTABLE_CONS((kar), (kdr)))
 
174
#define SCM_CAR(kons)  (SCM_CONS_CAR(kons))
 
175
#define SCM_CDR(kons)  (SCM_CONS_CDR(kons))
 
176
#define SCM_CAAR(kons) (SCM_CAR(SCM_CAR(kons)))
 
177
#define SCM_CADR(kons) (SCM_CAR(SCM_CDR(kons)))
 
178
#define SCM_CDAR(kons) (SCM_CDR(SCM_CAR(kons)))
 
179
#define SCM_CDDR(kons) (SCM_CDR(SCM_CDR(kons)))
 
180
 
 
181
#define SCM_LIST_1(elm0)                                                     \
 
182
    (SCM_CONS((elm0), SCM_NULL))
 
183
#define SCM_LIST_2(elm0, elm1)                                               \
 
184
    (SCM_CONS((elm0), SCM_LIST_1(elm1)))
 
185
#define SCM_LIST_3(elm0, elm1, elm2)                                         \
 
186
    (SCM_CONS((elm0), SCM_LIST_2((elm1), (elm2))))
 
187
#define SCM_LIST_4(elm0, elm1, elm2, elm3)                                   \
 
188
    (SCM_CONS((elm0), SCM_LIST_3((elm1), (elm2), (elm3))))
 
189
#define SCM_LIST_5(elm0, elm1, elm2, elm3, elm4)                             \
 
190
    (SCM_CONS((elm0), SCM_LIST_4((elm1), (elm2), (elm3), (elm4))))
 
191
 
 
192
#define SCM_LISTP(obj)    (SCM_CONSP(obj) || SCM_NULLP(obj))
 
193
#define SCM_LIST_1_P(lst) (SCM_CONSP(lst) && SCM_NULLP(SCM_CDR(lst)))
 
194
#define SCM_LIST_2_P(lst) (SCM_CONSP(lst) && SCM_LIST_1_P(SCM_CDR(lst)))
 
195
#define SCM_LIST_3_P(lst) (SCM_CONSP(lst) && SCM_LIST_2_P(SCM_CDR(lst)))
 
196
#define SCM_LIST_4_P(lst) (SCM_CONSP(lst) && SCM_LIST_3_P(SCM_CDR(lst)))
 
197
#define SCM_LIST_5_P(lst) (SCM_CONSP(lst) && SCM_LIST_4_P(SCM_CDR(lst)))
 
198
 
 
199
#define SCM_PROPER_LISTP(obj)   (SCM_LISTLEN_PROPERP(scm_length(obj)))
 
200
#define SCM_DOTTED_LISTP(obj)   (SCM_LISTLEN_DOTTEDP(scm_length(obj)))
 
201
#define SCM_CIRCULAR_LISTP(obj) (SCM_LISTLEN_CIRCULARP(scm_length(obj)))
 
202
 
 
203
/* result decoders for scm_length() */
 
204
/*
 
205
 * Dotted list length follows SRFI-1 definition as follows:
 
206
 *
 
207
 * list            dotted length   internal encoded length(don't use directly)
 
208
 * 'term                 0                     -1
 
209
 * '(1 . term)           1                     -2
 
210
 * '(1 2 . term)         2                     -3
 
211
 * '(1 2 3 . term)       3                     -4
 
212
 */
 
213
#define SCM_LISTLEN_PROPERP(len)    (0 <= (len))
 
214
#define SCM_LISTLEN_CIRCULARP(len)  ((len) == SCM_INT_T_MIN)
 
215
#define SCM_LISTLEN_ERRORP          SCM_LISTLEN_CIRCULARP
 
216
#define SCM_LISTLEN_DOTTEDP(len)    ((len) < 0                               \
 
217
                                     && !SCM_LISTLEN_CIRCULARP(len))
 
218
#define SCM_LISTLEN_DOTTED(len)                                              \
 
219
    (SCM_ASSERT(SCM_LISTLEN_DOTTEDP(len)), ~(len))  /* -(len) - 1 */
 
220
 
 
221
#define SCM_LISTLEN_PROPER_MAX      (SCM_INT_T_MAX)
 
222
#define SCM_LISTLEN_DOTTED_MAX      (-(SCM_INT_T_MIN + 2))
 
223
#define SCM_LISTLEN_MAX                                                      \
 
224
    ((SCM_LISTLEN_DOTTED_MAX < SCM_LISTLEN_PROPER_MAX)                       \
 
225
     ? SCM_LISTLEN_PROPER_MAX : SCM_LISTLEN_DOTTED_MAX)
 
226
 
 
227
#define SCM_EVAL(obj, env) (scm_eval((obj), (env)))
 
228
 
 
229
#define SCM_ASSERT_FUNCTYPE(type, c_func)                                    \
 
230
    do {                                                                     \
 
231
        type f;                                                              \
 
232
        if (0) f = (c_func);  /* compile-time type check */                  \
 
233
    } while (/* CONSTCOND */ 0)
 
234
 
 
235
#if 0
 
236
#define SCM_REGISTER_FUNC(name, c_func, type)                                \
 
237
    do {                                                                     \
 
238
        enum ScmFuncTypeCode typecode;                                       \
 
239
                                                                             \
 
240
        SCM_ASSERT_FUNCTYPE(scm_##type, (c_func));                           \
 
241
        typecode = scm_funccode_##type;                                      \
 
242
        scm_register_func(name, c_func, typecode);                           \
 
243
    } while (/* CONSTCOND */ 0)
 
244
#endif
 
245
 
 
246
#if SCM_USE_PORT
 
247
#define SCM_ENSURE_LIVE_PORT(port)                                           \
 
248
    (SCM_PORT_IMPL(port)                                                     \
 
249
     || (scm_error_obj("(unknown)", "operated on closed port", (port)), 1))
 
250
#endif
 
251
 
 
252
#if SCM_USE_WRITER
 
253
#define SCM_WRITE_SS(port, obj) ((*scm_write_ss_func)((port), (obj)))
 
254
/* Assumes that scm_write_ss_func only holds either scm_write or
 
255
 * scm_write_ss. */
 
256
#define SCM_WRITE_SS_ENABLEDP() (scm_write_ss_func != scm_write)
 
257
#endif
 
258
 
 
259
/*===========================================================================
 
260
  Type Definitions
 
261
===========================================================================*/
 
262
/*=======================================
 
263
   Enums
 
264
=======================================*/
 
265
enum ScmDebugCategory {
 
266
    SCM_DBG_NONE         = 0,
 
267
    SCM_DBG_ERRMSG       = 1 << 0,   /* the "Error: foo bar" style msgs */
 
268
    SCM_DBG_BACKTRACE    = 1 << 1,
 
269
    SCM_DBG_GC           = 1 << 2,
 
270
    SCM_DBG_FILE         = 1 << 3,   /* file loading */
 
271
    SCM_DBG_PARSER       = 1 << 4,
 
272
    SCM_DBG_READ         = 1 << 5,   /* print each parsed expression + misc */
 
273
    SCM_DBG_MACRO        = 1 << 6,
 
274
    SCM_DBG_ARGS         = 1 << 7,   /* number of arguments, type and so on */
 
275
    SCM_DBG_EVAL         = 1 << 8,   /* evaluation-related things */
 
276
    SCM_DBG_CONTINUATION = 1 << 9,
 
277
    SCM_DBG_EXCEPTION    = 1 << 10,
 
278
    SCM_DBG_EXPERIMENTAL = 1 << 11,  /* developed but experimental features */
 
279
    SCM_DBG_DEVEL        = 1 << 12,  /* under development */
 
280
    SCM_DBG_COMPAT       = 1 << 13,  /* warns compatibility-sensitive code */
 
281
    SCM_DBG_ENCODING     = 1 << 14,  /* multibyte handling */
 
282
    SCM_DBG_OTHER        = 1 << 30   /* all other messages */
 
283
};
 
284
 
 
285
enum ScmObjType {
 
286
    /* sorted by majority to make immediate number encoding optimal */
 
287
    ScmCons         = 0,
 
288
    ScmInt          = 1,
 
289
    ScmChar         = 2,
 
290
    ScmSymbol       = 3,
 
291
 
 
292
    ScmString       = 4,
 
293
    ScmFunc         = 5,
 
294
    ScmClosure      = 6,
 
295
    ScmVector       = 7,
 
296
 
 
297
    ScmRational     = 8,
 
298
    ScmReal         = 9,
 
299
    ScmComplex      = 10,
 
300
    ScmConstant     = 11,
 
301
    ScmContinuation = 12,
 
302
    ScmValuePacket  = 13,
 
303
    ScmPort         = 14,
 
304
    ScmFreeCell     = 15,
 
305
#if 0
 
306
    /* Reserved for future extension of argument types-encoded
 
307
     * ScmFuncTypeCode. The types for it should not exceed 4-bit.  */
 
308
    ScmNumber       = ScmConstant,
 
309
    ScmProc         = ScmValuePacket,
 
310
    ScmAny          = ScmFreeCell,
 
311
#endif
 
312
 
 
313
    ScmMacro        = 16,
 
314
    ScmFarsymbol    = 17,
 
315
    ScmSubpat       = 18,
 
316
 
 
317
    ScmCFuncPointer = 30,
 
318
    ScmCPointer     = 31, 
 
319
 
 
320
    /* Classification tag for internal object validations */
 
321
    ScmFirstClassObj = 0  /* intentionally zero */
 
322
};
 
323
 
 
324
/*
 
325
 * Function types:
 
326
 *
 
327
 * Function objects must tag themselves with proper information so
 
328
 * that the evaluator can correctly invoke them.
 
329
 */
 
330
#define SCM_FUNCTYPE_MAND_MAX 5
 
331
enum ScmFuncTypeCode {
 
332
    SCM_FUNCTYPE_MAND_BITS = 4,
 
333
    SCM_FUNCTYPE_MAND_MASK = (1 << SCM_FUNCTYPE_MAND_BITS) - 1,
 
334
    SCM_FUNCTYPE_PROCEDURE = 0 << SCM_FUNCTYPE_MAND_BITS,
 
335
    SCM_FUNCTYPE_SYNTAX    = 1 << SCM_FUNCTYPE_MAND_BITS,
 
336
 
 
337
    SCM_FUNCTYPE_FIXED     = 0 << (SCM_FUNCTYPE_MAND_BITS + 1),
 
338
    SCM_FUNCTYPE_VARIADIC  = 1 << (SCM_FUNCTYPE_MAND_BITS + 1),
 
339
    SCM_FUNCTYPE_TAILREC   = 1 << (SCM_FUNCTYPE_MAND_BITS + 2),
 
340
 
 
341
    SCM_FUNCTYPE_ODDBALL   = 1 << (SCM_FUNCTYPE_MAND_BITS + 10),
 
342
 
 
343
    /* Compound types. */
 
344
    SCM_PROCEDURE_FIXED             = SCM_FUNCTYPE_FIXED,
 
345
    SCM_PROCEDURE_FIXED_TAILREC     = SCM_FUNCTYPE_TAILREC,
 
346
    SCM_PROCEDURE_VARIADIC          = SCM_FUNCTYPE_VARIADIC,
 
347
    SCM_PROCEDURE_VARIADIC_TAILREC  = (SCM_FUNCTYPE_VARIADIC
 
348
                                       | SCM_FUNCTYPE_TAILREC),
 
349
 
 
350
    SCM_SYNTAX_FIXED             = (SCM_FUNCTYPE_SYNTAX
 
351
                                    | SCM_PROCEDURE_FIXED),
 
352
    SCM_SYNTAX_FIXED_TAILREC     = (SCM_FUNCTYPE_SYNTAX
 
353
                                    | SCM_PROCEDURE_FIXED_TAILREC),
 
354
    SCM_SYNTAX_VARIADIC          = (SCM_FUNCTYPE_SYNTAX
 
355
                                    | SCM_PROCEDURE_VARIADIC),
 
356
    SCM_SYNTAX_VARIADIC_TAILREC  = (SCM_FUNCTYPE_SYNTAX
 
357
                                    | SCM_PROCEDURE_VARIADIC_TAILREC),
 
358
 
 
359
    /* Proper combinations */
 
360
    SCM_SYNTAX_FIXED_0               = (SCM_SYNTAX_FIXED               | 0),
 
361
    SCM_SYNTAX_FIXED_TAILREC_0       = (SCM_SYNTAX_FIXED_TAILREC       | 0),
 
362
    SCM_SYNTAX_VARIADIC_0            = (SCM_SYNTAX_VARIADIC            | 0),
 
363
    SCM_SYNTAX_VARIADIC_TAILREC_0    = (SCM_SYNTAX_VARIADIC_TAILREC    | 0),
 
364
    SCM_PROCEDURE_FIXED_0            = (SCM_PROCEDURE_FIXED            | 0),
 
365
    SCM_PROCEDURE_FIXED_TAILREC_0    = (SCM_PROCEDURE_FIXED_TAILREC    | 0),
 
366
    SCM_PROCEDURE_VARIADIC_0         = (SCM_PROCEDURE_VARIADIC         | 0),
 
367
    SCM_PROCEDURE_VARIADIC_TAILREC_0 = (SCM_PROCEDURE_VARIADIC_TAILREC | 0),
 
368
#if SCM_FUNCTYPE_MAND_MAX >= 1
 
369
    SCM_SYNTAX_FIXED_1               = (SCM_SYNTAX_FIXED               | 1),
 
370
    SCM_SYNTAX_FIXED_TAILREC_1       = (SCM_SYNTAX_FIXED_TAILREC       | 1),
 
371
    SCM_SYNTAX_VARIADIC_1            = (SCM_SYNTAX_VARIADIC            | 1),
 
372
    SCM_SYNTAX_VARIADIC_TAILREC_1    = (SCM_SYNTAX_VARIADIC_TAILREC    | 1),
 
373
    SCM_PROCEDURE_FIXED_1            = (SCM_PROCEDURE_FIXED            | 1),
 
374
    SCM_PROCEDURE_FIXED_TAILREC_1    = (SCM_PROCEDURE_FIXED_TAILREC    | 1),
 
375
    SCM_PROCEDURE_VARIADIC_1         = (SCM_PROCEDURE_VARIADIC         | 1),
 
376
    SCM_PROCEDURE_VARIADIC_TAILREC_1 = (SCM_PROCEDURE_VARIADIC_TAILREC | 1),
 
377
#endif
 
378
#if SCM_FUNCTYPE_MAND_MAX >= 2
 
379
    SCM_SYNTAX_FIXED_2               = (SCM_SYNTAX_FIXED               | 2),
 
380
    SCM_SYNTAX_FIXED_TAILREC_2       = (SCM_SYNTAX_FIXED_TAILREC       | 2),
 
381
    SCM_SYNTAX_VARIADIC_2            = (SCM_SYNTAX_VARIADIC            | 2),
 
382
    SCM_SYNTAX_VARIADIC_TAILREC_2    = (SCM_SYNTAX_VARIADIC_TAILREC    | 2),
 
383
    SCM_PROCEDURE_FIXED_2            = (SCM_PROCEDURE_FIXED            | 2),
 
384
    SCM_PROCEDURE_FIXED_TAILREC_2    = (SCM_PROCEDURE_FIXED_TAILREC    | 2),
 
385
    SCM_PROCEDURE_VARIADIC_2         = (SCM_PROCEDURE_VARIADIC         | 2),
 
386
    SCM_PROCEDURE_VARIADIC_TAILREC_2 = (SCM_PROCEDURE_VARIADIC_TAILREC | 2),
 
387
#endif
 
388
#if SCM_FUNCTYPE_MAND_MAX >= 3
 
389
    SCM_SYNTAX_FIXED_3               = (SCM_SYNTAX_FIXED               | 3),
 
390
    SCM_SYNTAX_FIXED_TAILREC_3       = (SCM_SYNTAX_FIXED_TAILREC       | 3),
 
391
    SCM_SYNTAX_VARIADIC_3            = (SCM_SYNTAX_VARIADIC            | 3),
 
392
    SCM_SYNTAX_VARIADIC_TAILREC_3    = (SCM_SYNTAX_VARIADIC_TAILREC    | 3),
 
393
    SCM_PROCEDURE_FIXED_3            = (SCM_PROCEDURE_FIXED            | 3),
 
394
    SCM_PROCEDURE_FIXED_TAILREC_3    = (SCM_PROCEDURE_FIXED_TAILREC    | 3),
 
395
    SCM_PROCEDURE_VARIADIC_3         = (SCM_PROCEDURE_VARIADIC         | 3),
 
396
    SCM_PROCEDURE_VARIADIC_TAILREC_3 = (SCM_PROCEDURE_VARIADIC_TAILREC | 3),
 
397
#endif
 
398
#if SCM_FUNCTYPE_MAND_MAX >= 4
 
399
    SCM_SYNTAX_FIXED_4               = (SCM_SYNTAX_FIXED               | 4),
 
400
    SCM_SYNTAX_FIXED_TAILREC_4       = (SCM_SYNTAX_FIXED_TAILREC       | 4),
 
401
    SCM_SYNTAX_VARIADIC_4            = (SCM_SYNTAX_VARIADIC            | 4),
 
402
    SCM_SYNTAX_VARIADIC_TAILREC_4    = (SCM_SYNTAX_VARIADIC_TAILREC    | 4),
 
403
    SCM_PROCEDURE_FIXED_4            = (SCM_PROCEDURE_FIXED            | 4),
 
404
    SCM_PROCEDURE_FIXED_TAILREC_4    = (SCM_PROCEDURE_FIXED_TAILREC    | 4),
 
405
    SCM_PROCEDURE_VARIADIC_4         = (SCM_PROCEDURE_VARIADIC         | 4),
 
406
    SCM_PROCEDURE_VARIADIC_TAILREC_4 = (SCM_PROCEDURE_VARIADIC_TAILREC | 4),
 
407
#endif
 
408
#if SCM_FUNCTYPE_MAND_MAX >= 5
 
409
    SCM_SYNTAX_FIXED_5               = (SCM_SYNTAX_FIXED               | 5),
 
410
    SCM_SYNTAX_FIXED_TAILREC_5       = (SCM_SYNTAX_FIXED_TAILREC       | 5),
 
411
    SCM_SYNTAX_VARIADIC_5            = (SCM_SYNTAX_VARIADIC            | 5),
 
412
    SCM_SYNTAX_VARIADIC_TAILREC_5    = (SCM_SYNTAX_VARIADIC_TAILREC    | 5),
 
413
    SCM_PROCEDURE_FIXED_5            = (SCM_PROCEDURE_FIXED            | 5),
 
414
    SCM_PROCEDURE_FIXED_TAILREC_5    = (SCM_PROCEDURE_FIXED_TAILREC    | 5),
 
415
    SCM_PROCEDURE_VARIADIC_5         = (SCM_PROCEDURE_VARIADIC         | 5),
 
416
    SCM_PROCEDURE_VARIADIC_TAILREC_5 = (SCM_PROCEDURE_VARIADIC_TAILREC | 5),
 
417
#endif
 
418
#if SCM_FUNCTYPE_MAND_MAX >= 6
 
419
#error "SCM_FUNCTYPE_MAND_MAX must not exceed 5"
 
420
#endif
 
421
 
 
422
    /* Special type. */
 
423
    SCM_REDUCTION_OPERATOR = SCM_FUNCTYPE_ODDBALL,
 
424
 
 
425
    SCM_FUNCTYPE_INVALID   = (SCM_FUNCTYPE_ODDBALL | 1)
 
426
};
 
427
 
 
428
/* Where we are in a reduction process. */
 
429
enum ScmReductionState {
 
430
    SCM_REDUCE_0,       /* No argument was given. */
 
431
    SCM_REDUCE_1,       /* Only 1 argument was given. */
 
432
    SCM_REDUCE_PARTWAY, /* We have more arguments pending. */
 
433
    SCM_REDUCE_LAST,    /* The callee must finalize. */
 
434
    SCM_REDUCE_STOP     /* Callee wants to stop. */
 
435
};
 
436
 
 
437
enum ScmPortFlag {
 
438
    SCM_PORTFLAG_NONE        = 0,
 
439
    SCM_PORTFLAG_OUTPUT      = 1 << 0,
 
440
    SCM_PORTFLAG_INPUT       = 1 << 1,
 
441
    SCM_PORTFLAG_LIVE_OUTPUT = 1 << 2,
 
442
    SCM_PORTFLAG_LIVE_INPUT  = 1 << 3,
 
443
 
 
444
    SCM_PORTFLAG_DIR_MASK = (SCM_PORTFLAG_INPUT | SCM_PORTFLAG_OUTPUT),
 
445
    SCM_PORTFLAG_ALIVENESS_MASK = (SCM_PORTFLAG_LIVE_INPUT
 
446
                                   | SCM_PORTFLAG_LIVE_OUTPUT)
 
447
};
 
448
 
 
449
typedef void (*ScmCFunc)(void);
 
450
typedef void *(*ScmGCGateFunc)(void *);
 
451
 
 
452
 
 
453
#if SCM_USE_HYGIENIC_MACRO
 
454
/* Environment for looking up a free variable inserted by a hygienic
 
455
 * macro's template.  References in syntax-rules are only looked up in
 
456
 * environments enclosed by the definition's, so we need only record
 
457
 * the number of frames.  That doesn't work in the face of syntax-case
 
458
 * though, so we abstract the representation here. */
 
459
typedef scm_int_t ScmPackedEnv;
 
460
#define SCM_PENV_EQ(x, y)  ((x) == (y))
 
461
#endif
 
462
 
 
463
/*
 
464
 * 64-bit support of SigScheme
 
465
 *
 
466
 * SigScheme supports all data models of ILP32, LL64, LLP64, LP64 and
 
467
 * ILP64. Default settings automatically configure both ABI and the underlying
 
468
 * storage implementation appropriately, if the storage implementation is
 
469
 * storage-fatty or storage-compact. On the case, the integer size Scheme can
 
470
 * handle is determined by sizeof(long), and heap capacity and addressable
 
471
 * space are determined by the pointer size.
 
472
 *
 
473
 * Other storage implementations (currently not exist) may need some manual
 
474
 * settings to fit to the specified data model.
 
475
 */
 
476
 
 
477
/*
 
478
 * Interface to an implementation for the Storage Abstraction Layer:
 
479
 *
 
480
 * A storage implementation defines following types:
 
481
 *
 
482
 * typedef <hidden> ScmCell;
 
483
 * typedef <hidden> ScmObj;
 
484
 * typedef <hidden> ScmRef;
 
485
 *
 
486
 * typedef ScmObj (*ScmFuncType)();
 
487
 *
 
488
 * And following macros:
 
489
 *
 
490
 * ALIGNOF_SCMOBJ
 
491
 * SIZEOF_SCMOBJ
 
492
 *
 
493
 */
 
494
#if SCM_USE_STORAGE_FATTY
 
495
#include "storage-fatty.h"
 
496
#elif SCM_USE_STORAGE_COMPACT
 
497
#include "storage-compact.h"
 
498
#else
 
499
#error "specify a storage layer implementation"
 
500
#endif
 
501
 
 
502
typedef struct ScmStorageConf_ ScmStorageConf;
 
503
struct ScmStorageConf_ {
 
504
    /* heap */
 
505
    size_t heap_size;             /* number of ScmCell in a heap */
 
506
    size_t heap_alloc_threshold;  /* minimum number of freecells after a GC */
 
507
    size_t n_heaps_max;           /* max number of heaps */
 
508
    size_t n_heaps_init;          /* initial number of heaps */
 
509
 
 
510
    /* symbol table */
 
511
    size_t symbol_hash_size;      /* hash size of symbol table */
 
512
};
 
513
 
 
514
#define SCM_FULLY_ADDRESSABLEP                                               \
 
515
    (SCM_PTR_BITS == (sizeof(void *) * CHAR_BIT))
 
516
 
 
517
#ifndef SCM_DEFAULT_N_HEAPS_MAX
 
518
#define SCM_DEFAULT_N_HEAPS_MAX                                              \
 
519
    (((SCM_INT_BITS < SCM_PTR_BITS)                                          \
 
520
      ? SCM_INT_MAX                                                          \
 
521
      : ((SCM_FULLY_ADDRESSABLEP)                                            \
 
522
         ? ((size_t)(intptr_t)-1 >> 1) : ((size_t)1 << SCM_PTR_BITS) - 1))   \
 
523
     / SCM_DEFAULT_HEAP_SIZE)
 
524
#endif
 
525
 
 
526
/*=======================================
 
527
  Object Representation Information
 
528
=======================================*/
 
529
#define SCM_HAS_CHAR     SCM_SAL_HAS_CHAR
 
530
#define SCM_HAS_INT      1
 
531
#define SCM_HAS_RATIONAL SCM_SAL_HAS_RATIONAL
 
532
#define SCM_HAS_REAL     SCM_SAL_HAS_REAL
 
533
#define SCM_HAS_COMPLEX  SCM_SAL_HAS_COMPLEX
 
534
#define SCM_HAS_STRING   SCM_SAL_HAS_STRING
 
535
#define SCM_HAS_VECTOR   SCM_SAL_HAS_VECTOR
 
536
 
 
537
#define SCM_HAS_IMMUTABLE_CONS   SCM_SAL_HAS_IMMUTABLE_CONS
 
538
#define SCM_HAS_IMMUTABLE_STRING SCM_SAL_HAS_IMMUTABLE_STRING
 
539
#define SCM_HAS_IMMUTABLE_VECTOR SCM_SAL_HAS_IMMUTABLE_VECTOR
 
540
 
 
541
/* for optimization */
 
542
#define SCM_HAS_IMMEDIATE_CHAR_ONLY     SCM_SAL_HAS_IMMEDIATE_CHAR_ONLY
 
543
#define SCM_HAS_IMMEDIATE_NUMBER_ONLY   SCM_SAL_HAS_IMMEDIATE_NUMBER_ONLY
 
544
#define SCM_HAS_IMMEDIATE_INT_ONLY      SCM_SAL_HAS_IMMEDIATE_INT_ONLY
 
545
#define SCM_HAS_IMMEDIATE_RATIONAL_ONLY SCM_SAL_HAS_IMMEDIATE_RATIONAL_ONLY
 
546
#define SCM_HAS_IMMEDIATE_REAL_ONLY     SCM_SAL_HAS_IMMEDIATE_REAL_ONLY
 
547
#define SCM_HAS_IMMEDIATE_COMPLEX_ONLY  SCM_SAL_HAS_IMMEDIATE_COMPLEX_ONLY
 
548
 
 
549
/* addressable space: tag bits multiplexed in alignment part is also counted */
 
550
#define SCM_PTR_BITS    SCM_SAL_PTR_BITS
 
551
 
 
552
#define SCM_CHAR_BITS   SCM_SAL_CHAR_BITS
 
553
#define SCM_CHAR_MAX    SCM_SAL_CHAR_MAX
 
554
#define SCM_CHAR_MIN    0
 
555
 
 
556
#define SCM_INT_BITS    SCM_SAL_INT_BITS
 
557
#define SCM_INT_MAX     SCM_SAL_INT_MAX
 
558
#define SCM_INT_MIN     SCM_SAL_INT_MIN
 
559
 
 
560
/* string length */
 
561
#define SCM_STRLEN_BITS SCM_SAL_STRLEN_BITS
 
562
#define SCM_STRLEN_MAX  SCM_SAL_STRLEN_MAX
 
563
#define SCM_STRLEN_MIN  0
 
564
 
 
565
/* vector length */
 
566
#define SCM_VECLEN_BITS SCM_SAL_VECLEN_BITS
 
567
#define SCM_VECLEN_MAX  SCM_SAL_VECLEN_MAX
 
568
#define SCM_VECLEN_MIN  0
 
569
 
 
570
/* inlined eqv? */
 
571
#define SCM_HAS_EQVP    SCM_SAL_HAS_EQVP
 
572
 
 
573
/*=======================================
 
574
  Object Creators
 
575
=======================================*/
 
576
/* TODO: add this check to all accessor and creator macros. */
 
577
#define SCM_TYPESAFE_MACRO(macro, rettype, types, args) \
 
578
    (0 ? (*(rettype (*)types)NULL)args                  \
 
579
       : 0 ? ((*(rettype *)NULL) = macro args)          \
 
580
           : macro args)
 
581
 
 
582
/* For macros enclosed in do-while(0). */
 
583
#define SCM_TYPESAFE_MACRO_VOID(macro, types, args)     \
 
584
    do {                                                \
 
585
        if (0)                                          \
 
586
            (*(void (*)types)NULL) args;                \
 
587
        else                                            \
 
588
            macro args;                                 \
 
589
    } while (0)
 
590
 
 
591
#define SCM_MAKE_BOOL(x) ((x) ? SCM_TRUE : SCM_FALSE)
 
592
 
 
593
#define SCM_MAKE_CONS(kar, kdr)                                              \
 
594
    SCM_TYPESAFE_MACRO(SCM_SAL_MAKE_CONS,                                    \
 
595
                       ScmObj,                                               \
 
596
                       (ScmObj, ScmObj),                                     \
 
597
                       ((kar), (kdr)))
 
598
 
 
599
#define SCM_MAKE_IMMUTABLE_CONS(kar, kdr)                                    \
 
600
    SCM_TYPESAFE_MACRO(SCM_SAL_MAKE_IMMUTABLE_CONS,                          \
 
601
                       ScmObj,                                               \
 
602
                       (ScmObj, ScmObj),                                     \
 
603
                       ((kar), (kdr)))
 
604
 
 
605
#if SCM_USE_INT
 
606
#define SCM_MAKE_INT(val)                                                    \
 
607
    SCM_TYPESAFE_MACRO(SCM_SAL_MAKE_INT,                                     \
 
608
                       ScmObj,                                               \
 
609
                       (scm_int_t),                                          \
 
610
                       (val))
 
611
#endif /* SCM_USE_INT */
 
612
 
 
613
#if SCM_USE_CHAR
 
614
#define SCM_MAKE_CHAR(val)                                                   \
 
615
    SCM_TYPESAFE_MACRO(SCM_SAL_MAKE_CHAR,                                    \
 
616
                       ScmObj,                                               \
 
617
                       (scm_ichar_t),                                        \
 
618
                       (val))
 
619
#endif /* SCM_USE_CHAR */
 
620
 
 
621
#define SCM_MAKE_SYMBOL(name, val)                                           \
 
622
    SCM_TYPESAFE_MACRO(SCM_SAL_MAKE_SYMBOL,                                  \
 
623
                       ScmObj,                                               \
 
624
                       (char *, ScmObj),                                     \
 
625
                       ((name), (val)))
 
626
 
 
627
#if SCM_USE_STRING
 
628
#define SCM_MAKE_STRING(str, len)                                            \
 
629
    SCM_TYPESAFE_MACRO(SCM_SAL_MAKE_STRING,                                  \
 
630
                       ScmObj,                                               \
 
631
                       (char *, scm_int_t),                                  \
 
632
                       ((str), (len)))
 
633
 
 
634
#define SCM_MAKE_STRING_COPYING(str, len)                                    \
 
635
    SCM_TYPESAFE_MACRO(SCM_SAL_MAKE_STRING_COPYING,                          \
 
636
                       ScmObj,                                               \
 
637
                       (const char *, scm_int_t),                            \
 
638
                       ((str), (len)))
 
639
 
 
640
#define SCM_MAKE_IMMUTABLE_STRING(str, len)                                  \
 
641
    SCM_TYPESAFE_MACRO(SCM_SAL_MAKE_IMMUTABLE_STRING,                        \
 
642
                       ScmObj,                                               \
 
643
                       (char *, scm_int_t),                                  \
 
644
                       ((str), (len)))
 
645
 
 
646
#define SCM_MAKE_IMMUTABLE_STRING_COPYING(str, len)                          \
 
647
    SCM_TYPESAFE_MACRO(SCM_SAL_MAKE_IMMUTABLE_STRING_COPYING,                \
 
648
                       ScmObj,                                               \
 
649
                       (const char *, scm_int_t),                            \
 
650
                       ((str), (len)))
 
651
 
 
652
#define SCM_CONST_STRING(str)                                                \
 
653
    SCM_MAKE_IMMUTABLE_STRING_COPYING((str), SCM_STRLEN_UNKNOWN)
 
654
#define SCM_STRLEN_UNKNOWN (-1)
 
655
#endif /* SCM_USE_STRING */
 
656
 
 
657
#define SCM_MAKE_FUNC(type, func)                                            \
 
658
    SCM_TYPESAFE_MACRO(SCM_SAL_MAKE_FUNC,                                    \
 
659
                       ScmObj,                                               \
 
660
                       (enum ScmFuncTypeCode, ScmFuncType),                  \
 
661
                       ((type), (func)))
 
662
 
 
663
#define SCM_MAKE_CLOSURE(exp, env)                                           \
 
664
    SCM_TYPESAFE_MACRO(SCM_SAL_MAKE_CLOSURE,                                 \
 
665
                       ScmObj,                                               \
 
666
                       (ScmObj, ScmObj),                                     \
 
667
                       ((exp), (env)))
 
668
 
 
669
#if SCM_USE_VECTOR
 
670
#define SCM_MAKE_VECTOR(vec, len)                                            \
 
671
    SCM_TYPESAFE_MACRO(SCM_SAL_MAKE_VECTOR,                                  \
 
672
                       ScmObj,                                               \
 
673
                       (ScmObj *, scm_int_t),                                \
 
674
                       ((vec), (len)))
 
675
 
 
676
#define SCM_MAKE_IMMUTABLE_VECTOR(vec, len)                                  \
 
677
    SCM_TYPESAFE_MACRO(SCM_SAL_MAKE_IMMUTABLE_VECTOR,                        \
 
678
                       ScmObj,                                               \
 
679
                       (ScmObj *, scm_int_t),                                \
 
680
                       ((vec), (len)))
 
681
#endif /* SCM_USE_VECTOR */
 
682
 
 
683
#if (SCM_USE_CONTINUATION || SCM_USE_VALUES_APPLIER)
 
684
#define SCM_MAKE_CONTINUATION()                                              \
 
685
    SCM_TYPESAFE_MACRO(SCM_SAL_MAKE_CONTINUATION,                            \
 
686
                       ScmObj,                                               \
 
687
                       (void),                                               \
 
688
                       ())
 
689
#endif /* (SCM_USE_CONTINUATION || SCM_USE_VALUES_APPLIER) */
 
690
 
 
691
#define SCM_MAKE_VALUEPACKET(vals)                                           \
 
692
    SCM_TYPESAFE_MACRO(SCM_SAL_MAKE_VALUEPACKET,                             \
 
693
                       ScmObj,                                               \
 
694
                       (ScmObj),                                             \
 
695
                       (vals))
 
696
 
 
697
#if SCM_USE_PORT
 
698
#define SCM_MAKE_PORT(cport, flag)                                           \
 
699
    SCM_TYPESAFE_MACRO(SCM_SAL_MAKE_PORT,                                    \
 
700
                       ScmObj,                                               \
 
701
                       (struct ScmCharPort_ *, enum ScmPortFlag),            \
 
702
                       ((cport), (flag)))
 
703
#endif /* SCM_USE_PORT */
 
704
 
 
705
#if SCM_USE_HYGIENIC_MACRO
 
706
#define SCM_MAKE_HMACRO(r, e)                                                \
 
707
    SCM_TYPESAFE_MACRO(SCM_SAL_MAKE_HMACRO,                                  \
 
708
                       ScmObj,                                               \
 
709
                       (ScmObj, ScmObj),                                     \
 
710
                       ((r), (e)))
 
711
 
 
712
#define SCM_MAKE_FARSYMBOL(s, e)                                             \
 
713
    SCM_TYPESAFE_MACRO(SCM_SAL_MAKE_FARSYMBOL,                               \
 
714
                       ScmObj,                                               \
 
715
                       (ScmObj, ScmPackedEnv),                               \
 
716
                       ((s), (e)))
 
717
 
 
718
#define SCM_MAKE_SUBPAT(x, m)                                                \
 
719
    SCM_TYPESAFE_MACRO(SCM_SAL_MAKE_SUBPAT,                                  \
 
720
                       ScmObj,                                               \
 
721
                       (ScmObj, scm_int_t),                                  \
 
722
                       ((x), (m)))
 
723
#endif /* SCM_USE_HYGIENIC_MACRO */
 
724
 
 
725
#if SCM_USE_SSCM_EXTENSIONS
 
726
#define SCM_MAKE_C_POINTER(ptr)                                              \
 
727
    SCM_TYPESAFE_MACRO(SCM_SAL_MAKE_C_POINTER,                               \
 
728
                       ScmObj,                                               \
 
729
                       (void *),                                             \
 
730
                       (ptr))
 
731
 
 
732
#define SCM_MAKE_C_FUNCPOINTER(ptr)                                          \
 
733
    SCM_TYPESAFE_MACRO(SCM_SAL_MAKE_C_FUNCPOINTER,                           \
 
734
                       ScmObj,                                               \
 
735
                       (ScmCFunc),                                           \
 
736
                       (ptr))
 
737
#endif /* SCM_USE_SSCM_EXTENSIONS */
 
738
 
 
739
/*=======================================
 
740
  Object Accessors
 
741
=======================================*/
 
742
/* ScmObj Global Attribute */
 
743
#define SCM_TYPE(o) SCM_SAL_TYPE(o)
 
744
 
 
745
/* Type Confirmation */
 
746
#if SCM_ACCESSOR_ASSERT
 
747
#define SCM_ASSERT_TYPE(cond, o) (SCM_ASSERT(cond), (o))
 
748
#else /* SCM_ACCESSOR_ASSERT */
 
749
#define SCM_ASSERT_TYPE(cond, o) (o)
 
750
#endif /* SCM_ACCESSOR_ASSERT */
 
751
#define SCM_AS_NUMBER(o)        (SCM_ASSERT_TYPE(SCM_NUMBERP(o),        (o)))
 
752
#define SCM_AS_INT(o)           (SCM_ASSERT_TYPE(SCM_INTP(o),           (o)))
 
753
#define SCM_AS_CONS(o)          (SCM_ASSERT_TYPE(SCM_CONSP(o),          (o)))
 
754
#define SCM_AS_SYMBOL(o)        (SCM_ASSERT_TYPE(SCM_SYMBOLP(o),        (o)))
 
755
#define SCM_AS_CHAR(o)          (SCM_ASSERT_TYPE(SCM_CHARP(o),          (o)))
 
756
#define SCM_AS_STRING(o)        (SCM_ASSERT_TYPE(SCM_STRINGP(o),        (o)))
 
757
#define SCM_AS_FUNC(o)          (SCM_ASSERT_TYPE(SCM_FUNCP(o),          (o)))
 
758
#define SCM_AS_CLOSURE(o)       (SCM_ASSERT_TYPE(SCM_CLOSUREP(o),       (o)))
 
759
#define SCM_AS_VECTOR(o)        (SCM_ASSERT_TYPE(SCM_VECTORP(o),        (o)))
 
760
#define SCM_AS_PORT(o)          (SCM_ASSERT_TYPE(SCM_PORTP(o),          (o)))
 
761
#define SCM_AS_CONTINUATION(o)  (SCM_ASSERT_TYPE(SCM_CONTINUATIONP(o),  (o)))
 
762
#define SCM_AS_VALUEPACKET(o)   (SCM_ASSERT_TYPE(SCM_VALUEPACKETP(o),   (o)))
 
763
#define SCM_AS_C_POINTER(o)     (SCM_ASSERT_TYPE(SCM_C_POINTERP(o),     (o)))
 
764
#define SCM_AS_C_FUNCPOINTER(o) (SCM_ASSERT_TYPE(SCM_C_FUNCPOINTERP(o), (o)))
 
765
#define SCM_AS_HMACRO(o)        (SCM_ASSERT_TYPE(SCM_HMACROP(o),        (o)))
 
766
#define SCM_AS_FARSYMBOL(o)     (SCM_ASSERT_TYPE(SCM_FARSYMBOLP(o),     (o)))
 
767
#define SCM_AS_SUBPAT(o)        (SCM_ASSERT_TYPE(SCM_SUBPATP(o),        (o)))
 
768
 
 
769
#if SCM_USE_NUMBER
 
770
#define SCM_NUMBERP(o)                  SCM_SAL_NUMBERP(o)
 
771
 
 
772
#if SCM_USE_INT
 
773
#define SCM_INTP(o)                     SCM_SAL_INTP(o)
 
774
#define SCM_INT_VALUE(o)                SCM_SAL_INT_VALUE(o)
 
775
#define SCM_INT_SET_VALUE(o, val)       SCM_SAL_INT_SET_VALUE((o), (val))
 
776
#endif /* SCM_USE_INT */
 
777
#endif /* SCM_USE_NUMBER */
 
778
 
 
779
#define SCM_CONSP(o)                    SCM_SAL_CONSP(o)
 
780
#define SCM_CONS_CAR(o)                 SCM_SAL_CONS_CAR(o)
 
781
#define SCM_CONS_CDR(o)                 SCM_SAL_CONS_CDR(o)
 
782
#define SCM_CONS_SET_CAR(o, kar)        SCM_SAL_CONS_SET_CAR((o), (kar))
 
783
#define SCM_CONS_SET_CDR(o, kdr)        SCM_SAL_CONS_SET_CDR((o), (kdr))
 
784
#define SCM_CONS_MUTABLEP(o)            SCM_SAL_CONS_MUTABLEP(o)
 
785
#define SCM_CONS_SET_MUTABLE(o)         SCM_SAL_CONS_SET_MUTABLE(o)
 
786
#define SCM_CONS_SET_IMMUTABLE(o)       SCM_SAL_CONS_SET_IMMUTABLE(o)
 
787
 
 
788
#define SCM_SYMBOLP(o)                  SCM_SAL_SYMBOLP(o)
 
789
#define SCM_SYMBOL_NAME(o)              SCM_SAL_SYMBOL_NAME(o)
 
790
#define SCM_SYMBOL_VCELL(o)             SCM_SAL_SYMBOL_VCELL(o)
 
791
#define SCM_SYMBOL_SET_NAME(o, name)    SCM_SAL_SYMBOL_SET_NAME((o), (name))
 
792
#define SCM_SYMBOL_SET_VCELL(o, val)    SCM_SAL_SYMBOL_SET_VCELL((o), (val))
 
793
 
 
794
#if SCM_USE_CHAR
 
795
#define SCM_CHARP(o)                    SCM_SAL_CHARP(o)
 
796
#define SCM_CHAR_VALUE(o)               SCM_SAL_CHAR_VALUE(o)
 
797
#define SCM_CHAR_SET_VALUE(o, val)      SCM_SAL_CHAR_SET_VALUE((o), (val))
 
798
#endif /* SCM_USE_CHAR */
 
799
 
 
800
#if SCM_USE_STRING
 
801
#define SCM_STRINGP(o)                  SCM_SAL_STRINGP(o)
 
802
#define SCM_STRING_STR(o)               SCM_SAL_STRING_STR(o)
 
803
#define SCM_STRING_LEN(o)               SCM_SAL_STRING_LEN(o)
 
804
#define SCM_STRING_SET_STR(o, str)      SCM_SAL_STRING_SET_STR((o), (str))
 
805
#define SCM_STRING_SET_LEN(o, len)      SCM_SAL_STRING_SET_LEN((o), (len))
 
806
#define SCM_STRING_MUTABLEP(o)          SCM_SAL_STRING_MUTABLEP(o)
 
807
#define SCM_STRING_SET_MUTABLE(o)       SCM_SAL_STRING_SET_MUTABLE(o)
 
808
#define SCM_STRING_SET_IMMUTABLE(o)     SCM_SAL_STRING_SET_IMMUTABLE(o)
 
809
#endif /* SCM_USE_STRING */
 
810
 
 
811
#define SCM_FUNCP(o)                    SCM_SAL_FUNCP(o)
 
812
#define SCM_FUNC_TYPECODE(o)            SCM_SAL_FUNC_TYPECODE(o)
 
813
#define SCM_FUNC_CFUNC(o)               SCM_SAL_FUNC_CFUNC(o)
 
814
#define SCM_FUNC_SET_TYPECODE(o, type)  SCM_SAL_FUNC_SET_TYPECODE((o), (type))
 
815
#define SCM_FUNC_SET_CFUNC(o, func)     SCM_SAL_FUNC_SET_CFUNC((o), (func))
 
816
#define SCM_SYNTAXP(o)    (SCM_FUNCP(o)                                      \
 
817
                           && (SCM_FUNC_TYPECODE(o) & SCM_FUNCTYPE_SYNTAX))
 
818
#define SCM_PROCEDUREP(o) ((SCM_FUNCP(o)                                     \
 
819
                            && !(SCM_FUNC_TYPECODE(o) & SCM_FUNCTYPE_SYNTAX)) \
 
820
                           || SCM_CLOSUREP(o)                                \
 
821
                           || SCM_CONTINUATIONP(o))
 
822
 
 
823
#if (SCM_USE_HYGIENIC_MACRO && SCM_USE_LEGACY_MACRO)
 
824
#define SCM_SYNTACTIC_OBJECTP(o) (SCM_SYNTAXP(o) || SCM_HMACROP(o)      \
 
825
                                  || SCM_SYNTACTIC_CLOSUREP(o))
 
826
#elif SCM_USE_HYGIENIC_MACRO
 
827
#define SCM_SYNTACTIC_OBJECTP(o) (SCM_SYNTAXP(o) || SCM_HMACROP(o))
 
828
#elif SCM_USE_LEGACY_MACRO
 
829
#define SCM_SYNTACTIC_OBJECTP(o) (SCM_SYNTAXP(o) || SCM_SYNTACTIC_CLOSUREP(o))
 
830
#else
 
831
#define SCM_SYNTACTIC_OBJECTP(o) (SCM_SYNTAXP(o))
 
832
#endif
 
833
 
 
834
#if SCM_USE_LEGACY_MACRO
 
835
#define SCM_SYNTACTIC_CLOSURE_ENV scm_syntactic_closure_env
 
836
#define SCM_SYNTACTIC_CLOSUREP(o)                                       \
 
837
    (SCM_CLOSUREP(o)                                                    \
 
838
     && SCM_EQ(SCM_CLOSURE_ENV(o), SCM_SYNTACTIC_CLOSURE_ENV))
 
839
#endif
 
840
 
 
841
#define SCM_CLOSUREP(o)                 SCM_SAL_CLOSUREP(o)
 
842
#define SCM_CLOSURE_EXP(o)              SCM_SAL_CLOSURE_EXP(o)
 
843
#define SCM_CLOSURE_ENV(o)              SCM_SAL_CLOSURE_ENV(o)
 
844
#define SCM_CLOSURE_SET_EXP(o, exp)     SCM_SAL_CLOSURE_SET_EXP((o), (exp))
 
845
#define SCM_CLOSURE_SET_ENV(o, env)     SCM_SAL_CLOSURE_SET_ENV((o), (env))
 
846
 
 
847
#if SCM_USE_VECTOR
 
848
#define SCM_VECTORP(o)                  SCM_SAL_VECTORP(o)
 
849
#define SCM_VECTOR_VEC(o)               SCM_SAL_VECTOR_VEC(o)
 
850
#define SCM_VECTOR_LEN(o)               SCM_SAL_VECTOR_LEN(o)
 
851
#define SCM_VECTOR_SET_VEC(o, vec)      SCM_SAL_VECTOR_SET_VEC((o), (vec))
 
852
#define SCM_VECTOR_SET_LEN(o, len)      SCM_SAL_VECTOR_SET_LEN((o), (len))
 
853
#define SCM_VECTOR_MUTABLEP(o)          SCM_SAL_VECTOR_MUTABLEP(o)
 
854
#define SCM_VECTOR_SET_MUTABLE(o)       SCM_SAL_VECTOR_SET_MUTABLE(o)
 
855
#define SCM_VECTOR_SET_IMMUTABLE(o)     SCM_SAL_VECTOR_SET_IMMUTABLE(o)
 
856
#define SCM_VECTOR_VALID_INDEXP(o, i)   (0 <= (i) && (i) < SCM_VECTOR_LEN(o))
 
857
#endif /* SCM_USE_VECTOR */
 
858
 
 
859
#if SCM_USE_PORT
 
860
#define SCM_PORTP(o)                    SCM_SAL_PORTP(o)
 
861
#define SCM_PORT_FLAG(o)                SCM_SAL_PORT_FLAG(o)
 
862
#define SCM_PORT_IMPL(o)                SCM_SAL_PORT_IMPL(o)
 
863
#define SCM_PORT_SET_FLAG(o, flag)      SCM_SAL_PORT_SET_FLAG((o), (flag))
 
864
#define SCM_PORT_SET_IMPL(o, impl)      SCM_SAL_PORT_SET_IMPL((o), (impl))
 
865
#endif /* SCM_USE_PORT */
 
866
 
 
867
#if (SCM_USE_CONTINUATION || SCM_USE_VALUES_APPLIER)
 
868
#define SCM_CONTINUATIONP(o)            SCM_SAL_CONTINUATIONP(o)
 
869
#define SCM_CONTINUATION_OPAQUE(o)      SCM_SAL_CONTINUATION_OPAQUE(o)
 
870
#define SCM_CONTINUATION_TAG(o)         SCM_SAL_CONTINUATION_TAG(o)
 
871
#define SCM_CONTINUATION_SET_OPAQUE(o, val)                                  \
 
872
    SCM_SAL_CONTINUATION_SET_OPAQUE((o), (val))
 
873
#define SCM_CONTINUATION_SET_TAG(o, val)                                     \
 
874
    SCM_SAL_CONTINUATION_SET_TAG((o), (val))
 
875
#endif /* (SCM_USE_CONTINUATION || SCM_USE_VALUES_APPLIER) */
 
876
 
 
877
#define SCM_VALUEPACKETP(o)             SCM_SAL_VALUEPACKETP(o)
 
878
 
 
879
#define SCM_CONSTANTP(o)                SCM_SAL_CONSTANTP(o)
 
880
 
 
881
#if SCM_USE_SSCM_EXTENSIONS
 
882
#define SCM_C_POINTERP(o)               SCM_SAL_C_POINTERP(o)
 
883
#define SCM_C_POINTER_VALUE(o)          SCM_SAL_C_POINTER_VALUE(o)
 
884
#define SCM_C_POINTER_SET_VALUE(o, ptr) SCM_SAL_C_POINTER_SET_VALUE((o), (ptr))
 
885
 
 
886
#define SCM_C_FUNCPOINTERP(o)           SCM_SAL_C_FUNCPOINTERP(o)
 
887
#define SCM_C_FUNCPOINTER_VALUE(o)      SCM_SAL_C_FUNCPOINTER_VALUE(o)
 
888
#define SCM_C_FUNCPOINTER_SET_VALUE(o, funcptr)                              \
 
889
    SCM_SAL_C_FUNCPOINTER_SET_VALUE((o), (funcptr))
 
890
#endif /* SCM_USE_SSCM_EXTENSIONS */
 
891
 
 
892
#if SCM_USE_HYGIENIC_MACRO
 
893
#define SCM_HMACROP(o)                  SCM_SAL_HMACROP(o)
 
894
#define SCM_HMACRO_RULES(o)             SCM_SAL_HMACRO_RULES(o)
 
895
#define SCM_HMACRO_ENV(o)               SCM_SAL_HMACRO_ENV(o)
 
896
#define SCM_HMACRO_SET_RULES(o, r)      SCM_SAL_HMACRO_SET_RULES((o), (r))
 
897
#define SCM_HMACRO_SET_ENV(o, e)        SCM_SAL_HMACRO_SET_ENV((o), (e))
 
898
#define SCM_FARSYMBOLP(o)               SCM_SAL_FARSYMBOLP(o)
 
899
#define SCM_FARSYMBOL_SYM(o)            SCM_SAL_FARSYMBOL_SYM(o)
 
900
#define SCM_FARSYMBOL_ENV(o)            SCM_SAL_FARSYMBOL_ENV(o)
 
901
#define SCM_FARSYMBOL_SET_SYM(o, s)     SCM_SAL_FARSYMBOL_SET_SYM((o), (s))
 
902
#define SCM_FARSYMBOL_SET_ENV(o, e)     SCM_SAL_FARSYMBOL_SET_ENV((o), (e))
 
903
#define SCM_SUBPATP(o)                  SCM_SAL_SUBPATP(o)
 
904
#define SCM_SUBPAT_OBJ(o)               SCM_SAL_SUBPAT_OBJ(o)
 
905
#define SCM_SUBPAT_META(o)              SCM_SAL_SUBPAT_META(o)
 
906
#define SCM_SUBPAT_SET_OBJ(o, x)        SCM_SAL_SUBPAT_SET_OBJ((o), (x))
 
907
#define SCM_SUBPAT_SET_META(o, m)       SCM_SAL_SUBPAT_SET_META((o), (m))
 
908
 
 
909
 
 
910
/* Marks where pattern variable were present in the original pattern.
 
911
 * Records the symbol and index of the pattern variable.  See macro.c
 
912
 * for the terminology.  It's generally not a good idea to directly
 
913
 * manipulate compiled macro bodies, though. */
 
914
#if SCM_DEBUG_MACRO
 
915
#define SCM_SUBPAT_MAKE_PVAR(obj, idx)  (MAKE_SUBPAT((obj), (idx)))
 
916
#else  /* not SCM_DEBUG_MACRO */
 
917
#define SCM_SUBPAT_MAKE_PVAR(obj, idx)  MAKE_SUBPAT(SCM_NULL, (idx))
 
918
#endif /* not SCM_DEBUG_MACRO */
 
919
#define SCM_SUBPAT_PVAR_INDEX(obj)      SCM_SUBPAT_META(obj)
 
920
#define SCM_SUBPAT_PVARP(obj)           (SCM_SUBPAT_PVAR_INDEX(obj) >= 0)
 
921
 
 
922
/* Repeatable subpattern.  Contains the subpattern and the number of
 
923
 * pattern variables within it. */
 
924
#define SCM_SUBPAT_MAKE_REPPAT(subpat, pvcount) \
 
925
    (MAKE_SUBPAT((subpat), ~(pvcount)))
 
926
#define SCM_SUBPAT_REPPAT_PAT(subpat)     SCM_SUBPAT_OBJ(subpat)
 
927
#define SCM_SUBPAT_REPPAT_PVCOUNT(subpat) (~(SCM_SUBPAT_META(subpat)))
 
928
#define SCM_SUBPAT_REPPATP(obj)           (SCM_SUBPAT_PVAR_INDEX(obj) < 0)
 
929
 
 
930
#define SCM_IDENTIFIERP(o) (SCM_SYMBOLP(o) || SCM_FARSYMBOLP(o))
 
931
#else  /* not SCM_USE_HYGIENIC_MACRO */
 
932
#define SCM_IDENTIFIERP(o) SCM_SYMBOLP(o)
 
933
#endif /* not SCM_USE_HYGIENIC_MACRO */
 
934
 
 
935
/*===========================================================================
 
936
  Hygienic Macro
 
937
===========================================================================*/
 
938
#if SCM_USE_HYGIENIC_MACRO
 
939
/**
 
940
 * Strips the argument of binding information.  Syntaxes that take
 
941
 * verbatim data as their argument (e.g. quote, case) must unwrap that
 
942
 * argument before using it.  UNWRAP_SYNTAX() may or may not
 
943
 * destructively unwrap the input, so the return value must always be
 
944
 * used.  The caller shouldn't assume the input is equal? before and
 
945
 * after unwrapping.
 
946
 */
 
947
#define SCM_UNWRAP_SYNTAX(o)  scm_unwrap_syntaxx((o))
 
948
 
 
949
/**
 
950
 * If the argument is an identifier, it is stripped of binding
 
951
 * information and returned.  Otherwise, the argument is returned
 
952
 * without any modification.
 
953
 */
 
954
#define SCM_UNWRAP_KEYWORD(o) scm_unwrap_keyword(o)
 
955
#else  /* not SCM_USE_HYGIENIC_MACRO */
 
956
#define SCM_UNWRAP_SYNTAX(o)  (o)
 
957
#define SCM_UNWRAP_KEYWORD(o) (o)
 
958
#endif
 
959
 
 
960
/*===========================================================================
 
961
  Environment Specifiers
 
962
===========================================================================*/
 
963
#define SCM_INTERACTION_ENV SCM_SAL_INTERACTION_ENV
 
964
/*
 
965
 * Current implementation cannot handle scheme-report-environment and
 
966
 * null-environment properly. Be careful to use these environemnts.
 
967
 */
 
968
#define SCM_R5RS_ENV        SCM_SAL_R5RS_ENV
 
969
#define SCM_NULL_ENV        SCM_SAL_NULL_ENV
 
970
 
 
971
#define SCM_ENVP(env)       SCM_SAL_ENVP(env)
 
972
 
 
973
/*===========================================================================
 
974
  Abstract ScmObj Reference For Storage-Representation Independent Efficient
 
975
  List Operations
 
976
===========================================================================*/
 
977
#define SCM_INVALID_REF       SCM_SAL_INVALID_REF
 
978
 
 
979
/* refer car slot of a cons cell */
 
980
#define SCM_REF_CAR(kons)     SCM_SAL_REF_CAR(kons)
 
981
/* refer cdr slot of a cons cell */
 
982
#define SCM_REF_CDR(kons)     SCM_SAL_REF_CDR(kons)
 
983
/* refer an off-heap object */
 
984
#define SCM_REF_OFF_HEAP(obj) SCM_SAL_REF_OFF_HEAP(obj)
 
985
 
 
986
/* SCM_DEREF(ref) is not permitted to be used as lvalue */
 
987
#define SCM_DEREF(ref)        SCM_SAL_DEREF(ref)
 
988
 
 
989
/* RFC: Is there a better name? */
 
990
#define SCM_SET(ref, obj)     SCM_SAL_SET((ref), (obj))
 
991
 
 
992
/*===========================================================================
 
993
  Special Constants and Predicates
 
994
===========================================================================*/
 
995
#define SCM_INVALID SCM_SAL_INVALID
 
996
#define SCM_NULL    SCM_SAL_NULL
 
997
#define SCM_TRUE    SCM_SAL_TRUE
 
998
#define SCM_FALSE   SCM_SAL_FALSE
 
999
#define SCM_EOF     SCM_SAL_EOF
 
1000
#define SCM_UNBOUND SCM_SAL_UNBOUND
 
1001
#define SCM_UNDEF   SCM_SAL_UNDEF
 
1002
 
 
1003
#define SCM_EQ(a, b)   (SCM_SAL_EQ((a), (b)))
 
1004
#define SCM_NULLP(o)   (SCM_EQ((o), SCM_NULL))
 
1005
#define SCM_FALSEP(o)  (SCM_EQ((o), SCM_FALSE))
 
1006
#define SCM_TRUEP(o)   (!SCM_FALSEP(o))
 
1007
#define SCM_EOFP(o)    (SCM_EQ((o), SCM_EOF))
 
1008
 
 
1009
#if SCM_HAS_EQVP
 
1010
#define SCM_EQVP(a, b) SCM_SAL_EQVP((a), (b))
 
1011
#else  /* don't have inlined eqv? */
 
1012
#define SCM_EQVP(a, b) SCM_TRUEP(scm_p_eqvp((a), (b)))
 
1013
#endif /* don't have inlined eqv? */
 
1014
 
 
1015
/*===========================================================================
 
1016
  Predefined Symbols
 
1017
===========================================================================*/
 
1018
/* for list construction */
 
1019
/* Don't use scm_sym_* directly. */
 
1020
#define SCM_SYM_QUOTE            scm_sym_quote
 
1021
#define SCM_SYM_QUASIQUOTE       scm_sym_quasiquote
 
1022
#define SCM_SYM_UNQUOTE          scm_sym_unquote
 
1023
#define SCM_SYM_UNQUOTE_SPLICING scm_sym_unquote_splicing
 
1024
#define SCM_SYM_ELLIPSIS         scm_sym_ellipsis
 
1025
 
 
1026
/*=======================================
 
1027
  List Constructor
 
1028
=======================================*/
 
1029
typedef ScmRef ScmQueue;
 
1030
#define SCM_QUEUE_INVALIDATE(_q)     ((_q) = SCM_INVALID_REF)
 
1031
#define SCM_QUEUE_VALIDP(_q)         ((_q) != SCM_INVALID_REF)
 
1032
#define SCM_QUEUE_POINT_TO(_q, _out) ((_q) = SCM_REF_OFF_HEAP(_out))
 
1033
#define SCM_QUEUE_ADD(_q, _dat)      (SCM_SET((_q), SCM_LIST_1(_dat)),       \
 
1034
                                      (_q) = SCM_REF_CDR(SCM_DEREF(_q)))
 
1035
#define SCM_QUEUE_CONST_ADD(_q, _dat)                                        \
 
1036
    (SCM_SET((_q), SCM_IMMUTABLE_CONS((_dat), SCM_NULL)),                    \
 
1037
     (_q) = SCM_REF_CDR(SCM_DEREF(_q)))
 
1038
#define SCM_QUEUE_APPEND(_q, _lst)                                           \
 
1039
    do {                                                                     \
 
1040
        SCM_SET((_q), (_lst));                                               \
 
1041
        while (SCM_CONSP(SCM_DEREF(_q)))                                     \
 
1042
            (_q) = SCM_REF_CDR(SCM_DEREF(_q));                               \
 
1043
    } while (/* CONSTCOND */ 0)
 
1044
#define SCM_QUEUE_TERMINATOR(_q)          (SCM_DEREF(_q))
 
1045
#define SCM_QUEUE_SLOPPY_APPEND(_q, _lst) (SCM_SET((_q), (_lst)))
 
1046
 
 
1047
/*=======================================
 
1048
   Evaluator's State
 
1049
=======================================*/
 
1050
enum ScmValueType {
 
1051
    SCM_VALTYPE_AS_IS     = scm_false,
 
1052
    SCM_VALTYPE_NEED_EVAL = scm_true
 
1053
};
 
1054
 
 
1055
/*
 
1056
 * for strict top-level definitions
 
1057
 *
 
1058
 * R5RS: 7.1.6 Programs and definitions
 
1059
 *
 
1060
 * <program> --> <command or definition>*
 
1061
 * <command or definition> --> <command>
 
1062
 *     | <definition>
 
1063
 *     | <syntax definition>
 
1064
 *     | (begin <command or definition>+)
 
1065
 * <definition> --> (define <variable> <expression>)
 
1066
 *       | (define (<variable> <def formals>) <body>)
 
1067
 *       | (begin <definition>*)
 
1068
 * <command> --> <expression>
 
1069
 */
 
1070
enum ScmNestState {
 
1071
    SCM_NEST_PROGRAM,
 
1072
    SCM_NEST_COMMAND_OR_DEFINITION,
 
1073
    SCM_NEST_COMMAND,
 
1074
    SCM_NEST_RETTYPE_BEGIN
 
1075
};
 
1076
 
 
1077
/* whether top-level 'define' can be performed */
 
1078
#if SCM_STRICT_TOPLEVEL_DEFINITIONS
 
1079
#define SCM_DEFINABLE_TOPLEVELP(eval_state)                                  \
 
1080
    (!EQ((eval_state)->env, SCM_INTERACTION_ENV_INDEFINABLE)                 \
 
1081
     && scm_toplevel_environmentp((eval_state)->env)                         \
 
1082
     && ((eval_state)->nest == SCM_NEST_PROGRAM                              \
 
1083
         || (eval_state)->nest == SCM_NEST_COMMAND_OR_DEFINITION))
 
1084
#else
 
1085
#define SCM_DEFINABLE_TOPLEVELP(eval_state)                                  \
 
1086
    (scm_toplevel_environmentp((eval_state)->env))
 
1087
#endif
 
1088
 
 
1089
typedef struct ScmEvalState_ ScmEvalState;
 
1090
struct ScmEvalState_ {
 
1091
    ScmObj env;
 
1092
    enum ScmValueType ret_type;
 
1093
    enum ScmNestState nest;
 
1094
};
 
1095
 
 
1096
/* Use these constructors instead of manually initialize each members because
 
1097
 * another member may be added. Such member will implicitly be initialized
 
1098
 * properly as long as the constructors are used. */
 
1099
#define SCM_EVAL_STATE_INIT(state)                                           \
 
1100
    SCM_EVAL_STATE_INIT1((state), SCM_INTERACTION_ENV)
 
1101
 
 
1102
#define SCM_EVAL_STATE_INIT1(state, env)                                     \
 
1103
    SCM_EVAL_STATE_INIT2((state), (env), SCM_VALTYPE_NEED_EVAL)
 
1104
 
 
1105
#define SCM_EVAL_STATE_INIT2(state, env, ret_type)                           \
 
1106
    SCM_EVAL_STATE_INIT3((state), (env), (ret_type),                         \
 
1107
                         (SCM_EQ((env), SCM_INTERACTION_ENV))                \
 
1108
                          ? SCM_NEST_PROGRAM : SCM_NEST_COMMAND)
 
1109
 
 
1110
#define SCM_EVAL_STATE_INIT3(state, _env, _ret_type, _nest)                  \
 
1111
    do {                                                                     \
 
1112
        (state).env      = (_env);                                           \
 
1113
        (state).ret_type = (_ret_type);                                      \
 
1114
        (state).nest = (_nest);                                              \
 
1115
    } while (/* CONSTCOND */ 0)
 
1116
 
 
1117
#define SCM_FINISH_TAILREC_CALL(obj, eval_state)                             \
 
1118
    (((eval_state)->ret_type == SCM_VALTYPE_NEED_EVAL)                       \
 
1119
     ? ((eval_state)->ret_type = SCM_VALTYPE_AS_IS,                          \
 
1120
        EVAL((obj), (eval_state)->env))                                      \
 
1121
     : (obj))
 
1122
 
 
1123
/*=======================================
 
1124
   Format Strings
 
1125
=======================================*/
 
1126
#if SCM_USE_FORMAT
 
1127
enum ScmFormatCapability {
 
1128
    SCM_FMT_NONE            = 0,
 
1129
    SCM_FMT_RAW_C           = 1 << 0,  /* take raw C values from va_list */
 
1130
    SCM_FMT_SRFI28          = 1 << 1,
 
1131
    SCM_FMT_SRFI48_ADDENDUM = 1 << 2,
 
1132
    SCM_FMT_LEADING_ZEROS   = 1 << 3,  /* padding with zeros "00034" */
 
1133
    SCM_FMT_PREFIXED_RADIX  = 1 << 4,  /* "8x" 65535 => "    ffff" */
 
1134
 
 
1135
    SCM_FMT_SRFI48        = (SCM_FMT_SRFI28 | SCM_FMT_SRFI48_ADDENDUM),
 
1136
    SCM_FMT_SSCM_ADDENDUM = (SCM_FMT_LEADING_ZEROS | SCM_FMT_PREFIXED_RADIX),
 
1137
    SCM_FMT_SSCM          = (SCM_FMT_SRFI48 | SCM_FMT_SSCM_ADDENDUM),
 
1138
    SCM_FMT_INTERNAL      = (SCM_FMT_RAW_C | SCM_FMT_SSCM)
 
1139
};
 
1140
#endif /* SCM_USE_FORMAT */
 
1141
 
 
1142
typedef struct ScmValueFormat_ ScmValueFormat;
 
1143
struct ScmValueFormat_ {
 
1144
    signed char width;       /* integer part width */
 
1145
    signed char frac_width;  /* fractional part width */
 
1146
    char pad;                /* char for padding prefix */
 
1147
    char signedp;
 
1148
};
 
1149
 
 
1150
#define SCM_VALUE_FORMAT_INIT(vfmt)                                          \
 
1151
    SCM_VALUE_FORMAT_INIT4((vfmt), -1, -1, ' ', scm_true)
 
1152
 
 
1153
#define SCM_VALUE_FORMAT_INIT4(vfmt, w, fw, p, s)                            \
 
1154
    do {                                                                     \
 
1155
        (vfmt).width = (w);                                                  \
 
1156
        (vfmt).frac_width = (fw);                                            \
 
1157
        (vfmt).pad = (p);                                                    \
 
1158
        (vfmt).signedp = (s);                                                \
 
1159
    } while (/* CONSTCOND */ 0)
 
1160
 
 
1161
#define SCM_VALUE_FORMAT_SPECIFIEDP(vfmt)                                    \
 
1162
    ((vfmt).width > 0 || (vfmt).frac_width > 0 || (vfmt).pad != ' '          \
 
1163
     || !(vfmt).signedp)
 
1164
 
 
1165
/*=======================================
 
1166
  Function types
 
1167
=======================================*/
 
1168
struct scm_func_registration_info {
 
1169
    const char *funcname;
 
1170
    ScmFuncType c_func;
 
1171
    enum ScmFuncTypeCode typecode;
 
1172
};
 
1173
 
 
1174
typedef ScmObj (*scm_reduction_operator)(ScmObj, ScmObj, enum ScmReductionState *);
 
1175
typedef ScmObj (*scm_syntax_fixed_0)(ScmObj);
 
1176
typedef ScmObj (*scm_syntax_fixed_tailrec_0)(ScmEvalState *);
 
1177
typedef ScmObj (*scm_syntax_variadic_0)(ScmObj, ScmObj);
 
1178
typedef ScmObj (*scm_syntax_variadic_tailrec_0)(ScmObj, ScmEvalState *);
 
1179
typedef ScmObj (*scm_procedure_fixed_0)(void);
 
1180
typedef ScmObj (*scm_procedure_fixed_tailrec_0)(ScmEvalState *);
 
1181
typedef ScmObj (*scm_procedure_variadic_0)(ScmObj);
 
1182
typedef ScmObj (*scm_procedure_variadic_tailrec_0)(ScmObj, ScmEvalState *);
 
1183
#if SCM_FUNCTYPE_MAND_MAX >= 1
 
1184
typedef ScmObj (*scm_syntax_fixed_1)(ScmObj, ScmObj);
 
1185
typedef ScmObj (*scm_syntax_fixed_tailrec_1)(ScmObj, ScmEvalState *);
 
1186
typedef ScmObj (*scm_syntax_variadic_1)(ScmObj, ScmObj, ScmObj);
 
1187
typedef ScmObj (*scm_syntax_variadic_tailrec_1)(ScmObj, ScmObj, ScmEvalState *);
 
1188
typedef ScmObj (*scm_procedure_fixed_1)(ScmObj);
 
1189
typedef ScmObj (*scm_procedure_fixed_tailrec_1)(ScmObj, ScmEvalState *);
 
1190
typedef ScmObj (*scm_procedure_variadic_1)(ScmObj, ScmObj);
 
1191
typedef ScmObj (*scm_procedure_variadic_tailrec_1)(ScmObj, ScmObj, ScmEvalState *);
 
1192
#endif
 
1193
#if SCM_FUNCTYPE_MAND_MAX >= 2
 
1194
typedef ScmObj (*scm_syntax_fixed_2)(ScmObj, ScmObj, ScmObj);
 
1195
typedef ScmObj (*scm_syntax_fixed_tailrec_2)(ScmObj, ScmObj, ScmEvalState *);
 
1196
typedef ScmObj (*scm_syntax_variadic_2)(ScmObj, ScmObj, ScmObj, ScmObj);
 
1197
typedef ScmObj (*scm_syntax_variadic_tailrec_2)(ScmObj, ScmObj, ScmObj, ScmEvalState *);
 
1198
typedef ScmObj (*scm_procedure_fixed_2)(ScmObj, ScmObj);
 
1199
typedef ScmObj (*scm_procedure_fixed_tailrec_2)(ScmObj, ScmObj, ScmEvalState *);
 
1200
typedef ScmObj (*scm_procedure_variadic_2)(ScmObj, ScmObj, ScmObj);
 
1201
typedef ScmObj (*scm_procedure_variadic_tailrec_2)(ScmObj, ScmObj, ScmObj, ScmEvalState *);
 
1202
#endif
 
1203
#if SCM_FUNCTYPE_MAND_MAX >= 3
 
1204
typedef ScmObj (*scm_syntax_fixed_3)(ScmObj, ScmObj, ScmObj, ScmObj);
 
1205
typedef ScmObj (*scm_syntax_fixed_tailrec_3)(ScmObj, ScmObj, ScmObj, ScmEvalState *);
 
1206
typedef ScmObj (*scm_syntax_variadic_3)(ScmObj, ScmObj, ScmObj, ScmObj, ScmObj);
 
1207
typedef ScmObj (*scm_syntax_variadic_tailrec_3)(ScmObj, ScmObj, ScmObj, ScmObj, ScmEvalState *);
 
1208
typedef ScmObj (*scm_procedure_fixed_3)(ScmObj, ScmObj, ScmObj);
 
1209
typedef ScmObj (*scm_procedure_fixed_tailrec_3)(ScmObj, ScmObj, ScmObj, ScmEvalState *);
 
1210
typedef ScmObj (*scm_procedure_variadic_3)(ScmObj, ScmObj, ScmObj, ScmObj);
 
1211
typedef ScmObj (*scm_procedure_variadic_tailrec_3)(ScmObj, ScmObj, ScmObj, ScmObj, ScmEvalState *);
 
1212
#endif
 
1213
#if SCM_FUNCTYPE_MAND_MAX >= 4
 
1214
typedef ScmObj (*scm_syntax_fixed_4)(ScmObj, ScmObj, ScmObj, ScmObj, ScmObj);
 
1215
typedef ScmObj (*scm_syntax_fixed_tailrec_4)(ScmObj, ScmObj, ScmObj, ScmObj, ScmEvalState *);
 
1216
typedef ScmObj (*scm_syntax_variadic_4)(ScmObj, ScmObj, ScmObj, ScmObj, ScmObj, ScmObj);
 
1217
typedef ScmObj (*scm_syntax_variadic_tailrec_4)(ScmObj, ScmObj, ScmObj, ScmObj, ScmObj, ScmEvalState *);
 
1218
typedef ScmObj (*scm_procedure_fixed_4)(ScmObj, ScmObj, ScmObj, ScmObj);
 
1219
typedef ScmObj (*scm_procedure_fixed_tailrec_4)(ScmObj, ScmObj, ScmObj, ScmObj, ScmEvalState *);
 
1220
typedef ScmObj (*scm_procedure_variadic_4)(ScmObj, ScmObj, ScmObj, ScmObj, ScmObj);
 
1221
typedef ScmObj (*scm_procedure_variadic_tailrec_4)(ScmObj, ScmObj, ScmObj, ScmObj, ScmObj, ScmEvalState *);
 
1222
#endif
 
1223
#if SCM_FUNCTYPE_MAND_MAX >= 5
 
1224
typedef ScmObj (*scm_syntax_fixed_5)(ScmObj, ScmObj, ScmObj, ScmObj, ScmObj, ScmObj);
 
1225
typedef ScmObj (*scm_syntax_fixed_tailrec_5)(ScmObj, ScmObj, ScmObj, ScmObj, ScmObj, ScmEvalState *);
 
1226
typedef ScmObj (*scm_syntax_variadic_5)(ScmObj, ScmObj, ScmObj, ScmObj, ScmObj, ScmObj, ScmObj);
 
1227
typedef ScmObj (*scm_syntax_variadic_tailrec_5)(ScmObj, ScmObj, ScmObj, ScmObj, ScmObj, ScmObj, ScmEvalState *);
 
1228
typedef ScmObj (*scm_procedure_fixed_5)(ScmObj, ScmObj, ScmObj, ScmObj, ScmObj);
 
1229
typedef ScmObj (*scm_procedure_fixed_tailrec_5)(ScmObj, ScmObj, ScmObj, ScmObj, ScmObj, ScmEvalState *);
 
1230
typedef ScmObj (*scm_procedure_variadic_5)(ScmObj, ScmObj, ScmObj, ScmObj, ScmObj, ScmObj);
 
1231
typedef ScmObj (*scm_procedure_variadic_tailrec_5)(ScmObj, ScmObj, ScmObj, ScmObj, ScmObj, ScmObj, ScmEvalState *);
 
1232
#endif
 
1233
 
 
1234
/*=======================================
 
1235
  Variable Declarations
 
1236
=======================================*/
 
1237
/* syntax.c */
 
1238
/* Don't use scm_sym_* directly. Use SCM_SYM_* instead. */
 
1239
SCM_GLOBAL_VARS_BEGIN(syntax);
 
1240
ScmObj scm_sym_quote, scm_sym_quasiquote;
 
1241
ScmObj scm_sym_unquote, scm_sym_unquote_splicing;
 
1242
ScmObj scm_sym_ellipsis;
 
1243
SCM_GLOBAL_VARS_END(syntax);
 
1244
#define scm_sym_quote            SCM_GLOBAL_VAR(syntax, scm_sym_quote)
 
1245
#define scm_sym_quasiquote       SCM_GLOBAL_VAR(syntax, scm_sym_quasiquote)
 
1246
#define scm_sym_unquote          SCM_GLOBAL_VAR(syntax, scm_sym_unquote)
 
1247
#define scm_sym_unquote_splicing SCM_GLOBAL_VAR(syntax, scm_sym_unquote_splicing)
 
1248
#define scm_sym_ellipsis         SCM_GLOBAL_VAR(syntax, scm_sym_ellipsis)
 
1249
SCM_DECLARE_EXPORTED_VARS(syntax);
 
1250
 
 
1251
/* legacy-macro.c */
 
1252
#if SCM_USE_LEGACY_MACRO
 
1253
/* Don't use scm_syntactic_closure_env directly. Use SCM_SYNTACTIC_CLOSURE_ENV
 
1254
 * instead. */
 
1255
SCM_GLOBAL_VARS_BEGIN(legacy_macro);
 
1256
ScmObj scm_syntactic_closure_env;
 
1257
SCM_GLOBAL_VARS_END(legacy_macro);
 
1258
#define scm_syntactic_closure_env                                       \
 
1259
    SCM_GLOBAL_VAR(legacy_macro, scm_syntactic_closure_env)
 
1260
SCM_DECLARE_EXPORTED_VARS(legacy_macro);
 
1261
#endif /* SCM_USE_LEGACY_MACRO */
 
1262
 
 
1263
/*=======================================
 
1264
  Function Declarations
 
1265
=======================================*/
 
1266
/*===========================================================================
 
1267
   SigScheme: Core Functions
 
1268
===========================================================================*/
 
1269
/* sigscheme.c */
 
1270
SCM_EXPORT char **scm_initialize(const ScmStorageConf *storage_conf,
 
1271
                                 const char *const *argv);
 
1272
SCM_EXPORT void scm_finalize(void);
 
1273
#if SCM_USE_EVAL_C_STRING
 
1274
SCM_EXPORT ScmObj scm_eval_c_string(const char *exp);
 
1275
#endif
 
1276
SCM_EXPORT ScmObj scm_array2list(void **ary, size_t len,
 
1277
                                 ScmObj (*conv)(void *));
 
1278
SCM_EXPORT void **scm_list2array(ScmObj lst, size_t *len,
 
1279
                                 void *(*conv)(ScmObj));
 
1280
 
 
1281
/* module.c */
 
1282
SCM_EXPORT void scm_provide(ScmObj feature);
 
1283
SCM_EXPORT scm_bool scm_providedp(ScmObj feature);
 
1284
#if 1  /* 'use' is deprecated and will be removed in SigScheme 0.9 */
 
1285
SCM_EXPORT scm_bool scm_use(const char *feature);
 
1286
SCM_EXPORT ScmObj scm_s_use(ScmObj feature, ScmObj env);
 
1287
#endif
 
1288
SCM_EXPORT scm_bool scm_require_module(const char *name);
 
1289
SCM_EXPORT ScmObj scm_p_require_module(ScmObj name);
 
1290
SCM_EXPORT ScmObj scm_register_func(const char *name, ScmFuncType func,
 
1291
                                    enum ScmFuncTypeCode type);
 
1292
SCM_EXPORT void scm_register_funcs(const struct scm_func_registration_info *table);
 
1293
SCM_EXPORT void scm_define_alias(const char *newsym, const char *sym);
 
1294
 
 
1295
/* alloc.c */
 
1296
SCM_EXPORT void *scm_malloc_aligned(size_t size);
 
1297
SCM_EXPORT void *scm_malloc(size_t size);
 
1298
SCM_EXPORT void *scm_calloc(size_t number, size_t size);
 
1299
SCM_EXPORT void *scm_realloc(void *ptr, size_t size);
 
1300
SCM_EXPORT char *scm_strdup(const char *str);
 
1301
 
 
1302
/* storage-gc.c */
 
1303
SCM_EXPORT void scm_gc_protect(ScmObj *var);
 
1304
SCM_EXPORT void scm_gc_protect_with_init(ScmObj *var, ScmObj init_val);
 
1305
SCM_EXPORT void scm_gc_unprotect(ScmObj *var);
 
1306
SCM_EXPORT scm_bool scm_gc_protectedp(ScmObj obj);
 
1307
SCM_EXPORT void *scm_call_with_gc_ready_stack(ScmGCGateFunc func, void *arg);
 
1308
SCM_EXPORT scm_bool scm_gc_protected_contextp(void);
 
1309
/* for semantic assertions */
 
1310
#define scm_gc_any_contextp()                                                \
 
1311
    (!scm_gc_protected_contextp() || scm_gc_protected_contextp())
 
1312
 
 
1313
/* symbol.c */
 
1314
SCM_EXPORT ScmObj scm_intern(const char *name);
 
1315
SCM_EXPORT ScmObj scm_symbol_bound_to(ScmObj obj);
 
1316
 
 
1317
/* error.c */
 
1318
SCM_EXPORT enum ScmDebugCategory scm_debug_categories(void);
 
1319
SCM_EXPORT void scm_set_debug_categories(enum ScmDebugCategory categories);
 
1320
SCM_EXPORT enum ScmDebugCategory scm_predefined_debug_categories(void);
 
1321
#if SCM_DEBUG
 
1322
SCM_EXPORT void scm_categorized_debug(enum ScmDebugCategory category,
 
1323
                                      const char *msg, ...);
 
1324
SCM_EXPORT void scm_debug(const char *msg, ...);
 
1325
#endif /* SCM_DEBUG */
 
1326
SCM_EXPORT void scm_die(const char *msg, const char *filename, int line) SCM_NORETURN;
 
1327
SCM_EXPORT void scm_plain_error(const char *msg, ...) SCM_NORETURN;
 
1328
SCM_EXPORT void scm_error(const char *funcname, const char *msg, ...) SCM_NORETURN;
 
1329
SCM_EXPORT void scm_error_obj(const char *funcname, const char *msg,
 
1330
                              ScmObj obj) SCM_NORETURN;
 
1331
SCM_EXPORT void scm_show_backtrace(ScmObj trace_stack);
 
1332
SCM_EXPORT ScmObj scm_make_error_obj(ScmObj reason, ScmObj objs);
 
1333
SCM_EXPORT void scm_raise_error(ScmObj err_obj) SCM_NORETURN;
 
1334
SCM_EXPORT void scm_fatal_error(const char *msg) SCM_NORETURN;
 
1335
SCM_EXPORT void scm_set_fatal_error_callback(void (*cb)(void));
 
1336
SCM_EXPORT ScmObj scm_p_error_objectp(ScmObj obj);
 
1337
SCM_EXPORT ScmObj scm_p_fatal_error(ScmObj err_obj) SCM_NORETURN;
 
1338
SCM_EXPORT ScmObj scm_p_inspect_error(ScmObj err_obj);
 
1339
SCM_EXPORT ScmObj scm_p_backtrace(void);
 
1340
 
 
1341
/* eval.c */
 
1342
SCM_EXPORT ScmObj scm_symbol_value(ScmObj var, ScmObj env);
 
1343
SCM_EXPORT ScmObj scm_eval(ScmObj obj, ScmObj env);
 
1344
SCM_EXPORT ScmObj scm_call(ScmObj proc, ScmObj args);
 
1345
SCM_EXPORT ScmObj scm_p_eval(ScmObj obj, ScmObj env);
 
1346
SCM_EXPORT ScmObj scm_p_apply(ScmObj proc, ScmObj arg0, ScmObj rest,
 
1347
                              ScmEvalState *eval_state);
 
1348
SCM_EXPORT ScmObj scm_p_scheme_report_environment(ScmObj version);
 
1349
SCM_EXPORT ScmObj scm_p_null_environment(ScmObj version);
 
1350
SCM_EXPORT ScmObj scm_p_interaction_environment(void);
 
1351
 
 
1352
/* syntax.c */
 
1353
SCM_EXPORT ScmObj scm_s_quote(ScmObj datum, ScmObj env);
 
1354
SCM_EXPORT ScmObj scm_s_lambda(ScmObj formals, ScmObj body, ScmObj env);
 
1355
SCM_EXPORT ScmObj scm_s_if(ScmObj test, ScmObj conseq, ScmObj rest,
 
1356
                           ScmEvalState *eval_state);
 
1357
SCM_EXPORT ScmObj scm_s_setx(ScmObj var, ScmObj val, ScmObj env);
 
1358
SCM_EXPORT ScmObj scm_s_cond(ScmObj clauses, ScmEvalState *eval_state);
 
1359
SCM_EXPORT ScmObj scm_s_case(ScmObj key, ScmObj args,
 
1360
                             ScmEvalState *eval_state);
 
1361
SCM_EXPORT ScmObj scm_s_and(ScmObj args, ScmEvalState *eval_state);
 
1362
SCM_EXPORT ScmObj scm_s_or(ScmObj args, ScmEvalState *eval_state);
 
1363
SCM_EXPORT ScmObj scm_s_let(ScmObj bindings, ScmObj body,
 
1364
                            ScmEvalState *eval_state);
 
1365
SCM_EXPORT ScmObj scm_s_letstar(ScmObj bindings, ScmObj body,
 
1366
                                ScmEvalState *eval_state);
 
1367
SCM_EXPORT ScmObj scm_s_letrec(ScmObj bindings, ScmObj body,
 
1368
                               ScmEvalState *eval_state);
 
1369
SCM_EXPORT ScmObj scm_s_begin(ScmObj args, ScmEvalState *eval_state);
 
1370
SCM_EXPORT ScmObj scm_s_do(ScmObj bindings, ScmObj test_exps, ScmObj commands,
 
1371
                           ScmEvalState *eval_state);
 
1372
SCM_EXPORT ScmObj scm_s_define(ScmObj var, ScmObj rest,
 
1373
                               ScmEvalState *eval_state);
 
1374
 
 
1375
/* qquote.c */
 
1376
#if SCM_USE_QUASIQUOTE
 
1377
SCM_EXPORT ScmObj scm_s_quasiquote(ScmObj datum, ScmObj env);
 
1378
SCM_EXPORT ScmObj scm_s_unquote(ScmObj dummy, ScmObj env);
 
1379
SCM_EXPORT ScmObj scm_s_unquote_splicing(ScmObj dummy, ScmObj env);
 
1380
#endif /* SCM_USE_QUASIQUOTE */
 
1381
 
 
1382
/* promise.c */
 
1383
#if SCM_USE_PROMISE
 
1384
SCM_EXPORT ScmObj scm_s_delay(ScmObj exp, ScmObj env);
 
1385
SCM_EXPORT ScmObj scm_p_force(ScmObj promise);
 
1386
#endif /* SCM_USE_PROMISE */
 
1387
 
 
1388
/* procedure.c */
 
1389
SCM_EXPORT ScmObj scm_p_eqp(ScmObj obj1, ScmObj obj2);
 
1390
SCM_EXPORT ScmObj scm_p_eqvp(ScmObj obj1, ScmObj obj2);
 
1391
SCM_EXPORT ScmObj scm_p_equalp(ScmObj obj1, ScmObj obj2);
 
1392
SCM_EXPORT ScmObj scm_p_not(ScmObj obj);
 
1393
SCM_EXPORT ScmObj scm_p_booleanp(ScmObj obj);
 
1394
SCM_EXPORT ScmObj scm_p_symbolp(ScmObj obj);
 
1395
SCM_EXPORT ScmObj scm_p_symbol2string(ScmObj sym);
 
1396
SCM_EXPORT ScmObj scm_p_string2symbol(ScmObj str);
 
1397
SCM_EXPORT ScmObj scm_p_procedurep(ScmObj obj);
 
1398
SCM_EXPORT ScmObj scm_p_map(ScmObj proc, ScmObj args);
 
1399
SCM_EXPORT ScmObj scm_p_for_each(ScmObj proc, ScmObj args);
 
1400
#if SCM_USE_CONTINUATION
 
1401
SCM_EXPORT ScmObj scm_p_call_with_current_continuation(ScmObj proc, ScmEvalState *eval_state);
 
1402
#endif
 
1403
SCM_EXPORT ScmObj scm_p_values(ScmObj args);
 
1404
SCM_EXPORT ScmObj scm_p_call_with_values(ScmObj producer, ScmObj consumer,
 
1405
                                         ScmEvalState *eval_state);
 
1406
#if SCM_USE_CONTINUATION
 
1407
SCM_EXPORT ScmObj scm_p_dynamic_wind(ScmObj before, ScmObj thunk,
 
1408
                                     ScmObj after);
 
1409
#endif
 
1410
 
 
1411
/* list.c */
 
1412
SCM_EXPORT scm_int_t scm_length(ScmObj lst);
 
1413
SCM_EXPORT ScmObj scm_list_tail(ScmObj lst, scm_int_t k);
 
1414
SCM_EXPORT ScmObj scm_p_pairp(ScmObj obj);
 
1415
SCM_EXPORT ScmObj scm_p_cons(ScmObj car, ScmObj cdr);
 
1416
SCM_EXPORT ScmObj scm_p_car(ScmObj obj);
 
1417
SCM_EXPORT ScmObj scm_p_cdr(ScmObj obj);
 
1418
SCM_EXPORT ScmObj scm_p_set_carx(ScmObj pair, ScmObj car);
 
1419
SCM_EXPORT ScmObj scm_p_set_cdrx(ScmObj pair, ScmObj cdr);
 
1420
SCM_EXPORT ScmObj scm_p_caar(ScmObj lst);
 
1421
SCM_EXPORT ScmObj scm_p_cadr(ScmObj lst);
 
1422
SCM_EXPORT ScmObj scm_p_cdar(ScmObj lst);
 
1423
SCM_EXPORT ScmObj scm_p_cddr(ScmObj lst);
 
1424
SCM_EXPORT ScmObj scm_p_caddr(ScmObj lst);
 
1425
SCM_EXPORT ScmObj scm_p_cdddr(ScmObj lst);
 
1426
SCM_EXPORT ScmObj scm_p_nullp(ScmObj obj);
 
1427
SCM_EXPORT ScmObj scm_p_listp(ScmObj obj);
 
1428
SCM_EXPORT ScmObj scm_p_list(ScmObj args);
 
1429
SCM_EXPORT ScmObj scm_p_length(ScmObj obj);
 
1430
SCM_EXPORT ScmObj scm_p_append(ScmObj args);
 
1431
SCM_EXPORT ScmObj scm_p_reverse(ScmObj lst);
 
1432
SCM_EXPORT ScmObj scm_p_list_tail(ScmObj lst, ScmObj k);
 
1433
SCM_EXPORT ScmObj scm_p_list_ref(ScmObj lst, ScmObj k);
 
1434
SCM_EXPORT ScmObj scm_p_memq(ScmObj obj, ScmObj lst);
 
1435
SCM_EXPORT ScmObj scm_p_memv(ScmObj obj, ScmObj lst);
 
1436
SCM_EXPORT ScmObj scm_p_member(ScmObj obj, ScmObj lst);
 
1437
SCM_EXPORT ScmObj scm_p_assq(ScmObj obj, ScmObj alist);
 
1438
SCM_EXPORT ScmObj scm_p_assv(ScmObj obj, ScmObj alist);
 
1439
SCM_EXPORT ScmObj scm_p_assoc(ScmObj obj, ScmObj alist);
 
1440
 
 
1441
/* number.c */
 
1442
#if SCM_USE_NUMBER
 
1443
SCM_EXPORT ScmObj scm_p_add(ScmObj left, ScmObj right,
 
1444
                            enum ScmReductionState *state);
 
1445
SCM_EXPORT ScmObj scm_p_subtract(ScmObj left, ScmObj right,
 
1446
                                 enum ScmReductionState *state);
 
1447
SCM_EXPORT ScmObj scm_p_multiply(ScmObj left, ScmObj right,
 
1448
                                 enum ScmReductionState *state);
 
1449
SCM_EXPORT ScmObj scm_p_divide(ScmObj left, ScmObj right,
 
1450
                               enum ScmReductionState *state);
 
1451
SCM_EXPORT ScmObj scm_p_equal(ScmObj left, ScmObj right,
 
1452
                              enum ScmReductionState *state);
 
1453
SCM_EXPORT ScmObj scm_p_less(ScmObj left, ScmObj right,
 
1454
                             enum ScmReductionState *state);
 
1455
SCM_EXPORT ScmObj scm_p_less_equal(ScmObj left, ScmObj right,
 
1456
                                   enum ScmReductionState *state);
 
1457
SCM_EXPORT ScmObj scm_p_greater(ScmObj left, ScmObj right,
 
1458
                                enum ScmReductionState *state);
 
1459
SCM_EXPORT ScmObj scm_p_greater_equal(ScmObj left, ScmObj right,
 
1460
                                      enum ScmReductionState *state);
 
1461
SCM_EXPORT ScmObj scm_p_numberp(ScmObj obj);
 
1462
SCM_EXPORT ScmObj scm_p_integerp(ScmObj obj);
 
1463
SCM_EXPORT ScmObj scm_p_zerop(ScmObj n);
 
1464
SCM_EXPORT ScmObj scm_p_positivep(ScmObj n);
 
1465
SCM_EXPORT ScmObj scm_p_negativep(ScmObj n);
 
1466
SCM_EXPORT ScmObj scm_p_oddp(ScmObj n);
 
1467
SCM_EXPORT ScmObj scm_p_evenp(ScmObj n);
 
1468
SCM_EXPORT ScmObj scm_p_max(ScmObj left, ScmObj right,
 
1469
                            enum ScmReductionState *state);
 
1470
SCM_EXPORT ScmObj scm_p_min(ScmObj left, ScmObj right,
 
1471
                            enum ScmReductionState *state);
 
1472
SCM_EXPORT ScmObj scm_p_abs(ScmObj _n);
 
1473
SCM_EXPORT ScmObj scm_p_quotient(ScmObj _n1, ScmObj _n2);
 
1474
SCM_EXPORT ScmObj scm_p_modulo(ScmObj _n1, ScmObj _n2);
 
1475
SCM_EXPORT ScmObj scm_p_remainder(ScmObj _n1, ScmObj _n2);
 
1476
#endif /* SCM_USE_NUMBER */
 
1477
 
 
1478
/* number-io.c */
 
1479
#if SCM_USE_NUMBER_IO
 
1480
SCM_EXPORT scm_int_t scm_string2number(const char *str, int radix,
 
1481
                                       scm_bool *err);
 
1482
#if SCM_USE_STRING
 
1483
SCM_EXPORT char *scm_int2string(ScmValueFormat vfmt, uintmax_t n, int radix);
 
1484
SCM_EXPORT ScmObj scm_p_number2string(ScmObj num, ScmObj args);
 
1485
SCM_EXPORT ScmObj scm_p_string2number(ScmObj str, ScmObj args);
 
1486
#endif /* SCM_USE_STRING */
 
1487
#endif /* SCM_USE_NUMBER_IO */
 
1488
 
 
1489
/* char.c */
 
1490
#if SCM_USE_CHAR
 
1491
SCM_EXPORT ScmObj scm_p_charp(ScmObj obj);
 
1492
SCM_EXPORT ScmObj scm_p_char_equalp(ScmObj ch1, ScmObj ch2);
 
1493
SCM_EXPORT ScmObj scm_p_char_lessp(ScmObj ch1, ScmObj ch2);
 
1494
SCM_EXPORT ScmObj scm_p_char_greaterp(ScmObj ch1, ScmObj ch2);
 
1495
SCM_EXPORT ScmObj scm_p_char_less_equalp(ScmObj ch1, ScmObj ch2);
 
1496
SCM_EXPORT ScmObj scm_p_char_greater_equalp(ScmObj ch1, ScmObj ch2);
 
1497
SCM_EXPORT ScmObj scm_p_char_ci_equalp(ScmObj ch1, ScmObj ch2);
 
1498
SCM_EXPORT ScmObj scm_p_char_ci_lessp(ScmObj ch1, ScmObj ch2);
 
1499
SCM_EXPORT ScmObj scm_p_char_ci_greaterp(ScmObj ch1, ScmObj ch2);
 
1500
SCM_EXPORT ScmObj scm_p_char_ci_less_equalp(ScmObj ch1, ScmObj ch2);
 
1501
SCM_EXPORT ScmObj scm_p_char_ci_greater_equalp(ScmObj ch1, ScmObj ch2);
 
1502
SCM_EXPORT ScmObj scm_p_char_alphabeticp(ScmObj ch);
 
1503
SCM_EXPORT ScmObj scm_p_char_numericp(ScmObj ch);
 
1504
SCM_EXPORT ScmObj scm_p_char_whitespacep(ScmObj ch);
 
1505
SCM_EXPORT ScmObj scm_p_char_upper_casep(ScmObj ch);
 
1506
SCM_EXPORT ScmObj scm_p_char_lower_casep(ScmObj ch);
 
1507
SCM_EXPORT ScmObj scm_p_char2integer(ScmObj ch);
 
1508
SCM_EXPORT ScmObj scm_p_integer2char(ScmObj n);
 
1509
SCM_EXPORT ScmObj scm_p_char_upcase(ScmObj ch);
 
1510
SCM_EXPORT ScmObj scm_p_char_downcase(ScmObj ch);
 
1511
#endif /* SCM_USE_CHAR */
 
1512
 
 
1513
/* string.c */
 
1514
#if SCM_USE_STRING
 
1515
SCM_EXPORT ScmObj scm_p_stringp(ScmObj obj);
 
1516
SCM_EXPORT ScmObj scm_p_string_length(ScmObj str);
 
1517
SCM_EXPORT ScmObj scm_p_stringequalp(ScmObj str1, ScmObj str2);
 
1518
SCM_EXPORT ScmObj scm_p_string_append(ScmObj args);
 
1519
SCM_EXPORT ScmObj scm_p_string_copy(ScmObj str);
 
1520
#endif /* SCM_USE_STRING */
 
1521
 
 
1522
/* string-procedure.c */
 
1523
#if SCM_USE_STRING_PROCEDURE
 
1524
SCM_EXPORT ScmObj scm_p_make_string(ScmObj length, ScmObj args);
 
1525
SCM_EXPORT ScmObj scm_p_string(ScmObj args);
 
1526
SCM_EXPORT ScmObj scm_p_string_ref(ScmObj str, ScmObj k);
 
1527
SCM_EXPORT ScmObj scm_p_string_setx(ScmObj str, ScmObj k, ScmObj ch);
 
1528
SCM_EXPORT ScmObj scm_p_string_ci_equalp(ScmObj str1, ScmObj str2);
 
1529
SCM_EXPORT ScmObj scm_p_string_greaterp(ScmObj str1, ScmObj str2);
 
1530
SCM_EXPORT ScmObj scm_p_string_lessp(ScmObj str1, ScmObj str2);
 
1531
SCM_EXPORT ScmObj scm_p_string_greater_equalp(ScmObj str1, ScmObj str2);
 
1532
SCM_EXPORT ScmObj scm_p_string_less_equalp(ScmObj str1, ScmObj str2);
 
1533
SCM_EXPORT ScmObj scm_p_string_ci_greaterp(ScmObj str1, ScmObj str2);
 
1534
SCM_EXPORT ScmObj scm_p_string_ci_lessp(ScmObj str1, ScmObj str2);
 
1535
SCM_EXPORT ScmObj scm_p_string_ci_greater_equalp(ScmObj str1, ScmObj str2);
 
1536
SCM_EXPORT ScmObj scm_p_string_ci_less_equalp(ScmObj str1, ScmObj str2);
 
1537
SCM_EXPORT ScmObj scm_p_substring(ScmObj str, ScmObj start, ScmObj end);
 
1538
SCM_EXPORT ScmObj scm_p_string2list(ScmObj str);
 
1539
SCM_EXPORT ScmObj scm_p_list2string(ScmObj lst);
 
1540
SCM_EXPORT ScmObj scm_p_string_fillx(ScmObj str, ScmObj ch);
 
1541
SCM_EXPORT ScmObj scm_p_string_mutablep(ScmObj str);
 
1542
SCM_EXPORT ScmObj scm_p_string_reconstructx(ScmObj str);
 
1543
#endif /* SCM_USE_STRING_PROCEDURE */
 
1544
 
 
1545
/* vector.c */
 
1546
#if SCM_USE_VECTOR
 
1547
SCM_EXPORT ScmObj scm_p_vectorp(ScmObj obj);
 
1548
SCM_EXPORT ScmObj scm_p_make_vector(ScmObj scm_len, ScmObj args);
 
1549
SCM_EXPORT ScmObj scm_p_vector(ScmObj args);
 
1550
SCM_EXPORT ScmObj scm_p_vector_length(ScmObj vec);
 
1551
SCM_EXPORT ScmObj scm_p_vector_ref(ScmObj vec, ScmObj _k);
 
1552
SCM_EXPORT ScmObj scm_p_vector_setx(ScmObj vec, ScmObj _k, ScmObj obj);
 
1553
SCM_EXPORT ScmObj scm_p_vector2list(ScmObj vec);
 
1554
SCM_EXPORT ScmObj scm_p_list2vector(ScmObj lst);
 
1555
SCM_EXPORT ScmObj scm_p_vector_fillx(ScmObj vec, ScmObj fill);
 
1556
SCM_EXPORT ScmObj scm_p_vector_mutablep(ScmObj vec);
 
1557
#endif /* SCM_USE_VECTOR */
 
1558
 
 
1559
/* deep-cadrs.c */
 
1560
#if SCM_USE_DEEP_CADRS
 
1561
SCM_EXPORT ScmObj scm_p_caaar(ScmObj lst);
 
1562
SCM_EXPORT ScmObj scm_p_caadr(ScmObj lst);
 
1563
SCM_EXPORT ScmObj scm_p_cadar(ScmObj lst);
 
1564
SCM_EXPORT ScmObj scm_p_cdaar(ScmObj lst);
 
1565
SCM_EXPORT ScmObj scm_p_cdadr(ScmObj lst);
 
1566
SCM_EXPORT ScmObj scm_p_cddar(ScmObj lst);
 
1567
SCM_EXPORT ScmObj scm_p_caaaar(ScmObj lst);
 
1568
SCM_EXPORT ScmObj scm_p_caaadr(ScmObj lst);
 
1569
SCM_EXPORT ScmObj scm_p_caadar(ScmObj lst);
 
1570
SCM_EXPORT ScmObj scm_p_caaddr(ScmObj lst);
 
1571
SCM_EXPORT ScmObj scm_p_cadaar(ScmObj lst);
 
1572
SCM_EXPORT ScmObj scm_p_cadadr(ScmObj lst);
 
1573
SCM_EXPORT ScmObj scm_p_caddar(ScmObj lst);
 
1574
SCM_EXPORT ScmObj scm_p_cadddr(ScmObj lst);
 
1575
SCM_EXPORT ScmObj scm_p_cdaaar(ScmObj lst);
 
1576
SCM_EXPORT ScmObj scm_p_cdaadr(ScmObj lst);
 
1577
SCM_EXPORT ScmObj scm_p_cdadar(ScmObj lst);
 
1578
SCM_EXPORT ScmObj scm_p_cdaddr(ScmObj lst);
 
1579
SCM_EXPORT ScmObj scm_p_cddaar(ScmObj lst);
 
1580
SCM_EXPORT ScmObj scm_p_cddadr(ScmObj lst);
 
1581
SCM_EXPORT ScmObj scm_p_cdddar(ScmObj lst);
 
1582
SCM_EXPORT ScmObj scm_p_cddddr(ScmObj lst);
 
1583
#endif /* SCM_USE_DEEP_CADRS */
 
1584
 
 
1585
/* macro.c */
 
1586
#if SCM_USE_HYGIENIC_MACRO
 
1587
SCM_EXPORT ScmObj scm_s_match(ScmObj form, ScmObj patterns,
 
1588
                              ScmEvalState *state);
 
1589
SCM_EXPORT ScmObj scm_s_syntax_rules(ScmObj rules, ScmObj env);
 
1590
SCM_EXPORT ScmObj scm_s_expand_macro(ScmObj macro, ScmObj args,
 
1591
                                     ScmEvalState *eval_state);
 
1592
SCM_EXPORT ScmObj scm_s_let_syntax(ScmObj bindings, ScmObj body,
 
1593
                                   ScmEvalState *eval_state);
 
1594
SCM_EXPORT ScmObj scm_s_letrec_syntax(ScmObj bindings, ScmObj body,
 
1595
                                      ScmEvalState *eval_state);
 
1596
SCM_EXPORT ScmObj scm_s_define_syntax(ScmObj var, ScmObj macro, ScmObj env);
 
1597
SCM_EXPORT ScmObj scm_unwrap_syntaxx(ScmObj obj);
 
1598
SCM_EXPORT ScmObj scm_unwrap_keyword(ScmObj obj);
 
1599
#endif
 
1600
 
 
1601
/* port.c */
 
1602
#if SCM_USE_PORT
 
1603
SCM_EXPORT ScmObj scm_make_shared_file_port(FILE *file, const char *aux_info,
 
1604
                                            enum ScmPortFlag flag);
 
1605
SCM_EXPORT void scm_port_close(ScmObj port);
 
1606
SCM_EXPORT ScmCharCodec *scm_port_codec(ScmObj port);
 
1607
SCM_EXPORT char *scm_port_inspect(ScmObj port);
 
1608
SCM_EXPORT scm_ichar_t scm_port_get_char(ScmObj port);
 
1609
SCM_EXPORT scm_ichar_t scm_port_peek_char(ScmObj port);
 
1610
SCM_EXPORT scm_bool scm_port_char_readyp(ScmObj port);
 
1611
SCM_EXPORT void scm_port_puts(ScmObj port, const char *str);
 
1612
SCM_EXPORT void scm_port_put_char(ScmObj port, scm_ichar_t ch);
 
1613
SCM_EXPORT void scm_port_newline(ScmObj port);
 
1614
SCM_EXPORT void scm_port_flush(ScmObj port);
 
1615
SCM_EXPORT ScmObj scm_p_input_portp(ScmObj obj);
 
1616
SCM_EXPORT ScmObj scm_p_output_portp(ScmObj obj);
 
1617
SCM_EXPORT ScmObj scm_p_current_input_port(void);
 
1618
SCM_EXPORT ScmObj scm_p_current_output_port(void);
 
1619
SCM_EXPORT ScmObj scm_p_current_error_port(void);
 
1620
SCM_EXPORT ScmObj scm_p_set_current_input_portx(ScmObj newport);
 
1621
SCM_EXPORT ScmObj scm_p_set_current_output_portx(ScmObj newport);
 
1622
SCM_EXPORT ScmObj scm_p_set_current_error_portx(ScmObj newport);
 
1623
SCM_EXPORT ScmObj scm_p_open_input_file(ScmObj filepath);
 
1624
SCM_EXPORT ScmObj scm_p_open_output_file(ScmObj filepath);
 
1625
SCM_EXPORT ScmObj scm_p_close_input_port(ScmObj port);
 
1626
SCM_EXPORT ScmObj scm_p_close_output_port(ScmObj port);
 
1627
#if SCM_USE_CHAR
 
1628
SCM_EXPORT ScmObj scm_p_read_char(ScmObj args);
 
1629
SCM_EXPORT ScmObj scm_p_peek_char(ScmObj args);
 
1630
SCM_EXPORT ScmObj scm_p_char_readyp(ScmObj args);
 
1631
#endif
 
1632
SCM_EXPORT ScmObj scm_p_eof_objectp(ScmObj obj);
 
1633
SCM_EXPORT ScmObj scm_p_newline(ScmObj args);
 
1634
#if SCM_USE_CHAR
 
1635
SCM_EXPORT ScmObj scm_p_write_char(ScmObj obj, ScmObj args);
 
1636
#endif
 
1637
#endif /* SCM_USE_PORT */
 
1638
 
 
1639
/* read.c */
 
1640
#if SCM_USE_READER
 
1641
SCM_EXPORT ScmObj scm_read(ScmObj port);
 
1642
SCM_EXPORT ScmObj scm_p_read(ScmObj args);
 
1643
#endif /* SCM_USE_READER */
 
1644
 
 
1645
/* write.c */
 
1646
#if SCM_USE_WRITER
 
1647
SCM_EXPORT void scm_write(ScmObj port, ScmObj obj);
 
1648
SCM_EXPORT void scm_display(ScmObj port, ScmObj obj);
 
1649
#if SCM_USE_SRFI38
 
1650
SCM_EXPORT void scm_write_ss(ScmObj port, ScmObj obj);
 
1651
#endif /* SCM_USE_SRFI38 */
 
1652
SCM_EXPORT ScmObj scm_p_write(ScmObj obj, ScmObj args);
 
1653
SCM_EXPORT ScmObj scm_p_display(ScmObj obj, ScmObj args);
 
1654
#endif /* SCM_USE_WRITER */
 
1655
 
 
1656
/* load.c */
 
1657
#if SCM_USE_LOAD
 
1658
SCM_EXPORT void scm_set_lib_path(const char *path);
 
1659
SCM_EXPORT void scm_set_system_load_path(const char *path);
 
1660
SCM_EXPORT void scm_load(const char *filename);
 
1661
SCM_EXPORT ScmObj scm_p_load_path(void);
 
1662
SCM_EXPORT ScmObj scm_p_system_load_path(void);
 
1663
SCM_EXPORT ScmObj scm_p_load(ScmObj filename);
 
1664
#endif /* SCM_USE_LOAD */
 
1665
 
 
1666
/* format.c */
 
1667
#if SCM_USE_FORMAT
 
1668
SCM_EXPORT ScmObj scm_lformat(ScmObj port, enum ScmFormatCapability fcap,
 
1669
                              const char *fmt, ScmObj scm_args);
 
1670
SCM_EXPORT ScmObj scm_vformat(ScmObj port, enum ScmFormatCapability fcap,
 
1671
                              const char *fmt, va_list c_args);
 
1672
SCM_EXPORT ScmObj scm_format(ScmObj port, enum ScmFormatCapability fcap,
 
1673
                             const char *fmt, ...);
 
1674
#endif /* SCM_USE_FORMAT */
 
1675
 
 
1676
/*===========================================================================
 
1677
   SigScheme: Optional Funtions
 
1678
===========================================================================*/
 
1679
/* legacy-macro.c */
 
1680
#if SCM_USE_LEGACY_MACRO
 
1681
SCM_EXPORT ScmObj scm_s_define_macro(ScmObj identifier, ScmObj rest,
 
1682
                                     ScmEvalState *eval_state);
 
1683
#endif /* SCM_USE_LEGACY_MACRO */
 
1684
 
 
1685
/* module-sscm-ext.c */
 
1686
#if SCM_USE_SSCM_EXTENSIONS
 
1687
SCM_EXPORT void scm_require(const char *filename);
 
1688
SCM_EXPORT ScmObj scm_p_symbol_boundp(ScmObj sym, ScmObj rest);
 
1689
SCM_EXPORT ScmObj scm_p_sscm_version(void);
 
1690
SCM_EXPORT ScmObj scm_p_current_environment(ScmEvalState *eval_state);
 
1691
SCM_EXPORT ScmObj scm_p_current_char_codec(void);
 
1692
SCM_EXPORT ScmObj scm_p_set_current_char_codecx(ScmObj encoding);
 
1693
SCM_EXPORT ScmObj scm_p_prealloc_heaps(ScmObj n);
 
1694
SCM_EXPORT ScmObj scm_p_pair_mutablep(ScmObj kons);
 
1695
SCM_EXPORT ScmObj scm_p_fixnum_width(void);
 
1696
SCM_EXPORT ScmObj scm_p_least_fixnum(void);
 
1697
SCM_EXPORT ScmObj scm_p_greatest_fixnum(void);
 
1698
SCM_EXPORT ScmObj scm_p_require(ScmObj filename);
 
1699
SCM_EXPORT ScmObj scm_p_provide(ScmObj feature);
 
1700
SCM_EXPORT ScmObj scm_p_providedp(ScmObj feature);
 
1701
SCM_EXPORT ScmObj scm_p_lengthstar(ScmObj lst);
 
1702
SCM_EXPORT ScmObj scm_p_exit(ScmObj args) SCM_NORETURN;
 
1703
SCM_EXPORT ScmObj scm_s_let_optionalsstar(ScmObj args,
 
1704
                                          ScmObj bindings, ScmObj body,
 
1705
                                          ScmEvalState *eval_state);
 
1706
#endif /* SCM_USE_SSCM_EXTENSIONS */
 
1707
 
 
1708
/* module-siod.c */
 
1709
#if SCM_COMPAT_SIOD
 
1710
SCM_EXPORT ScmObj scm_p_symbol_value(ScmObj var);
 
1711
SCM_EXPORT ScmObj scm_p_set_symbol_valuex(ScmObj var, ScmObj val);
 
1712
SCM_EXPORT ScmObj scm_p_siod_equal(ScmObj obj1, ScmObj obj2);
 
1713
SCM_EXPORT ScmObj scm_p_closure_code(ScmObj closure);
 
1714
SCM_EXPORT ScmObj scm_p_verbose(ScmObj args);
 
1715
SCM_EXPORT ScmObj scm_p_eof_val(void);
 
1716
SCM_EXPORT ScmObj scm_s_undefine(ScmObj var, ScmObj env);
 
1717
SCM_EXPORT long   scm_get_verbose_level(void);
 
1718
SCM_EXPORT void   scm_set_verbose_level(long level);
 
1719
#endif /* SCM_COMPAT_SIOD */
 
1720
 
 
1721
/* module-srfi1.c */
 
1722
#if SCM_USE_SRFI1
 
1723
SCM_EXPORT ScmObj scm_p_srfi1_circular_listp(ScmObj obj);
 
1724
SCM_EXPORT ScmObj scm_p_srfi1_dotted_listp(ScmObj obj);
 
1725
SCM_EXPORT ScmObj scm_p_srfi1_last_pair(ScmObj lst);
 
1726
SCM_EXPORT ScmObj scm_p_srfi1_lengthplus(ScmObj lst);
 
1727
SCM_EXPORT ScmObj scm_p_srfi1_map_in_order(ScmObj proc, ScmObj args);
 
1728
SCM_EXPORT ScmObj scm_p_srfi1_find_tail(ScmObj pred, ScmObj lst);
 
1729
#endif /* SCM_USE_SRFI1 */
 
1730
 
 
1731
/* module-srfi2.c */
 
1732
#if SCM_USE_SRFI2
 
1733
SCM_EXPORT ScmObj scm_s_srfi2_and_letstar(ScmObj claws, ScmObj body,
 
1734
                                          ScmEvalState *eval_state);
 
1735
#endif
 
1736
 
 
1737
/* module-srfi6.c */
 
1738
#if SCM_USE_SRFI6
 
1739
SCM_EXPORT ScmObj scm_p_srfi6_open_input_string(ScmObj str);
 
1740
SCM_EXPORT ScmObj scm_p_srfi6_open_output_string(void);
 
1741
SCM_EXPORT ScmObj scm_p_srfi6_get_output_string(ScmObj port);
 
1742
#endif
 
1743
 
 
1744
/* module-srfi8.c */
 
1745
#if SCM_USE_SRFI8
 
1746
SCM_EXPORT ScmObj scm_s_srfi8_receive(ScmObj formals, ScmObj expr, ScmObj body,
 
1747
                                      ScmEvalState *eval_state);
 
1748
#endif
 
1749
 
 
1750
/* module-srfi9.c */
 
1751
#if SCM_USE_SRFI9
 
1752
SCM_EXPORT ScmObj scm_s_srfi9_define_record_type(ScmObj type_name,
 
1753
                                                 ScmObj ctor_spec,
 
1754
                                                 ScmObj pred_name,
 
1755
                                                 ScmObj field_specs,
 
1756
                                                 ScmEvalState *eval_state);
 
1757
#endif
 
1758
 
 
1759
/* module-srfi23.c */
 
1760
#if SCM_USE_SRFI23
 
1761
SCM_EXPORT ScmObj scm_p_srfi23_error(ScmObj reason, ScmObj args);
 
1762
#endif
 
1763
 
 
1764
/* module-srfi28.c */
 
1765
#if SCM_USE_SRFI28
 
1766
SCM_EXPORT ScmObj scm_p_srfi28_format(ScmObj fmt, ScmObj objs);
 
1767
#endif
 
1768
 
 
1769
/* module-srfi34.c */
 
1770
#if SCM_USE_SRFI34
 
1771
SCM_EXPORT ScmObj scm_p_srfi34_with_exception_handler(ScmObj handler,
 
1772
                                                      ScmObj thunk);
 
1773
SCM_EXPORT ScmObj scm_s_srfi34_guard(ScmObj cond_catch, ScmObj body,
 
1774
                                     ScmEvalState *eval_state);
 
1775
SCM_EXPORT ScmObj scm_p_srfi34_raise(ScmObj obj);
 
1776
#endif
 
1777
 
 
1778
/* module-srfi38.c */
 
1779
#if SCM_USE_SRFI38
 
1780
SCM_EXPORT ScmObj scm_p_srfi38_write_with_shared_structure(ScmObj obj,
 
1781
                                                           ScmObj args);
 
1782
#endif
 
1783
 
 
1784
/* module-srfi48.c */
 
1785
#if SCM_USE_SRFI48
 
1786
SCM_EXPORT ScmObj scm_p_srfi48_format(ScmObj fmt_or_port, ScmObj rest);
 
1787
SCM_EXPORT ScmObj scm_p_formatplus(ScmObj fmt_or_port, ScmObj rest);
 
1788
#endif
 
1789
 
 
1790
/* module-srfi55.c */
 
1791
#if SCM_USE_SRFI55
 
1792
SCM_EXPORT ScmObj scm_s_srfi55_require_extension(ScmObj clauses, ScmObj env);
 
1793
#endif
 
1794
 
 
1795
/* module-srfi60.c */
 
1796
#if SCM_USE_SRFI60
 
1797
SCM_EXPORT ScmObj scm_p_srfi60_logand(ScmObj left, ScmObj right,
 
1798
                                      enum ScmReductionState *state);
 
1799
SCM_EXPORT ScmObj scm_p_srfi60_logior(ScmObj left, ScmObj right,
 
1800
                                      enum ScmReductionState *state);
 
1801
SCM_EXPORT ScmObj scm_p_srfi60_logxor(ScmObj left, ScmObj right,
 
1802
                                      enum ScmReductionState *state);
 
1803
SCM_EXPORT ScmObj scm_p_srfi60_lognot(ScmObj n);
 
1804
SCM_EXPORT ScmObj scm_p_srfi60_bitwise_if(ScmObj mask, ScmObj n0, ScmObj n1);
 
1805
SCM_EXPORT ScmObj scm_p_srfi60_logtest(ScmObj j, ScmObj k);
 
1806
#endif
 
1807
 
 
1808
#ifdef __cplusplus
 
1809
}
 
1810
#endif
 
1811
 
 
1812
#endif /* __SIGSCHEME_H */