Changes from arch/CVS synchronization
[bpt/guile.git] / libguile / __scm.h
CommitLineData
0f2d19dd
JB
1/* classes: h_files */
2
729dbac3
DH
3#ifndef SCM___SCM_H
4#define SCM___SCM_H
8c494e99 5
2b829bbb 6/* Copyright (C) 1995,1996,1998,1999,2000,2001,2002,2003, 2006 Free Software Foundation, Inc.
8c494e99 7 *
0f2d19dd
JB
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2, or (at your option)
11 * any later version.
8c494e99 12 *
0f2d19dd
JB
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
8c494e99 17 *
0f2d19dd
JB
18 * You should have received a copy of the GNU General Public License
19 * along with this software; see the file COPYING. If not, write to
92205699
MV
20 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21 * Boston, MA 02110-1301 USA
0f2d19dd
JB
22 *
23 * As a special exception, the Free Software Foundation gives permission
24 * for additional uses of the text contained in its release of GUILE.
25 *
26 * The exception is that, if you link the GUILE library with other files
27 * to produce an executable, this does not by itself cause the
28 * resulting executable to be covered by the GNU General Public License.
29 * Your use of that executable is in no way restricted on account of
30 * linking the GUILE library code into it.
31 *
32 * This exception does not however invalidate any other reasons why
33 * the executable file might be covered by the GNU General Public License.
34 *
35 * This exception applies only to the code released by the
36 * Free Software Foundation under the name GUILE. If you copy
37 * code from other Free Software Foundation releases into a copy of
38 * GUILE, as the General Public License permits, the exception does
39 * not apply to the code that you add in this way. To avoid misleading
40 * anyone as to the status of such modified files, you must delete
41 * this exception notice from them.
42 *
43 * If you write modifications of your own for GUILE, it is your choice
44 * whether to permit this exception to apply to your modifications.
82892bed 45 * If you do not wish that, delete this exception notice. */
8c494e99 46
0f2d19dd 47\f
176067df 48
92e6989f
RB
49/**********************************************************************
50 This file is Guile's central public header.
51
52 When included by other files, this file should preceed any include
53 other than __scm.h.
54
55 Under *NO* circumstances should new items be added to the global
56 namespace (via adding #define, typedef, or similar to this file) with
57 generic names. This usually means that any new names should be
58 prefixed by either SCM_ or GUILE_. i.e. do *not* #define HAVE_FOO or
59 SIZEOF_BAR. See configure.in, gen-scmconfig.h.in, and
60 gen-scmconfig.c for examples of how to properly handle this issue.
61 The main documentation is in gen-scmconfig.c.
62
63 "What's the difference between _scm.h and __scm.h?"
176067df
JB
64
65 _scm.h is not installed; it's only visible to the libguile sources
92e6989f 66 themselves, and it includes config.h, the private config header.
176067df
JB
67
68 __scm.h is installed, and is #included by <libguile.h>. If both
69 the client and libguile need some piece of information, and it
70 doesn't fit well into the header file for any particular module, it
92e6989f
RB
71 should go in __scm.h. __scm.h includes scmconfig.h, the public
72 config header.
73 **********************************************************************/
74
75/* What did the configure script discover about the outside world? */
76#include "libguile/scmconfig.h"
176067df 77
92e6989f 78\f
176067df 79
e81d98ec
DH
80/* {Compiler hints}
81 *
82 * The following macros are used to provide additional information for the
83 * compiler, which may help to do better error checking and code
84 * optimization. A second benefit of these macros is, that they also provide
85 * additional information to the developers.
86 */
87
88/* The macro SCM_NORETURN indicates that a function will never return.
89 * Examples:
90 * 1) int foo (char arg) SCM_NORETURN;
91 */
92#ifdef __GNUC__
93#define SCM_NORETURN __attribute__ ((noreturn))
94#else
95#define SCM_NORETURN
96#endif
97
98/* The macro SCM_UNUSED indicates that a function, function argument or
99 * variable may potentially be unused.
100 * Examples:
101 * 1) static int unused_function (char arg) SCM_UNUSED;
102 * 2) int foo (char unused_argument SCM_UNUSED);
103 * 3) int unused_variable SCM_UNUSED;
104 */
105#ifdef __GNUC__
106#define SCM_UNUSED __attribute__ ((unused))
107#else
108#define SCM_UNUSED
109#endif
110
111
0f2d19dd
JB
112/* {Supported Options}
113 *
114 * These may be defined or undefined.
115 */
116
16d35552 117/* #define GUILE_DEBUG_FREELIST */
70d63753 118
0f2d19dd
JB
119/* All the number support there is.
120 */
0f2d19dd
JB
121#define BIGNUMS
122
686765af
ML
123/* GC should relinquish empty cons-pair arenas. */
124/* cmm:FIXME look at this after done mangling the GC */
125/* #define GC_FREE_SEGMENTS */
0f2d19dd
JB
126
127/* Provide a scheme-accessible count-down timer that
128 * generates a pseudo-interrupt.
129 */
130#define TICKS
131
132
133/* Use engineering notation when converting numbers strings?
134 */
135#undef ENGNOT
136
0f2d19dd
JB
137\f
138/* {Unsupported Options}
139 *
3c205827 140 * These must be defined as given here.
0f2d19dd
JB
141 */
142
143
144#define CCLO
3c205827
JB
145
146/* Guile Scheme supports the #f/() distinction; Guile Lisp won't. We
147 have horrible plans for their unification. */
148#undef SICP
0f2d19dd
JB
149
150\f
151
80c78696 152/* Random options (not yet supported or in final form). */
0f2d19dd 153
80c78696
MD
154#define STACK_CHECKING
155#undef NO_CEVAL_STACK_CHECKING
0f2d19dd 156
43ff3170 157\f
3a9809df 158
1174045c
MV
159/* SCM_API is a macro prepended to all function and data definitions
160 which should be exported or imported in the resulting dynamic link
8f99e3f3 161 library (DLL) in the Win32 port. */
1174045c 162
8f99e3f3 163#if defined (SCM_IMPORT)
1174045c 164# define SCM_API __declspec (dllimport) extern
8f99e3f3 165#elif defined (SCM_EXPORT) || defined (DLL_EXPORT)
1174045c
MV
166# define SCM_API __declspec (dllexport) extern
167#else
168# define SCM_API extern
169#endif
170
171\f
172
3a9809df
DH
173/* {Debugging Options}
174 *
175 * These compile time options determine whether to include code that is only
176 * useful for debugging guile itself or C level extensions to guile. The
177 * common prefix for all option macros of this kind is "SCM_DEBUG_". It is
fce0b22d
DH
178 * guaranteed that a macro named SCM_DEBUG_XXX is always defined (typically to
179 * either 0 or 1), i. e. there is no need to test for the undefined case.
180 * This allows to use these definitions comfortably within code, as in the
181 * following example:
3a9809df
DH
182 * #define FOO do { if (SCM_DEBUG_XXX) bar(); else baz(); } while (0)
183 * Any sane compiler will remove the unused branch without any performance
184 * penalty for the resulting code.
185 *
186 * Note: Some SCM_DEBUG_XXX options are not settable at configure time.
187 * To change the value of such options you will have to edit this header
56100716
DH
188 * file or give suitable options to make, like:
189 * make all CFLAGS="-DSCM_DEBUG_XXX=1 ..."
3a9809df
DH
190 */
191
192
c8a54c4b
DH
193/* The value of SCM_DEBUG determines the default for most of the not yet
194 * defined debugging options. This allows, for example, to enable most of the
195 * debugging options by simply defining SCM_DEBUG as 1.
196 */
197#ifndef SCM_DEBUG
198#define SCM_DEBUG 0
199#endif
200
46d53380
DH
201/* If SCM_DEBUG_CELL_ACCESSES is set to 1, cell accesses will perform
202 * exhaustive parameter checking: It will be verified that cell parameters
203 * actually point to a valid heap cell. Note: If this option is enabled,
204 * guile will run about ten times slower than normally.
205 */
206#ifndef SCM_DEBUG_CELL_ACCESSES
207#define SCM_DEBUG_CELL_ACCESSES SCM_DEBUG
208#endif
209
216eedfc
DH
210/* If SCM_DEBUG_INTERRUPTS is set to 1, with every deferring and allowing of
211 * interrupts a consistency check will be performed.
212 */
213#ifndef SCM_DEBUG_INTERRUPTS
214#define SCM_DEBUG_INTERRUPTS SCM_DEBUG
215#endif
216
e81d98ec
DH
217/* If SCM_DEBUG_PAIR_ACCESSES is set to 1, accesses to cons cells will be
218 * exhaustively checked. Note: If this option is enabled, guile will run
219 * slower than normally.
220 */
221#ifndef SCM_DEBUG_PAIR_ACCESSES
222#define SCM_DEBUG_PAIR_ACCESSES SCM_DEBUG
223#endif
224
af45e3b0
DH
225/* If SCM_DEBUG_REST_ARGUMENT is set to 1, functions that take rest arguments
226 * will check whether the rest arguments are actually passed as a proper list.
227 * Otherwise, if SCM_DEBUG_REST_ARGUMENT is 0, functions that take rest
228 * arguments will take it for granted that these are passed as a proper list.
c8a54c4b 229 */
af45e3b0
DH
230#ifndef SCM_DEBUG_REST_ARGUMENT
231#define SCM_DEBUG_REST_ARGUMENT SCM_DEBUG
3a9809df
DH
232#endif
233
fce0b22d
DH
234/* The macro SCM_DEBUG_TYPING_STRICTNESS indicates what level of type checking
235 * shall be performed with respect to the use of the SCM datatype. The macro
236 * may be defined to one of the values 0, 1 and 2.
237 *
238 * A value of 0 means that there will be no compile time type checking, since
239 * the SCM datatype will be declared as an integral type. This setting should
240 * only be used on systems, where casting from integral types to pointers may
241 * lead to loss of bit information.
242 *
243 * A value of 1 means that there will an intermediate level of compile time
244 * type checking, since the SCM datatype will be declared as a pointer to an
245 * undefined struct. This setting is the default, since it does not cost
246 * anything in terms of performance or code size.
247 *
248 * A value of 2 provides a maximum level of compile time type checking since
249 * the SCM datatype will be declared as a struct. This setting should be used
250 * for _compile time_ type checking only, since the compiled result is likely
251 * to be quite inefficient. The right way to make use of this option is to do
252 * a 'make clean; make CFLAGS=-DSCM_DEBUG_TYPING_STRICTNESS=2', fix your
56100716 253 * errors, and then do 'make clean; make'.
c8a54c4b 254 */
56100716 255#ifndef SCM_DEBUG_TYPING_STRICTNESS
729dbac3 256#define SCM_DEBUG_TYPING_STRICTNESS 1
56100716
DH
257#endif
258
d0624e39
DH
259/* If SCM_DEBUG_DEBUGGING_SUPPORT is set to 1, guile will provide a set of
260 * special functions that support debugging with a debugger like gdb or
261 * debugging of guile internals on the scheme level. The behaviour of guile
262 * is not changed by this macro, only the set of functions that are available
263 * will differ. All functions that are introduced this way have the prefix
264 * 'scm_dbg_' on the C level and the prefix 'dbg-' on the scheme level. This
265 * allows to easily determine the set of support functions, given that your
266 * debugger or repl provide automatic name completion. Note that these
267 * functions are intended to be used during interactive debugging sessions
268 * only. They are not considered part of guile's official API. They may
269 * change or disappear without notice or deprecation phase.
94fb5a6e 270 */
d0624e39
DH
271#ifndef SCM_DEBUG_DEBUGGING_SUPPORT
272#define SCM_DEBUG_DEBUGGING_SUPPORT SCM_DEBUG
94fb5a6e
DH
273#endif
274
3a9809df
DH
275\f
276
8c494e99
DH
277/* {Feature Options}
278 *
279 * These compile time options determine whether code for certain features
280 * should be compiled into guile. The common prefix for all option macros
281 * of this kind is "SCM_ENABLE_". It is guaranteed that a macro named
282 * SCM_ENABLE_XXX is defined to be either 0 or 1, i. e. there is no need to
283 * test for the undefined case. This allows to use these definitions
284 * comfortably within code, as in the following example:
285 * #define FOO do { if (SCM_ENABLE_XXX) bar(); else baz(); } while (0)
286 * Any sane compiler will remove the unused branch without any performance
287 * penalty for the resulting code.
288 *
289 * Note: Some SCM_ENABLE_XXX options are not settable at configure time.
290 * To change the value of such options you will have to edit this header
291 * file or give suitable options to make, like:
292 * make all CFLAGS="-DSCM_ENABLE_XXX=1 ..."
0f2d19dd 293 */
1be6b49c 294
8c494e99
DH
295/* If SCM_ENABLE_DEPRECATED is set to 1, deprecated code will be included in
296 * guile, as well as some functions to issue run-time warnings about uses of
297 * deprecated functions.
298 */
299#ifndef SCM_ENABLE_DEPRECATED
300#define SCM_ENABLE_DEPRECATED 0
1be6b49c 301#endif
0f2d19dd 302
b971d089 303\f
0f2d19dd 304
5c75b29f 305/* {Architecture and compiler properties}
0f2d19dd 306 *
5c75b29f
DH
307 * Guile as of today can only work on systems which fulfill at least the
308 * following requirements:
59c4bb82
DH
309 *
310 * - scm_t_bits and SCM variables have at least 32 bits.
5c75b29f 311 * Guile's type system is based on this assumption.
59c4bb82
DH
312 *
313 * - sizeof (scm_t_bits) >= sizeof (void*) and sizeof (SCM) >= sizeof (void*)
314 * Guile's type system is based on this assumption, since it must be
315 * possible to store pointers to cells on the heap in scm_t_bits and SCM
316 * variables.
317 *
318 * - sizeof (scm_t_bits) >= 4 and sizeof (scm_t_bits) is a power of 2.
319 * Guile's type system is based on this assumption. In particular, it is
320 * assumed that cells, i. e. pairs of scm_t_bits variables, are eight
321 * character aligned. This is because three bits of a scm_t_bits variable
322 * that is holding a pointer to a cell on the heap must be available for
323 * storing type data.
324 *
325 * - sizeof (scm_t_bits) <= sizeof (void*) and sizeof (SCM) <= sizeof (void*)
326 * In some parts of guile, scm_t_bits and SCM variables are passed to
327 * functions as void* arguments. Together with the requirement above, this
328 * requires a one-to-one correspondence between the size of a void* and the
329 * sizes of scm_t_bits and SCM variables.
330 *
5c75b29f
DH
331 * - numbers are encoded using two's complement.
332 * The implementation of the bitwise scheme level operations is based on
333 * this assumption.
59c4bb82 334 *
5c75b29f 335 * - ... add more
0f2d19dd
JB
336 */
337
5c75b29f
DH
338#ifdef CHAR_BIT
339# define SCM_CHAR_BIT CHAR_BIT
340#else
341# define SCM_CHAR_BIT 8
342#endif
343
344#ifdef LONG_BIT
345# define SCM_LONG_BIT LONG_BIT
346#else
347# define SCM_LONG_BIT (SCM_CHAR_BIT * sizeof (long) / sizeof (char))
348#endif
349
350#ifdef UCHAR_MAX
351# define SCM_CHAR_CODE_LIMIT (UCHAR_MAX + 1L)
0f2d19dd 352#else
e2806c10 353# define SCM_CHAR_CODE_LIMIT 256L
5c75b29f
DH
354#endif
355
e88d45aa
MV
356#define SCM_I_UTYPE_MAX(type) ((type)-1)
357#define SCM_I_TYPE_MAX(type,umax) ((type)((umax)/2))
358#define SCM_I_TYPE_MIN(type,umax) (-((type)((umax)/2))-1)
359
360#define SCM_T_UINT8_MAX SCM_I_UTYPE_MAX(scm_t_uint8)
361#define SCM_T_INT8_MIN SCM_I_TYPE_MIN(scm_t_int8,SCM_T_UINT8_MAX)
362#define SCM_T_INT8_MAX SCM_I_TYPE_MAX(scm_t_int8,SCM_T_UINT8_MAX)
363
364#define SCM_T_UINT16_MAX SCM_I_UTYPE_MAX(scm_t_uint16)
365#define SCM_T_INT16_MIN SCM_I_TYPE_MIN(scm_t_int16,SCM_T_UINT16_MAX)
366#define SCM_T_INT16_MAX SCM_I_TYPE_MAX(scm_t_int16,SCM_T_UINT16_MAX)
367
368#define SCM_T_UINT32_MAX SCM_I_UTYPE_MAX(scm_t_uint32)
369#define SCM_T_INT32_MIN SCM_I_TYPE_MIN(scm_t_int32,SCM_T_UINT32_MAX)
370#define SCM_T_INT32_MAX SCM_I_TYPE_MAX(scm_t_int32,SCM_T_UINT32_MAX)
371
372#if SCM_HAVE_T_INT64
373#define SCM_T_UINT64_MAX SCM_I_UTYPE_MAX(scm_t_uint64)
374#define SCM_T_INT64_MIN SCM_I_TYPE_MIN(scm_t_int64,SCM_T_UINT64_MAX)
375#define SCM_T_INT64_MAX SCM_I_TYPE_MAX(scm_t_int64,SCM_T_UINT64_MAX)
376#endif
377
378#if SCM_SIZEOF_LONG_LONG
379#define SCM_I_ULLONG_MAX SCM_I_UTYPE_MAX(unsigned long long)
380#define SCM_I_LLONG_MIN SCM_I_TYPE_MIN(long long,SCM_I_ULLONG_MAX)
381#define SCM_I_LLONG_MAX SCM_I_TYPE_MAX(long long,SCM_I_ULLONG_MAX)
382#endif
383
384#define SCM_T_UINTMAX_MAX SCM_I_UTYPE_MAX(scm_t_uintmax)
385#define SCM_T_INTMAX_MIN SCM_I_TYPE_MIN(scm_t_intmax,SCM_T_UINTMAX_MAX)
386#define SCM_T_INTMAX_MAX SCM_I_TYPE_MAX(scm_t_intmax,SCM_T_UINTMAX_MAX)
387
388#define SCM_I_SIZE_MAX SCM_I_UTYPE_MAX(size_t)
389#define SCM_I_SSIZE_MIN SCM_I_TYPE_MIN(ssize_t,SCM_I_SIZE_MAX)
390#define SCM_I_SSIZE_MAX SCM_I_TYPE_MAX(ssize_t,SCM_I_SIZE_MAX)
391
0f2d19dd
JB
392\f
393
2a1d8241 394#include "libguile/tags.h"
0f2d19dd
JB
395
396\f
397#ifdef vms
398# ifndef CHEAP_CONTINUATIONS
399 typedef int jmp_buf[17];
400 extern int setjump(jmp_buf env);
401 extern int longjump(jmp_buf env, int ret);
402# define setjmp setjump
403# define longjmp longjump
404# else
405# include <setjmp.h>
406# endif
407#else /* ndef vms */
408# ifdef _CRAY1
409 typedef int jmp_buf[112];
410 extern int setjump(jmp_buf env);
411 extern int longjump(jmp_buf env, int ret);
412# define setjmp setjump
413# define longjmp longjump
414# else /* ndef _CRAY1 */
415# include <setjmp.h>
416# endif /* ndef _CRAY1 */
417#endif /* ndef vms */
418
0f2d19dd
JB
419/* James Clark came up with this neat one instruction fix for
420 * continuations on the SPARC. It flushes the register windows so
3dd84ef1 421 * that all the state of the process is contained in the stack.
0f2d19dd
JB
422 */
423
7c12f0ac 424#if defined (sparc) || defined (__sparc__) || defined (__sparc)
0f2d19dd
JB
425# define SCM_FLUSH_REGISTER_WINDOWS asm("ta 3")
426#else
427# define SCM_FLUSH_REGISTER_WINDOWS /* empty */
428#endif
429
3dd84ef1 430/* If stack is not longword aligned then
0f2d19dd
JB
431 */
432
433/* #define SHORT_ALIGN */
434#ifdef THINK_C
435# define SHORT_ALIGN
436#endif
437#ifdef MSDOS
438# define SHORT_ALIGN
439#endif
440#ifdef atarist
441# define SHORT_ALIGN
442#endif
443
444#ifdef SHORT_ALIGN
445typedef short SCM_STACKITEM;
446#else
447typedef long SCM_STACKITEM;
448#endif
79f55b7c
MD
449
450/* Cast pointer through (void *) in order to avoid compiler warnings
451 when strict aliasing is enabled */
452#define SCM_STACK_PTR(ptr) ((SCM_STACKITEM *) (void *) (ptr))
0f2d19dd
JB
453\f
454
9f0e55a6
MD
455#define SCM_ASYNC_TICK /*fixme* should change names */ \
456do { \
9de87eea 457 if (SCM_I_CURRENT_THREAD->pending_asyncs) \
9f0e55a6
MD
458 scm_async_click (); \
459} while (0)
25d3ee9d 460
0f2d19dd 461
8417b665
JB
462/* Anthony Green writes:
463 When the compiler sees...
464 DEFER_INTS;
465 [critical code here]
466 ALLOW_INTS;
467 ...it doesn't actually promise to keep the critical code within the
468 boundries of the DEFER/ALLOW_INTS instructions. It may very well
469 schedule it outside of the magic defined in those macros.
470
471 However, GCC's volatile asm feature forms a barrier over which code is
472 never moved. So if you add...
35eec738
JB
473 asm ("");
474 ...to each of the DEFER_INTS and ALLOW_INTS macros, the critical
475 code will always remain in place. asm's without inputs or outputs
476 are implicitly volatile. */
8417b665 477#ifdef __GNUC__
35eec738 478#define SCM_FENCE asm /* volatile */ ("")
189b66ba
MV
479#elif defined (__INTEL_COMPILER) && defined (__ia64)
480#define SCM_FENCE __memory_barrier()
8417b665
JB
481#else
482#define SCM_FENCE
483#endif
484
c72cc5fb 485#define SCM_TICK \
bfc69694 486do { \
cd911565 487 SCM_ASYNC_TICK; \
216eedfc 488 SCM_THREAD_SWITCHING_CODE; \
bfc69694 489} while (0)
0f2d19dd
JB
490
491\f
492
493/** SCM_ASSERT
3dd84ef1 494 **
0f2d19dd
JB
495 **/
496
497
498#ifdef SCM_RECKLESS
499#define SCM_ASSERT(_cond, _arg, _pos, _subr)
23deee81 500#define SCM_ASSERT_TYPE(_cond, _arg, _pos, _subr, _msg)
0f2d19dd
JB
501#define SCM_ASRTGO(_cond, _label)
502#else
503#define SCM_ASSERT(_cond, _arg, _pos, _subr) \
aeb4c2e1
HWN
504 do { if (!(_cond)) \
505 scm_wrong_type_arg (_subr, _pos, _arg); } while (0)
b6791b2e 506#define SCM_ASSERT_TYPE(_cond, _arg, _pos, _subr, _msg) \
aeb4c2e1
HWN
507 do { if (!(_cond)) \
508 scm_wrong_type_arg_msg(_subr, _pos, _arg, _msg); } while (0)
0f2d19dd 509#define SCM_ASRTGO(_cond, _label) \
aeb4c2e1
HWN
510 do { if (!(_cond)) \
511 goto _label; } while (0)
0f2d19dd 512#endif
95b88819 513
9de33deb
MD
514/*
515 * SCM_WTA_DISPATCH
516 */
517
451e591c
DH
518/* Dirk:FIXME:: In all of the SCM_WTA_DISPATCH_* macros it is assumed that
519 * 'gf' is zero if uninitialized. It would be cleaner if some valid SCM value
520 * like SCM_BOOL_F or SCM_UNDEFINED was chosen.
521 */
522
1174045c 523SCM_API SCM scm_call_generic_0 (SCM gf);
b3c8a0f5 524
e68fc829 525#define SCM_WTA_DISPATCH_0(gf, subr) \
c07b3fef
MD
526 return (SCM_UNPACK (gf) \
527 ? scm_call_generic_0 ((gf)) \
e68fc829
MV
528 : (scm_error_num_args_subr ((subr)), SCM_UNSPECIFIED))
529#define SCM_GASSERT0(cond, gf, subr) \
530 if (!(cond)) SCM_WTA_DISPATCH_0((gf), (subr))
b3c8a0f5 531
1174045c 532SCM_API SCM scm_call_generic_1 (SCM gf, SCM a1);
9de33deb 533
c07b3fef
MD
534#define SCM_WTA_DISPATCH_1(gf, a1, pos, subr) \
535 return (SCM_UNPACK (gf) \
536 ? scm_call_generic_1 ((gf), (a1)) \
537 : (scm_wrong_type_arg ((subr), (pos), (a1)), SCM_UNSPECIFIED))
9de33deb
MD
538#define SCM_GASSERT1(cond, gf, a1, pos, subr) \
539 if (!(cond)) SCM_WTA_DISPATCH_1((gf), (a1), (pos), (subr))
540
1174045c 541SCM_API SCM scm_call_generic_2 (SCM gf, SCM a1, SCM a2);
9de33deb 542
c07b3fef
MD
543#define SCM_WTA_DISPATCH_2(gf, a1, a2, pos, subr) \
544 return (SCM_UNPACK (gf) \
545 ? scm_call_generic_2 ((gf), (a1), (a2)) \
546 : (scm_wrong_type_arg ((subr), (pos), \
547 (pos) == SCM_ARG1 ? (a1) : (a2)), \
548 SCM_UNSPECIFIED))
9de33deb
MD
549#define SCM_GASSERT2(cond, gf, a1, a2, pos, subr) \
550 if (!(cond)) SCM_WTA_DISPATCH_2((gf), (a1), (a2), (pos), (subr))
551
1174045c 552SCM_API SCM scm_apply_generic (SCM gf, SCM args);
89c358b1 553
c07b3fef
MD
554#define SCM_WTA_DISPATCH_n(gf, args, pos, subr) \
555 return (SCM_UNPACK (gf) \
556 ? scm_apply_generic ((gf), (args)) \
557 : (scm_wrong_type_arg ((subr), (pos), \
558 scm_list_ref ((args), \
93ccaef0 559 scm_from_int ((pos) - 1))), \
c07b3fef 560 SCM_UNSPECIFIED))
89c358b1
MD
561#define SCM_GASSERTn(cond, gf, args, pos, subr) \
562 if (!(cond)) SCM_WTA_DISPATCH_n((gf), (args), (pos), (subr))
563
c751e5e3
GB
564#ifndef SCM_MAGIC_SNARFER
565/* Let these macros pass through if
566 we are snarfing; thus we can tell the
567 difference between the use of an actual
568 number vs. the use of one of these macros --
f5421cfc 569 actual numbers in SCM_VALIDATE_* and SCM_ASSERT
c751e5e3
GB
570 constructs must match the formal argument name,
571 but using SCM_ARG* avoids the test */
572
0f2d19dd
JB
573#define SCM_ARGn 0
574#define SCM_ARG1 1
575#define SCM_ARG2 2
576#define SCM_ARG3 3
577#define SCM_ARG4 4
578#define SCM_ARG5 5
1146b6cd 579#define SCM_ARG6 6
3dd84ef1 580#define SCM_ARG7 7
0f2d19dd 581
c751e5e3 582#endif /* SCM_MAGIC_SNARFER */
0f2d19dd 583
0f2d19dd
JB
584\f
585
586/* SCM_EXIT_SUCCESS is the default code to return from SCM if no errors
587 * were encountered. SCM_EXIT_FAILURE is the default code to return from
588 * SCM if errors were encountered. The return code can be explicitly
589 * specified in a SCM program with (scm_quit <n>).
590 */
591
592#ifndef SCM_EXIT_SUCCESS
593#ifdef vms
594#define SCM_EXIT_SUCCESS 1
595#else
596#define SCM_EXIT_SUCCESS 0
597#endif /* def vms */
598#endif /* ndef SCM_EXIT_SUCCESS */
599#ifndef SCM_EXIT_FAILURE
600#ifdef vms
601#define SCM_EXIT_FAILURE 2
602#else
603#define SCM_EXIT_FAILURE 1
604#endif /* def vms */
605#endif /* ndef SCM_EXIT_FAILURE */
606
570b6821
MV
607/* Define SCM_C_INLINE_KEYWORD so that it can be used as a replacement
608 for the "inline" keyword, expanding to nothing when "inline" is not
609 available.
610*/
611
612#ifdef SCM_C_INLINE
613#define SCM_C_INLINE_KEYWORD SCM_C_INLINE
614#else
615#define SCM_C_INLINE_KEYWORD
616#endif
617
729dbac3 618#endif /* SCM___SCM_H */
89e00824
ML
619
620/*
621 Local Variables:
622 c-file-style: "gnu"
623 End:
624*/