diff options
179 files changed, 23764 insertions, 29042 deletions
diff --git a/.gitignore b/.gitignore index df62247f6..aa3f94cac 100644 --- a/.gitignore +++ b/.gitignore @@ -66,8 +66,8 @@ guile-procedures.txt guile-config/guile-config *.go TAGS -/meta/guile-2.0.pc -/meta/guile-2.0-uninstalled.pc +/meta/guile-2.2.pc +/meta/guile-2.2-uninstalled.pc gdb-pre-inst-guile cscope.out cscope.files diff --git a/GUILE-VERSION b/GUILE-VERSION index 1aa9fd4b1..71237e421 100644 --- a/GUILE-VERSION +++ b/GUILE-VERSION @@ -2,10 +2,10 @@ # Note: `GUILE_VERSION' is defined in `configure.ac' using `git-version-gen'. GUILE_MAJOR_VERSION=2 -GUILE_MINOR_VERSION=0 -GUILE_MICRO_VERSION=3 +GUILE_MINOR_VERSION=1 +GUILE_MICRO_VERSION=0 -GUILE_EFFECTIVE_VERSION=2.0 +GUILE_EFFECTIVE_VERSION=2.2 # All of the shared lib versioning info. Right now, for this to work @@ -18,7 +18,7 @@ GUILE_EFFECTIVE_VERSION=2.0 # See libtool info pages for more information on how and when to # change these. -LIBGUILE_INTERFACE_CURRENT=25 +LIBGUILE_INTERFACE_CURRENT=24 LIBGUILE_INTERFACE_REVISION=0 -LIBGUILE_INTERFACE_AGE=3 +LIBGUILE_INTERFACE_AGE=2 LIBGUILE_INTERFACE="${LIBGUILE_INTERFACE_CURRENT}:${LIBGUILE_INTERFACE_REVISION}:${LIBGUILE_INTERFACE_AGE}" diff --git a/configure.ac b/configure.ac index d63dd6326..02ce7d05b 100644 --- a/configure.ac +++ b/configure.ac @@ -1259,7 +1259,7 @@ save_LIBS="$LIBS" LIBS="$BDW_GC_LIBS $LIBS" CFLAGS="$BDW_GC_CFLAGS $CFLAGS" -AC_CHECK_FUNCS([GC_do_blocking GC_call_with_gc_active GC_pthread_exit GC_pthread_cancel GC_allow_register_threads GC_pthread_sigmask GC_set_start_callback GC_get_heap_usage_safe GC_get_free_space_divisor]) +AC_CHECK_FUNCS([GC_do_blocking GC_call_with_gc_active GC_pthread_exit GC_pthread_cancel GC_allow_register_threads GC_pthread_sigmask GC_set_start_callback GC_get_suspend_signal GC_move_disappearing_link GC_get_heap_usage_safe GC_get_free_space_divisor]) # Though the `GC_do_blocking ()' symbol is present in GC 7.1, it is not # declared, and has a different type (returning void instead of @@ -1655,8 +1655,8 @@ AC_CONFIG_FILES([ module/Makefile ]) -AC_CONFIG_FILES([meta/guile-2.0.pc]) -AC_CONFIG_FILES([meta/guile-2.0-uninstalled.pc]) +AC_CONFIG_FILES([meta/guile-2.2.pc]) +AC_CONFIG_FILES([meta/guile-2.2-uninstalled.pc]) AC_CONFIG_FILES([doc/ref/effective-version.texi]) GUILE_CONFIG_SCRIPT([check-guile]) diff --git a/doc/example-smob/Makefile b/doc/example-smob/Makefile index 3736dc01f..d368d7b21 100644 --- a/doc/example-smob/Makefile +++ b/doc/example-smob/Makefile @@ -1,5 +1,5 @@ -CFLAGS = `pkg-config guile-2.0 --cflags` -LIBS = `pkg-config guile-2.0 --libs` +CFLAGS = `pkg-config guile-2.2 --cflags` +LIBS = `pkg-config guile-2.2 --libs` O_FILES = image-type.o myguile.o diff --git a/doc/guile.1 b/doc/guile.1 index e36c2aac7..5d8b4e158 100644 --- a/doc/guile.1 +++ b/doc/guile.1 @@ -4,7 +4,7 @@ .\" groff -man -Tascii foo.1 .\" .\" title section date source manual -.TH GUILE 1 "2011-03-04" GNU "GNU Guile 2.0" +.TH GUILE 1 "2011-03-04" GNU "GNU Guile 2.2" . .SH NAME guile \- The GNU Project Extension Language diff --git a/doc/ref/compiler.texi b/doc/ref/compiler.texi index 86379c71b..3d6dbf327 100644 --- a/doc/ref/compiler.texi +++ b/doc/ref/compiler.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the GNU Guile Reference Manual. -@c Copyright (C) 2008, 2009, 2010 +@c Copyright (C) 2008, 2009, 2010, 2011 @c Free Software Foundation, Inc. @c See the file guile.texi for copying conditions. @@ -158,12 +158,11 @@ different worlds indefinitely, as shown by the following quine: @node The Scheme Compiler @subsection The Scheme Compiler -The job of the Scheme compiler is to expand all macros and all of -Scheme to its most primitive expressions. The definition of -``primitive'' is given by the inventory of constructs provided by -Tree-IL, the target language of the Scheme compiler: procedure -applications, conditionals, lexical references, etc. This is described -more fully in the next section. +The job of the Scheme compiler is to expand all macros and all of Scheme +to its most primitive expressions. The definition of ``primitive'' is +given by the inventory of constructs provided by Tree-IL, the target +language of the Scheme compiler: procedure calls, conditionals, lexical +references, etc. This is described more fully in the next section. The tricky and amusing thing about the Scheme-to-Tree-IL compiler is that it is completely implemented by the macro expander. Since the @@ -181,10 +180,10 @@ The Scheme-to-Tree-IL expander may be invoked using the generic @lisp (compile '(+ 1 2) #:from 'scheme #:to 'tree-il) @result{} - #<<application> src: #f - proc: #<<toplevel-ref> src: #f name: +> - args: (#<<const> src: #f exp: 1> - #<<const> src: #f exp: 2>)> + #<<call> src: #f + proc: #<<toplevel-ref> src: #f name: +> + args: (#<<const> src: #f exp: 1> + #<<const> src: #f exp: 2>)> @end lisp Or, since Tree-IL is so close to Scheme, it is often useful to expand @@ -339,9 +338,9 @@ instruction. Compilation of Tree-IL usually begins with a pass that resolves some @code{<module-ref>} and @code{<toplevel-ref>} expressions to -@code{<primitive-ref>} expressions. The actual compilation pass -has special cases for applications of certain primitives, like -@code{apply} or @code{cons}. +@code{<primitive-ref>} expressions. The actual compilation pass has +special cases for calls to certain primitives, like @code{apply} or +@code{cons}. @end deftp @deftp {Scheme Variable} <lexical-ref> src name gensym @deftpx {External Representation} (lexical @var{name} @var{gensym}) @@ -385,10 +384,19 @@ Defines a new top-level variable in the current procedure's module. @deftpx {External Representation} (if @var{test} @var{then} @var{else}) A conditional. Note that @var{else} is not optional. @end deftp -@deftp {Scheme Variable} <application> src proc args -@deftpx {External Representation} (apply @var{proc} . @var{args}) +@deftp {Scheme Variable} <call> src proc args +@deftpx {External Representation} (call @var{proc} . @var{args}) A procedure call. @end deftp +@deftp {Scheme Variable} <primcall> src name args +@deftpx {External Representation} (primcall @var{name} . @var{args}) +A call to a primitive. Equivalent to @code{(call (primitive @var{name}) +. @var{args})}. This construct is often more convenient to generate and +analyze than @code{<call>}. + +As part of the compilation process, instances of @code{(call (primitive +@var{name}) . @var{args})} are transformed into primcalls. +@end deftp @deftp {Scheme Variable} <sequence> src exps @deftpx {External Representation} (begin . @var{exps}) Like Scheme's @code{begin}. @@ -465,12 +473,15 @@ expression evaluating to a fluid. A dynamic variable set. @var{fluid}, a Tree-IL expression evaluating to a fluid, will be set to the result of evaluating @var{exp}. @end deftp -@deftp {Scheme Variable} <dynwind> winder body unwinder -@deftpx {External Representation} (dynwind @var{winder} @var{body} @var{unwinder}) +@deftp {Scheme Variable} <dynwind> winder pre body post unwinder +@deftpx {External Representation} (dynwind @var{winder} @var{pre} @var{body} @var{post} @var{unwinder}) A @code{dynamic-wind}. @var{winder} and @var{unwinder} should both -evaluate to thunks. Ensure that the winder and the unwinder are called -before entering and after leaving @var{body}. Note that @var{body} is -an expression, without a thunk wrapper. +evaluate to thunks. Ensure that the winder and the unwinder are called +before entering and after leaving @var{body}. Note that @var{body} is +an expression, without a thunk wrapper. Guile actually inlines the +bodies of @var{winder} and @var{unwinder} for the case of normal control +flow, compiling the expressions in @var{pre} and @var{post}, +respectively. @end deftp @deftp {Scheme Variable} <prompt> tag body handler @deftpx {External Representation} (prompt @var{tag} @var{body} @var{handler}) @@ -506,7 +517,7 @@ Like Scheme's @code{receive} -- binds the values returned by evaluating @code{exp} to the @code{lambda}-like bindings described by @var{gensyms}. That is to say, @var{gensyms} may be an improper list. -@code{<let-values>} is an optimization of @code{<application>} of the +@code{<let-values>} is an optimization of a @code{<call>} to the primitive, @code{call-with-values}. @end deftp @deftp {Scheme Variable} <fix> src names gensyms vals body diff --git a/doc/ref/libguile-concepts.texi b/doc/ref/libguile-concepts.texi index 6ebeb6363..915054c53 100644 --- a/doc/ref/libguile-concepts.texi +++ b/doc/ref/libguile-concepts.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the GNU Guile Reference Manual. -@c Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004, 2005, 2010 +@c Copyright (C) 1996, 1997, 2000, 2001, 2002, 2003, 2004, 2005, 2010, 2011 @c Free Software Foundation, Inc. @c See the file guile.texi for copying conditions. @@ -449,16 +449,18 @@ that are stored in local variables. When a thread puts itself into guile mode for the first time, it gets a Scheme representation and is listed by @code{all-threads}, for example. -Threads in guile mode can block (e.g., do blocking I/O) without causing any -problems@footnote{In Guile 1.8, a thread blocking in guile mode would prevent -garbage collection to occur. Thus, threads had to leave guile mode whenever -they could block. This is no longer needed with Guile 2.0.}; temporarily -leaving guile mode with @code{scm_without_guile} before blocking slightly -improves GC performance, though. For some common blocking operations, Guile -provides convenience functions. For example, if you want to lock a pthread -mutex while in guile mode, you might want to use @code{scm_pthread_mutex_lock} -which is just like @code{pthread_mutex_lock} except that it leaves guile mode -while blocking. +Threads in guile mode can block (e.g., do blocking I/O) without causing +any problems@footnote{In Guile 1.8, a thread blocking in guile mode +would prevent garbage collection to occur. Thus, threads had to leave +guile mode whenever they could block. This is no longer needed with +Guile 2.@var{x}.}; temporarily leaving guile mode with +@code{scm_without_guile} before blocking slightly improves GC +performance, though. For some common blocking operations, Guile +provides convenience functions. For example, if you want to lock a +pthread mutex while in guile mode, you might want to use +@code{scm_pthread_mutex_lock} which is just like +@code{pthread_mutex_lock} except that it leaves guile mode while +blocking. All libguile functions are (intended to be) robust in the face of diff --git a/doc/ref/srfi-modules.texi b/doc/ref/srfi-modules.texi index f7521b456..1e0ba2be3 100644 --- a/doc/ref/srfi-modules.texi +++ b/doc/ref/srfi-modules.texi @@ -171,8 +171,8 @@ how to load it with the Guile mechanism. @cindex @code{guile-2} SRFI-0 feature @cindex portability between 2.0 and older versions Likewise, testing the @code{guile-2} feature allows code to be portable -between Guile 2.0 and previous versions of Guile. For instance, it -makes it possible to write code that accounts for Guile 2.0's compiler, +between Guile 2.@var{x} and previous versions of Guile. For instance, it +makes it possible to write code that accounts for Guile 2.@var{x}'s compiler, yet be correctly interpreted on 1.8 and earlier versions: @example diff --git a/doc/ref/vm.texi b/doc/ref/vm.texi index 0a1425026..cf4e135ec 100644 --- a/doc/ref/vm.texi +++ b/doc/ref/vm.texi @@ -1,6 +1,6 @@ @c -*-texinfo-*- @c This is part of the GNU Guile Reference Manual. -@c Copyright (C) 2008,2009,2010 +@c Copyright (C) 2008,2009,2010,2011 @c Free Software Foundation, Inc. @c See the file guile.texi for copying conditions. @@ -79,9 +79,9 @@ but it is not normally used at runtime.) The upside of implementing the interpreter in Scheme is that we preserve tail calls and multiple-value handling between interpreted and compiled -code. The downside is that the interpreter in Guile 2.0 is slower than -the interpreter in 1.8. We hope the that the compiler's speed makes up -for the loss! +code. The downside is that the interpreter in Guile 2.@var{x} is slower +than the interpreter in 1.8. We hope the that the compiler's speed makes +up for the loss! Also note that this decision to implement a bytecode compiler does not preclude native compilation. We can compile from bytecode to native diff --git a/libguile.h b/libguile.h index 2c10d05e9..7ac98a507 100644 --- a/libguile.h +++ b/libguile.h @@ -115,7 +115,9 @@ extern "C" { #include "libguile/srfi-4.h" #include "libguile/version.h" #include "libguile/vports.h" -#include "libguile/weaks.h" +#include "libguile/weak-set.h" +#include "libguile/weak-table.h" +#include "libguile/weak-vector.h" #include "libguile/backtrace.h" #include "libguile/debug.h" #include "libguile/stacks.h" diff --git a/libguile/Makefile.am b/libguile/Makefile.am index 1817100fd..502ae56fa 100644 --- a/libguile/Makefile.am +++ b/libguile/Makefile.am @@ -218,7 +218,9 @@ libguile_@GUILE_EFFECTIVE_VERSION@_la_SOURCES = \ version.c \ vm.c \ vports.c \ - weaks.c + weak-set.c \ + weak-table.c \ + weak-vector.c DOT_X_FILES = \ alist.x \ @@ -314,7 +316,9 @@ DOT_X_FILES = \ vectors.x \ version.x \ vports.x \ - weaks.x + weak-set.x \ + weak-table.x \ + weak-vector.x # vm-related snarfs DOT_X_FILES += frames.x instructions.x objcodes.x programs.x vm.x @@ -415,7 +419,9 @@ DOT_DOC_FILES = \ vectors.doc \ version.doc \ vports.doc \ - weaks.doc + weak-set.doc \ + weak-table.doc \ + weak-vector.doc EXTRA_DOT_DOC_FILES = @EXTRA_DOT_DOC_FILES@ @@ -617,7 +623,9 @@ modinclude_HEADERS = \ vm-expand.h \ vm.h \ vports.h \ - weaks.h + weak-set.h \ + weak-table.h \ + weak-vector.h nodist_modinclude_HEADERS = version.h scmconfig.h diff --git a/libguile/__scm.h b/libguile/__scm.h index f5551ad7a..ee73855c6 100644 --- a/libguile/__scm.h +++ b/libguile/__scm.h @@ -145,37 +145,6 @@ #endif -/* {Supported Options} - * - * These may be defined or undefined. - */ - -/* #define GUILE_DEBUG_FREELIST */ - - -/* Use engineering notation when converting numbers strings? - */ -#undef ENGNOT - - -/* {Unsupported Options} - * - * These must be defined as given here. - */ - - -/* Guile Scheme supports the #f/() distinction; Guile Lisp won't. We - have horrible plans for their unification. */ -#undef SICP - - - -/* Random options (not yet supported or in final form). */ - -#define STACK_CHECKING -#undef NO_CEVAL_STACK_CHECKING - - /* SCM_API is a macro prepended to all function and data definitions which should be exported from libguile. */ @@ -192,6 +161,64 @@ +/* We would like gnu89 extern inline semantics, not C99 extern inline + semantics, so that we can be sure to avoid reifying definitions of + inline functions in all compilation units, which is a possibility at + low optimization levels, or if a user takes the address of an inline + function. + + Hence the `__gnu_inline__' attribute, in accordance with: + http://gcc.gnu.org/gcc-4.3/porting_to.html . + + With GCC 4.2, `__GNUC_STDC_INLINE__' is never defined (because C99 inline + semantics are not supported), but a warning is issued in C99 mode if + `__gnu_inline__' is not used. + + Apple's GCC build >5400 (since Xcode 3.0) doesn't support GNU inline in + C99 mode and doesn't define `__GNUC_STDC_INLINE__'. Fall back to "static + inline" in that case. */ + +# if (defined __GNUC__) && (!(((defined __APPLE_CC__) && (__APPLE_CC__ > 5400)) && __STDC_VERSION__ >= 199901L)) +# if (defined __GNUC_STDC_INLINE__) || (__GNUC__ == 4 && __GNUC_MINOR__ == 2) +# define SCM_C_EXTERN_INLINE \ + extern __inline__ __attribute__ ((__gnu_inline__)) +# else +# define SCM_C_EXTERN_INLINE extern __inline__ +# endif +# endif + +/* SCM_INLINE is a macro prepended to all public inline function + declarations. Implementations of those functions should also be in + the header file, prefixed by SCM_INLINE_IMPLEMENTATION, and protected + by SCM_CAN_INLINE and a CPP define for the C file in question, like + SCM_INLINE_C_INCLUDING_INLINE_H. See inline.h for an example + usage. */ + +#if defined SCM_IMPLEMENT_INLINES +/* Reifying functions to a file, whether or not inlining is available. */ +# define SCM_CAN_INLINE 0 +# define SCM_INLINE SCM_API +# define SCM_INLINE_IMPLEMENTATION +#elif defined SCM_C_INLINE +/* Declarations when inlining is available. */ +# define SCM_CAN_INLINE 1 +# ifdef SCM_C_EXTERN_INLINE +# define SCM_INLINE SCM_C_EXTERN_INLINE +# else +/* Fall back to static inline if GNU "extern inline" is unavailable. */ +# define SCM_INLINE static SCM_C_INLINE +# endif +# define SCM_INLINE_IMPLEMENTATION SCM_INLINE +#else +/* Declarations when inlining is not available. */ +# define SCM_CAN_INLINE 0 +# define SCM_INLINE SCM_API +/* Don't define SCM_INLINE_IMPLEMENTATION; it should never be seen in + this case. */ +#endif + + + /* {Debugging Options} * * These compile time options determine whether to include code that is only @@ -220,14 +247,6 @@ #define SCM_DEBUG 0 #endif -/* For debugging purposes: define this is to ensure nobody is using - * the mark bits outside of the marking phase. This is meant for - * debugging purposes only. - */ -#ifndef SCM_DEBUG_MARKING_API -#define SCM_DEBUG_MARKING_API 0 -#endif - /* If SCM_DEBUG_CELL_ACCESSES is set to 1, cell accesses will perform * exhaustive parameter checking: It will be verified that cell parameters * actually point to a valid heap cell. Note: If this option is enabled, @@ -237,13 +256,6 @@ #define SCM_DEBUG_CELL_ACCESSES SCM_DEBUG #endif -/* If SCM_DEBUG_INTERRUPTS is set to 1, with every deferring and allowing of - * interrupts a consistency check will be performed. - */ -#ifndef SCM_DEBUG_INTERRUPTS -#define SCM_DEBUG_INTERRUPTS SCM_DEBUG -#endif - /* If SCM_DEBUG_PAIR_ACCESSES is set to 1, accesses to cons cells will be * exhaustively checked. Note: If this option is enabled, guile will run * slower than normally. @@ -286,22 +298,6 @@ #define SCM_DEBUG_TYPING_STRICTNESS 1 #endif -/* If SCM_DEBUG_DEBUGGING_SUPPORT is set to 1, guile will provide a set of - * special functions that support debugging with a debugger like gdb or - * debugging of guile internals on the scheme level. The behaviour of guile - * is not changed by this macro, only the set of functions that are available - * will differ. All functions that are introduced this way have the prefix - * 'scm_dbg_' on the C level and the prefix 'dbg-' on the scheme level. This - * allows to easily determine the set of support functions, given that your - * debugger or repl provide automatic name completion. Note that these - * functions are intended to be used during interactive debugging sessions - * only. They are not considered part of guile's official API. They may - * change or disappear without notice or deprecation phase. - */ -#ifndef SCM_DEBUG_DEBUGGING_SUPPORT -#define SCM_DEBUG_DEBUGGING_SUPPORT SCM_DEBUG -#endif - /* {Feature Options} @@ -377,12 +373,6 @@ # define SCM_LONG_BIT (SCM_CHAR_BIT * sizeof (long) / sizeof (char)) #endif -#ifdef UCHAR_MAX -# define SCM_CHAR_CODE_LIMIT (UCHAR_MAX + 1L) -#else -# define SCM_CHAR_CODE_LIMIT 256L -#endif - #define SCM_I_UTYPE_MAX(type) ((type)-1) #define SCM_I_TYPE_MAX(type,umax) ((type)((umax)/2)) #define SCM_I_TYPE_MIN(type,umax) (-((type)((umax)/2))-1) @@ -403,12 +393,6 @@ #define SCM_T_INT64_MIN SCM_I_TYPE_MIN(scm_t_int64,SCM_T_UINT64_MAX) #define SCM_T_INT64_MAX SCM_I_TYPE_MAX(scm_t_int64,SCM_T_UINT64_MAX) -#if SCM_SIZEOF_LONG_LONG -#define SCM_I_ULLONG_MAX SCM_I_UTYPE_MAX(unsigned long long) -#define SCM_I_LLONG_MIN SCM_I_TYPE_MIN(long long,SCM_I_ULLONG_MAX) -#define SCM_I_LLONG_MAX SCM_I_TYPE_MAX(long long,SCM_I_ULLONG_MAX) -#endif - #define SCM_T_UINTMAX_MAX SCM_I_UTYPE_MAX(scm_t_uintmax) #define SCM_T_INTMAX_MIN SCM_I_TYPE_MIN(scm_t_intmax,SCM_T_UINTMAX_MAX) #define SCM_T_INTMAX_MAX SCM_I_TYPE_MAX(scm_t_intmax,SCM_T_UINTMAX_MAX) @@ -417,10 +401,6 @@ #define SCM_T_INTPTR_MIN SCM_I_TYPE_MIN(scm_t_intptr,SCM_T_UINTPTR_MAX) #define SCM_T_INTPTR_MAX SCM_I_TYPE_MAX(scm_t_intptr,SCM_T_UINTPTR_MAX) -#define SCM_I_SIZE_MAX SCM_I_UTYPE_MAX(size_t) -#define SCM_I_SSIZE_MIN SCM_I_TYPE_MIN(ssize_t,SCM_I_SIZE_MAX) -#define SCM_I_SSIZE_MAX SCM_I_TYPE_MAX(ssize_t,SCM_I_SIZE_MAX) - #include "libguile/tags.h" @@ -439,64 +419,35 @@ typedef void *scm_t_subr; #endif -#ifdef vms -# ifndef CHEAP_CONTINUATIONS - typedef int jmp_buf[17]; - extern int setjump(jmp_buf env); - extern int longjump(jmp_buf env, int ret); -# define setjmp setjump -# define longjmp longjump -# else -# include <setjmp.h> -# endif -#else /* ndef vms */ -# ifdef _CRAY1 - typedef int jmp_buf[112]; - extern int setjump(jmp_buf env); - extern int longjump(jmp_buf env, int ret); -# define setjmp setjump -# define longjmp longjump -# else /* ndef _CRAY1 */ -# if defined (__ia64__) -/* For IA64, emulate the setjmp API using getcontext. */ -# include <signal.h> -# include <ucontext.h> - typedef struct { - ucontext_t ctx; - int fresh; - } scm_i_jmp_buf; -# define SCM_I_SETJMP(JB) \ - ( (JB).fresh = 1, \ - getcontext (&((JB).ctx)), \ - ((JB).fresh ? ((JB).fresh = 0, 0) : 1) ) -# define SCM_I_LONGJMP(JB,VAL) scm_ia64_longjmp (&(JB), VAL) - void scm_ia64_longjmp (scm_i_jmp_buf *, int); -# else /* ndef __ia64__ */ -# include <setjmp.h> -# endif /* ndef __ia64__ */ -# endif /* ndef _CRAY1 */ -#endif /* ndef vms */ - -/* For any platform where SCM_I_SETJMP hasn't been defined in some - special way above, map SCM_I_SETJMP, SCM_I_LONGJMP and - scm_i_jmp_buf to setjmp, longjmp and jmp_buf. */ -#ifndef SCM_I_SETJMP -#define scm_i_jmp_buf jmp_buf -#define SCM_I_SETJMP setjmp -#define SCM_I_LONGJMP longjmp -#endif -/* James Clark came up with this neat one instruction fix for - * continuations on the SPARC. It flushes the register windows so - * that all the state of the process is contained in the stack. +/* scm_i_jmp_buf + * + * The corresponding SCM_I_SETJMP and SCM_I_LONGJMP are defined in the + * _scm.h private header. */ -#if defined (sparc) || defined (__sparc__) || defined (__sparc) -# define SCM_FLUSH_REGISTER_WINDOWS asm("ta 3") +#if defined (vms) +typedef int scm_i_jmp_buf[17]; + +#elif defined (_CRAY1) +typedef int scm_i_jmp_buf[112]; + +#elif defined (__ia64__) +# include <signal.h> +# include <ucontext.h> +typedef struct { + ucontext_t ctx; + int fresh; +} scm_i_jmp_buf; + #else -# define SCM_FLUSH_REGISTER_WINDOWS /* empty */ +# include <setjmp.h> +typedef jmp_buf scm_i_jmp_buf; #endif + + + /* If stack is not longword aligned then */ @@ -522,151 +473,14 @@ typedef long SCM_STACKITEM; #define SCM_STACK_PTR(ptr) ((SCM_STACKITEM *) (void *) (ptr)) -SCM_API void scm_async_tick (void); - #ifdef BUILDING_LIBGUILE - -/* FIXME: should change names */ -# define SCM_ASYNC_TICK \ - do \ - { \ - if (SCM_UNLIKELY (SCM_I_CURRENT_THREAD->pending_asyncs)) \ - scm_async_click (); \ - } \ - while (0) - -/* SCM_ASYNC_TICK_WITH_CODE is only available to Guile itself */ -# define SCM_ASYNC_TICK_WITH_CODE(thr, stmt) \ - do \ - { \ - if (SCM_UNLIKELY (thr->pending_asyncs)) \ - { \ - stmt; \ - scm_async_click (); \ - } \ - } \ - while (0) - -#else /* !BUILDING_LIBGUILE */ - -# define SCM_ASYNC_TICK (scm_async_tick ()) - -#endif /* !BUILDING_LIBGUILE */ - - -/* Anthony Green writes: - When the compiler sees... - DEFER_INTS; - [critical code here] - ALLOW_INTS; - ...it doesn't actually promise to keep the critical code within the - boundries of the DEFER/ALLOW_INTS instructions. It may very well - schedule it outside of the magic defined in those macros. - - However, GCC's volatile asm feature forms a barrier over which code is - never moved. So if you add... - asm (""); - ...to each of the DEFER_INTS and ALLOW_INTS macros, the critical - code will always remain in place. asm's without inputs or outputs - are implicitly volatile. */ -#ifdef __GNUC__ -#define SCM_FENCE asm /* volatile */ ("") -#elif defined (__INTEL_COMPILER) && defined (__ia64) -#define SCM_FENCE __memory_barrier() +#define SCM_TICK SCM_ASYNC_TICK #else -#define SCM_FENCE +#define SCM_TICK scm_async_tick () #endif -#define SCM_TICK \ -do { \ - SCM_ASYNC_TICK; \ - SCM_THREAD_SWITCHING_CODE; \ -} while (0) - -/** SCM_ASSERT - ** - **/ - - -#ifdef SCM_RECKLESS -#define SCM_ASSERT(_cond, _arg, _pos, _subr) -#define SCM_ASSERT_TYPE(_cond, _arg, _pos, _subr, _msg) -#define SCM_ASRTGO(_cond, _label) -#else -#define SCM_ASSERT(_cond, _arg, _pos, _subr) \ - do { if (SCM_UNLIKELY (!(_cond))) \ - scm_wrong_type_arg (_subr, _pos, _arg); } while (0) -#define SCM_ASSERT_TYPE(_cond, _arg, _pos, _subr, _msg) \ - do { if (SCM_UNLIKELY (!(_cond))) \ - scm_wrong_type_arg_msg(_subr, _pos, _arg, _msg); } while (0) -#define SCM_ASRTGO(_cond, _label) \ - do { if (SCM_UNLIKELY (!(_cond))) \ - goto _label; } while (0) -#endif - -/* - * SCM_WTA_DISPATCH - */ - -/* Dirk:FIXME:: In all of the SCM_WTA_DISPATCH_* macros it is assumed that - * 'gf' is zero if uninitialized. It would be cleaner if some valid SCM value - * like SCM_BOOL_F or SCM_UNDEFINED was chosen. - */ - -SCM_API SCM scm_call_generic_0 (SCM gf); - -#define SCM_WTA_DISPATCH_0(gf, subr) \ - return (SCM_UNPACK (gf) \ - ? scm_call_generic_0 ((gf)) \ - : (scm_error_num_args_subr ((subr)), SCM_UNSPECIFIED)) -#define SCM_GASSERT0(cond, gf, subr) \ - if (SCM_UNLIKELY(!(cond))) \ - SCM_WTA_DISPATCH_0((gf), (subr)) - -SCM_API SCM scm_call_generic_1 (SCM gf, SCM a1); - -#define SCM_WTA_DISPATCH_1(gf, a1, pos, subr) \ - return (SCM_UNPACK (gf) \ - ? scm_call_generic_1 ((gf), (a1)) \ - : (scm_wrong_type_arg ((subr), (pos), (a1)), SCM_UNSPECIFIED)) - -/* This form is for dispatching a subroutine. */ -#define SCM_WTA_DISPATCH_1_SUBR(subr, a1, pos) \ - return (SCM_UNPACK ((*SCM_SUBR_GENERIC (subr))) \ - ? scm_call_generic_1 ((*SCM_SUBR_GENERIC (subr)), (a1)) \ - : (scm_i_wrong_type_arg_symbol (SCM_SUBR_NAME (subr), (pos), (a1)), SCM_UNSPECIFIED)) - -#define SCM_GASSERT1(cond, gf, a1, pos, subr) \ - if (SCM_UNLIKELY (!(cond))) \ - SCM_WTA_DISPATCH_1((gf), (a1), (pos), (subr)) - -SCM_API SCM scm_call_generic_2 (SCM gf, SCM a1, SCM a2); - -#define SCM_WTA_DISPATCH_2(gf, a1, a2, pos, subr) \ - return (SCM_UNPACK (gf) \ - ? scm_call_generic_2 ((gf), (a1), (a2)) \ - : (scm_wrong_type_arg ((subr), (pos), \ - (pos) == SCM_ARG1 ? (a1) : (a2)), \ - SCM_UNSPECIFIED)) -#define SCM_GASSERT2(cond, gf, a1, a2, pos, subr) \ - if (SCM_UNLIKELY (!(cond))) \ - SCM_WTA_DISPATCH_2((gf), (a1), (a2), (pos), (subr)) - -SCM_API SCM scm_apply_generic (SCM gf, SCM args); - -#define SCM_WTA_DISPATCH_n(gf, args, pos, subr) \ - return (SCM_UNPACK (gf) \ - ? scm_apply_generic ((gf), (args)) \ - : (scm_wrong_type_arg ((subr), (pos), \ - scm_list_ref ((args), \ - scm_from_int ((pos) - 1))), \ - SCM_UNSPECIFIED)) -#define SCM_GASSERTn(cond, gf, args, pos, subr) \ - if (SCM_UNLIKELY (!(cond))) \ - SCM_WTA_DISPATCH_n((gf), (args), (pos), (subr)) - #ifndef SCM_MAGIC_SNARFER /* Let these macros pass through if we are snarfing; thus we can tell the @@ -689,27 +503,6 @@ SCM_API SCM scm_apply_generic (SCM gf, SCM args); -/* SCM_EXIT_SUCCESS is the default code to return from SCM if no errors - * were encountered. SCM_EXIT_FAILURE is the default code to return from - * SCM if errors were encountered. The return code can be explicitly - * specified in a SCM program with (scm_quit <n>). - */ - -#ifndef SCM_EXIT_SUCCESS -#ifdef vms -#define SCM_EXIT_SUCCESS 1 -#else -#define SCM_EXIT_SUCCESS 0 -#endif /* def vms */ -#endif /* ndef SCM_EXIT_SUCCESS */ -#ifndef SCM_EXIT_FAILURE -#ifdef vms -#define SCM_EXIT_FAILURE 2 -#else -#define SCM_EXIT_FAILURE 1 -#endif /* def vms */ -#endif /* ndef SCM_EXIT_FAILURE */ - /* Define SCM_C_INLINE_KEYWORD so that it can be used as a replacement for the "inline" keyword, expanding to nothing when "inline" is not available. diff --git a/libguile/_scm.h b/libguile/_scm.h index 48fb2ccb6..a7a3ad254 100644 --- a/libguile/_scm.h +++ b/libguile/_scm.h @@ -191,6 +191,62 @@ #define scm_from_off64_t scm_from_int64 + + +#if defined (vms) +/* VMS: Implement SCM_I_SETJMP in terms of setjump. */ +extern int setjump(scm_i_jmp_buf env); +extern int longjump(scm_i_jmp_buf env, int ret); +#define SCM_I_SETJMP setjump +#define SCM_I_LONGJMP longjump + +#elif defined (_CRAY1) +/* Cray: Implement SCM_I_SETJMP in terms of setjump. */ +extern int setjump(scm_i_jmp_buf env); +extern int longjump(scm_i_jmp_buf env, int ret); +#define SCM_I_SETJMP setjump +#define SCM_I_LONGJMP longjump + +#elif defined (__ia64__) +/* IA64: Implement SCM_I_SETJMP in terms of getcontext. */ +# define SCM_I_SETJMP(JB) \ + ( (JB).fresh = 1, \ + getcontext (&((JB).ctx)), \ + ((JB).fresh ? ((JB).fresh = 0, 0) : 1) ) +# define SCM_I_LONGJMP(JB,VAL) scm_ia64_longjmp (&(JB), VAL) +void scm_ia64_longjmp (scm_i_jmp_buf *, int); + +#else +/* All other systems just use setjmp and longjmp. */ + +#define SCM_I_SETJMP setjmp +#define SCM_I_LONGJMP longjmp +#endif + + + +#define SCM_ASYNC_TICK \ + do \ + { \ + if (SCM_UNLIKELY (SCM_I_CURRENT_THREAD->pending_asyncs)) \ + scm_async_tick (); \ + } \ + while (0) + +#define SCM_ASYNC_TICK_WITH_CODE(thr, stmt) \ + do \ + { \ + if (SCM_UNLIKELY (thr->pending_asyncs)) \ + { \ + stmt; \ + scm_async_tick (); \ + } \ + } \ + while (0) + + + + /* The endianness marker in objcode. */ #ifdef WORDS_BIGENDIAN # define SCM_OBJCODE_ENDIANNESS "BE" @@ -205,7 +261,7 @@ #define SCM_OBJCODE_WORD_SIZE SCM_CPP_STRINGIFY (SIZEOF_VOID_P) /* Major and minor versions must be single characters. */ -#define SCM_OBJCODE_MAJOR_VERSION 2 +#define SCM_OBJCODE_MAJOR_VERSION 3 #define SCM_OBJCODE_MINOR_VERSION 0 #define SCM_OBJCODE_MAJOR_VERSION_STRING \ SCM_CPP_STRINGIFY(SCM_OBJCODE_MAJOR_VERSION) diff --git a/libguile/alist.c b/libguile/alist.c index fd2ccde21..799e9f10e 100644 --- a/libguile/alist.c +++ b/libguile/alist.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995, 96, 97, 98, 99, 2000, 2001, 2004, 2006, 2008, 2010 Free Software Foundation, Inc. +/* Copyright (C) 1995, 96, 97, 98, 99, 2000, 2001, 2004, 2006, 2008, 2010, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -40,9 +40,7 @@ SCM_DEFINE (scm_acons, "acons", 3, 0, 0, "function is @emph{not} destructive; @var{alist} is not modified.") #define FUNC_NAME s_scm_acons { - return scm_cell (SCM_UNPACK (scm_cell (SCM_UNPACK (key), - SCM_UNPACK (value))), - SCM_UNPACK (alist)); + return scm_cons (scm_cons (key, value), alist); } #undef FUNC_NAME diff --git a/libguile/arbiters.c b/libguile/arbiters.c index 5923c718a..831e0a230 100644 --- a/libguile/arbiters.c +++ b/libguile/arbiters.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995,1996, 1997, 2000, 2001, 2004, 2005, 2006, 2008 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996, 1997, 2000, 2001, 2004, 2005, 2006, 2008, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -89,11 +89,11 @@ static scm_t_bits scm_tc16_arbiter; static int arbiter_print (SCM exp, SCM port, scm_print_state *pstate) { - scm_puts ("#<arbiter ", port); + scm_puts_unlocked ("#<arbiter ", port); if (SCM_ARB_LOCKED (exp)) - scm_puts ("locked ", port); + scm_puts_unlocked ("locked ", port); scm_iprin1 (SCM_PACK (SCM_SMOB_DATA (exp)), port, pstate); - scm_putc ('>', port); + scm_putc_unlocked ('>', port); return !0; } diff --git a/libguile/array-handle.c b/libguile/array-handle.c index ec3127a4a..7114f78e0 100644 --- a/libguile/array-handle.c +++ b/libguile/array-handle.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995,1996,1997,1998,2000,2001,2002,2003,2004, 2005, 2006, 2009 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996,1997,1998,2000,2001,2002,2003,2004, 2005, 2006, 2009, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -132,7 +132,7 @@ void scm_init_array_handle (void) { #define DEFINE_ARRAY_TYPE(tag, TAG) \ - scm_i_array_element_types[SCM_ARRAY_ELEMENT_TYPE_##TAG] = scm_from_locale_symbol (#tag) + scm_i_array_element_types[SCM_ARRAY_ELEMENT_TYPE_##TAG] = scm_from_utf8_symbol (#tag) scm_i_array_element_types[SCM_ARRAY_ELEMENT_TYPE_SCM] = SCM_BOOL_T; DEFINE_ARRAY_TYPE (a, CHAR); diff --git a/libguile/array-map.c b/libguile/array-map.c index d442bdf4e..395fa11a0 100644 --- a/libguile/array-map.c +++ b/libguile/array-map.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996,1998,2000,2001,2004,2005, 2006, 2008, 2009, 2010 Free Software Foundation, Inc. +/* Copyright (C) 1996,1998,2000,2001,2004,2005, 2006, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -99,7 +99,7 @@ scm_ra_matchp (SCM ra0, SCM ras) else return 0; - while (SCM_NIMP (ras)) + while (scm_is_pair (ras)) { ra1 = SCM_CAR (ras); @@ -204,7 +204,7 @@ scm_ramapc (void *cproc_ptr, SCM data, SCM ra0, SCM lra, const char *what) } lvra = SCM_EOL; plvra = &lvra; - for (z = lra; SCM_NIMP (z); z = SCM_CDR (z)) + for (z = lra; scm_is_pair (z); z = SCM_CDR (z)) { ra1 = SCM_CAR (z); vra1 = scm_i_make_array (1); @@ -262,7 +262,7 @@ scm_ramapc (void *cproc_ptr, SCM data, SCM ra0, SCM lra, const char *what) } lvra = SCM_EOL; plvra = &lvra; - for (z = lra; SCM_NIMP (z); z = SCM_CDR (z)) + for (z = lra; scm_is_pair (z); z = SCM_CDR (z)) { ra1 = SCM_CAR (z); vra1 = scm_i_make_array (1); @@ -295,7 +295,7 @@ scm_ramapc (void *cproc_ptr, SCM data, SCM ra0, SCM lra, const char *what) { SCM y = lra; SCM_I_ARRAY_BASE (vra0) = cind (ra0, vinds); - for (z = lvra; SCM_NIMP (z); z = SCM_CDR (z), y = SCM_CDR (y)) + for (z = lvra; scm_is_pair (z); z = SCM_CDR (z), y = SCM_CDR (y)) SCM_I_ARRAY_BASE (SCM_CAR (z)) = cind (SCM_CAR (y), vinds); if (0 == (SCM_UNBNDP (data) ? cproc(vra0, lvra) : cproc(vra0, data, lvra))) return 0; diff --git a/libguile/arrays.c b/libguile/arrays.c index d99081caf..bcc351cb1 100644 --- a/libguile/arrays.c +++ b/libguile/arrays.c @@ -472,7 +472,7 @@ SCM_DEFINE (scm_transpose_array, "transpose-array", 1, 0, 1, int ndim, i, k; SCM_VALIDATE_REST_ARGUMENT (args); - SCM_ASSERT (SCM_NIMP (ra), ra, SCM_ARG1, FUNC_NAME); + SCM_ASSERT (SCM_HEAP_OBJECT_P (ra), ra, SCM_ARG1, FUNC_NAME); if (scm_is_generalized_vector (ra)) { @@ -727,15 +727,15 @@ scm_i_print_array_dimension (scm_t_array_handle *h, int dim, int pos, else { ssize_t i; - scm_putc ('(', port); + scm_putc_unlocked ('(', port); for (i = h->dims[dim].lbnd; i <= h->dims[dim].ubnd; i++, pos += h->dims[dim].inc) { scm_i_print_array_dimension (h, dim+1, pos, port, pstate); if (i < h->dims[dim].ubnd) - scm_putc (' ', port); + scm_putc_unlocked (' ', port); } - scm_putc (')', port); + scm_putc_unlocked (')', port); } return 1; } @@ -752,7 +752,7 @@ scm_i_print_array (SCM array, SCM port, scm_print_state *pstate) scm_array_get_handle (array, &h); - scm_putc ('#', port); + scm_putc_unlocked ('#', port); if (h.ndims != 1 || h.dims[0].lbnd != 0) scm_intprint (h.ndims, 10, port); if (h.element_type != SCM_ARRAY_ELEMENT_TYPE_SCM) @@ -773,12 +773,12 @@ scm_i_print_array (SCM array, SCM port, scm_print_state *pstate) { if (print_lbnds) { - scm_putc ('@', port); + scm_putc_unlocked ('@', port); scm_intprint (h.dims[i].lbnd, 10, port); } if (print_lens) { - scm_putc (':', port); + scm_putc_unlocked (':', port); scm_intprint (h.dims[i].ubnd - h.dims[i].lbnd + 1, 10, port); } @@ -806,9 +806,9 @@ scm_i_print_array (SCM array, SCM port, scm_print_state *pstate) not really the same as Scheme values since they are boxed and can be modified with array-set!, say. */ - scm_putc ('(', port); + scm_putc_unlocked ('(', port); scm_i_print_array_dimension (&h, 0, 0, port, pstate); - scm_putc (')', port); + scm_putc_unlocked (')', port); return 1; } else @@ -832,14 +832,14 @@ read_decimal_integer (SCM port, int c, ssize_t *resp) if (c == '-') { sign = -1; - c = scm_getc (port); + c = scm_getc_unlocked (port); } while ('0' <= c && c <= '9') { res = 10*res + c-'0'; got_it = 1; - c = scm_getc (port); + c = scm_getc_unlocked (port); } if (got_it) @@ -862,7 +862,7 @@ scm_i_read_array (SCM port, int c) */ if (c == '(') { - scm_ungetc (c, port); + scm_ungetc_unlocked (c, port); return scm_vector (scm_read (port)); } @@ -870,11 +870,11 @@ scm_i_read_array (SCM port, int c) */ if (c == 'f') { - c = scm_getc (port); + c = scm_getc_unlocked (port); if (c != '3' && c != '6') { if (c != EOF) - scm_ungetc (c, port); + scm_ungetc_unlocked (c, port); return SCM_BOOL_F; } rank = 1; @@ -899,7 +899,7 @@ scm_i_read_array (SCM port, int c) && tag_len < sizeof tag_buf / sizeof tag_buf[0]) { tag_buf[tag_len++] = c; - c = scm_getc (port); + c = scm_getc_unlocked (port); } if (tag_len == 0) tag = SCM_BOOL_T; @@ -924,7 +924,7 @@ scm_i_read_array (SCM port, int c) if (c == '@') { - c = scm_getc (port); + c = scm_getc_unlocked (port); c = read_decimal_integer (port, c, &lbnd); } @@ -932,7 +932,7 @@ scm_i_read_array (SCM port, int c) if (c == ':') { - c = scm_getc (port); + c = scm_getc_unlocked (port); c = read_decimal_integer (port, c, &len); if (len < 0) scm_i_input_error (NULL, port, @@ -954,7 +954,7 @@ scm_i_read_array (SCM port, int c) scm_i_input_error (NULL, port, "missing '(' in vector or array literal", SCM_EOL); - scm_ungetc (c, port); + scm_ungetc_unlocked (c, port); elements = scm_read (port); if (scm_is_false (shape)) diff --git a/libguile/async.c b/libguile/async.c index 66f0b04cd..80f561d10 100644 --- a/libguile/async.c +++ b/libguile/async.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995,1996,1997,1998,2000,2001, 2002, 2004, 2006, 2008, 2009, 2010 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996,1997,1998,2000,2001, 2002, 2004, 2006, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -22,8 +22,6 @@ # include <config.h> #endif -#define SCM_BUILDING_DEPRECATED_CODE - #include "libguile/_scm.h" #include "libguile/eval.h" #include "libguile/throw.h" @@ -139,7 +137,7 @@ static scm_i_pthread_mutex_t async_mutex = SCM_I_PTHREAD_MUTEX_INITIALIZER; /* System asyncs. */ void -scm_async_click () +scm_async_tick (void) { scm_i_thread *t = SCM_I_CURRENT_THREAD; SCM asyncs; @@ -170,23 +168,6 @@ scm_async_click () } } -#if (SCM_ENABLE_DEPRECATED == 1) - -SCM_DEFINE (scm_system_async, "system-async", 1, 0, 0, - (SCM thunk), - "This function is deprecated. You can use @var{thunk} directly\n" - "instead of explicitly creating an async object.\n") -#define FUNC_NAME s_scm_system_async -{ - scm_c_issue_deprecation_warning - ("'system-async' is deprecated. " - "Use the procedure directly with 'system-async-mark'."); - return thunk; -} -#undef FUNC_NAME - -#endif /* SCM_ENABLE_DEPRECATED == 1 */ - void scm_i_queue_async_cell (SCM c, scm_i_thread *t) { @@ -341,47 +322,6 @@ SCM_DEFINE (scm_noop, "noop", 0, 0, 1, -#if (SCM_ENABLE_DEPRECATED == 1) - -SCM_DEFINE (scm_unmask_signals, "unmask-signals", 0, 0, 0, - (), - "Unmask signals. The returned value is not specified.") -#define FUNC_NAME s_scm_unmask_signals -{ - scm_i_thread *t = SCM_I_CURRENT_THREAD; - - scm_c_issue_deprecation_warning - ("'unmask-signals' is deprecated. " - "Use 'call-with-blocked-asyncs' instead."); - - if (t->block_asyncs == 0) - SCM_MISC_ERROR ("signals already unmasked", SCM_EOL); - t->block_asyncs = 0; - scm_async_click (); - return SCM_UNSPECIFIED; -} -#undef FUNC_NAME - - -SCM_DEFINE (scm_mask_signals, "mask-signals", 0, 0, 0, - (), - "Mask signals. The returned value is not specified.") -#define FUNC_NAME s_scm_mask_signals -{ - scm_i_thread *t = SCM_I_CURRENT_THREAD; - - scm_c_issue_deprecation_warning - ("'mask-signals' is deprecated. Use 'call-with-blocked-asyncs' instead."); - - if (t->block_asyncs > 0) - SCM_MISC_ERROR ("signals already masked", SCM_EOL); - t->block_asyncs = 1; - return SCM_UNSPECIFIED; -} -#undef FUNC_NAME - -#endif /* SCM_ENABLE_DEPRECATED == 1 */ - static void increase_block (void *data) { @@ -394,7 +334,7 @@ decrease_block (void *data) { scm_i_thread *t = data; if (--t->block_asyncs == 0) - scm_async_click (); + scm_async_tick (); } void @@ -504,12 +444,6 @@ scm_critical_section_end (void) SCM_CRITICAL_SECTION_END; } -void -scm_async_tick (void) -{ - SCM_ASYNC_TICK; -} - void diff --git a/libguile/async.h b/libguile/async.h index ceb2b960b..68952b055 100644 --- a/libguile/async.h +++ b/libguile/async.h @@ -3,7 +3,7 @@ #ifndef SCM_ASYNC_H #define SCM_ASYNC_H -/* Copyright (C) 1995,1996,1997,1998,2000,2001, 2002, 2004, 2005, 2006, 2008, 2009 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996,1997,1998,2000,2001, 2002, 2004, 2005, 2006, 2008, 2009, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -29,7 +29,7 @@ -SCM_API void scm_async_click (void); +SCM_API void scm_async_tick (void); SCM_API void scm_switch (void); SCM_API SCM scm_async (SCM thunk); SCM_API SCM scm_async_mark (SCM a); @@ -75,7 +75,7 @@ SCM_API void scm_critical_section_end (void); SCM_I_CURRENT_THREAD->critical_section_level--; \ SCM_I_CURRENT_THREAD->block_asyncs--; \ scm_i_pthread_mutex_unlock (&scm_i_critical_section_mutex); \ - scm_async_click (); \ + scm_async_tick (); \ } while (0) #else /* !BUILDING_LIBGUILE */ @@ -87,14 +87,6 @@ SCM_API void scm_critical_section_end (void); SCM_INTERNAL void scm_init_async (void); -#if (SCM_ENABLE_DEPRECATED == 1) - -SCM_DEPRECATED SCM scm_system_async (SCM thunk); -SCM_DEPRECATED SCM scm_unmask_signals (void); -SCM_DEPRECATED SCM scm_mask_signals (void); - -#endif - #endif /* SCM_ASYNC_H */ /* diff --git a/libguile/backtrace.c b/libguile/backtrace.c index db22c17e9..351e600a1 100644 --- a/libguile/backtrace.c +++ b/libguile/backtrace.c @@ -59,9 +59,9 @@ static SCM boot_print_exception (SCM port, SCM frame, SCM key, SCM args) #define FUNC_NAME "boot-print-exception" { - scm_puts ("Throw to key ", port); + scm_puts_unlocked ("Throw to key ", port); scm_write (key, port); - scm_puts (" with args ", port); + scm_puts_unlocked (" with args ", port); scm_write (args, port); return SCM_UNSPECIFIED; } @@ -207,14 +207,14 @@ indent (int n, SCM port) { int i; for (i = 0; i < n; ++i) - scm_putc (' ', port); + scm_putc_unlocked (' ', port); } static void display_frame_expr (char *hdr, SCM exp, char *tlr, int indentation, SCM sport, SCM port, scm_print_state *pstate) { int i = 0, n; - scm_t_ptob_descriptor *ptob = scm_ptobs + SCM_PTOBNUM (sport); + scm_t_ptob_descriptor *ptob = SCM_PORT_DESCRIPTOR (sport); do { pstate->length = print_params[i].length; @@ -223,7 +223,7 @@ display_frame_expr (char *hdr, SCM exp, char *tlr, int indentation, SCM sport, S { pstate->level = print_params[i].level - 1; scm_iprlist (hdr, exp, tlr[0], sport, pstate); - scm_puts (&tlr[1], sport); + scm_puts_unlocked (&tlr[1], sport); } else { @@ -328,19 +328,19 @@ display_backtrace_file (frame, last_file, port, pstate) *last_file = file; - scm_puts ("In ", port); + scm_puts_unlocked ("In ", port); if (scm_is_false (file)) if (scm_is_false (line)) - scm_puts ("unknown file", port); + scm_puts_unlocked ("unknown file", port); else - scm_puts ("current input", port); + scm_puts_unlocked ("current input", port); else { pstate->writingp = 0; scm_iprin1 (file, port, pstate); pstate->writingp = 1; } - scm_puts (":\n", port); + scm_puts_unlocked (":\n", port); } static void @@ -355,9 +355,9 @@ display_backtrace_file_and_line (SCM frame, SCM port, scm_print_state *pstate) if (scm_is_false (file)) { if (scm_is_false (line)) - scm_putc ('?', port); + scm_putc_unlocked ('?', port); else - scm_puts ("<stdin>", port); + scm_puts_unlocked ("<stdin>", port); } else { @@ -372,7 +372,7 @@ display_backtrace_file_and_line (SCM frame, SCM port, scm_print_state *pstate) pstate -> writingp = 1; } - scm_putc (':', port); + scm_putc_unlocked (':', port); } else if (scm_is_true (line)) { @@ -383,10 +383,10 @@ display_backtrace_file_and_line (SCM frame, SCM port, scm_print_state *pstate) } if (scm_is_false (line)) - scm_puts (" ?", port); + scm_puts_unlocked (" ?", port); else scm_intprint (scm_to_int (line) + 1, 10, port); - scm_puts (": ", port); + scm_puts_unlocked (": ", port); } static void @@ -413,7 +413,7 @@ display_frame (SCM frame, int n, int nfield, int indentation, /* Display an application. */ display_application (frame, nfield + 1 + indentation, sport, port, pstate); - scm_putc ('\n', port); + scm_putc_unlocked ('\n', port); } struct display_backtrace_args { @@ -511,9 +511,9 @@ display_backtrace_body (struct display_backtrace_args *a) static SCM error_during_backtrace (void *data, SCM tag, SCM throw_args) { - SCM port = PTR2SCM (data); + SCM port = SCM_PACK_POINTER (data); - scm_puts ("Exception thrown while printing backtrace:\n", port); + scm_puts_unlocked ("Exception thrown while printing backtrace:\n", port); scm_print_exception (port, SCM_BOOL_F, tag, throw_args); return SCM_UNSPECIFIED; @@ -544,7 +544,7 @@ SCM_DEFINE (scm_display_backtrace_with_highlights, "display-backtrace", 2, 3, 0, scm_internal_catch (SCM_BOOL_T, (scm_t_catch_body) display_backtrace_body, &a, - (scm_t_catch_handler) error_during_backtrace, SCM2PTR (port)); + (scm_t_catch_handler) error_during_backtrace, SCM_UNPACK_POINTER (port)); return SCM_UNSPECIFIED; } @@ -574,7 +574,7 @@ SCM_DEFINE (scm_backtrace_with_highlights, "backtrace", 0, 1, 0, highlights = SCM_EOL; scm_newline (port); - scm_puts ("Backtrace:\n", port); + scm_puts_unlocked ("Backtrace:\n", port); scm_display_backtrace_with_highlights (stack, port, SCM_BOOL_F, SCM_BOOL_F, highlights); scm_newline (port); diff --git a/libguile/bitvectors.c b/libguile/bitvectors.c index c569ebfe1..5b5a1b8e2 100644 --- a/libguile/bitvectors.c +++ b/libguile/bitvectors.c @@ -53,12 +53,12 @@ bitvector_print (SCM vec, SCM port, scm_print_state *pstate) scm_t_uint32 *bits = BITVECTOR_BITS (vec); size_t i, j; - scm_puts ("#*", port); + scm_puts_unlocked ("#*", port); for (i = 0; i < word_len; i++, bit_len -= 32) { scm_t_uint32 mask = 1; for (j = 0; j < 32 && j < bit_len; j++, mask <<= 1) - scm_putc ((bits[i] & mask)? '1' : '0', port); + scm_putc_unlocked ((bits[i] & mask)? '1' : '0', port); } return 1; diff --git a/libguile/bytevectors.c b/libguile/bytevectors.c index fff53550c..811e8d886 100644 --- a/libguile/bytevectors.c +++ b/libguile/bytevectors.c @@ -193,6 +193,9 @@ SCM_SET_BYTEVECTOR_FLAGS ((bv), \ (hint) \ | (SCM_BYTEVECTOR_CONTIGUOUS_P (bv) << 8UL)) +#define SCM_BYTEVECTOR_SET_PARENT(_bv, _parent) \ + SCM_SET_CELL_OBJECT_3 ((_bv), (_parent)) + #define SCM_BYTEVECTOR_TYPE_SIZE(var) \ (scm_i_array_element_type_sizes[SCM_BYTEVECTOR_ELEMENT_TYPE (var)]/8) #define SCM_BYTEVECTOR_TYPED_LENGTH(var) \ @@ -210,7 +213,7 @@ make_bytevector (size_t len, scm_t_array_element_type element_type) if (SCM_UNLIKELY (element_type > SCM_ARRAY_ELEMENT_TYPE_LAST || scm_i_array_element_type_sizes[element_type] < 8 - || len >= (SCM_I_SIZE_MAX + || len >= (((size_t) -1) / (scm_i_array_element_type_sizes[element_type]/8)))) /* This would be an internal Guile programming error */ abort (); @@ -226,13 +229,14 @@ make_bytevector (size_t len, scm_t_array_element_type element_type) contents = scm_gc_malloc_pointerless (SCM_BYTEVECTOR_HEADER_BYTES + c_len, SCM_GC_BYTEVECTOR); - ret = PTR2SCM (contents); + ret = SCM_PACK_POINTER (contents); contents += SCM_BYTEVECTOR_HEADER_BYTES; SCM_BYTEVECTOR_SET_LENGTH (ret, c_len); SCM_BYTEVECTOR_SET_CONTENTS (ret, contents); SCM_BYTEVECTOR_SET_CONTIGUOUS_P (ret, 1); SCM_BYTEVECTOR_SET_ELEMENT_TYPE (ret, element_type); + SCM_BYTEVECTOR_SET_PARENT (ret, SCM_BOOL_F); } return ret; @@ -253,7 +257,7 @@ make_bytevector_from_buffer (size_t len, void *contents, { size_t c_len; - ret = PTR2SCM (scm_gc_malloc (SCM_BYTEVECTOR_HEADER_BYTES, + ret = SCM_PACK_POINTER (scm_gc_malloc (SCM_BYTEVECTOR_HEADER_BYTES, SCM_GC_BYTEVECTOR)); c_len = len * (scm_i_array_element_type_sizes[element_type] / 8); @@ -262,6 +266,7 @@ make_bytevector_from_buffer (size_t len, void *contents, SCM_BYTEVECTOR_SET_CONTENTS (ret, contents); SCM_BYTEVECTOR_SET_CONTIGUOUS_P (ret, 0); SCM_BYTEVECTOR_SET_ELEMENT_TYPE (ret, element_type); + SCM_BYTEVECTOR_SET_PARENT (ret, SCM_BOOL_F); } return ret; @@ -282,19 +287,31 @@ scm_i_make_typed_bytevector (size_t len, scm_t_array_element_type element_type) return make_bytevector (len, element_type); } -/* Return a bytevector of size LEN made up of CONTENTS. The area pointed to - by CONTENTS must have been allocated using `scm_gc_malloc ()'. */ +/* Return a bytevector of size LEN made up of CONTENTS. The area + pointed to by CONTENTS must be protected from GC somehow: either + because it was allocated using `scm_gc_malloc ()', or because it is + part of PARENT. */ SCM -scm_c_take_gc_bytevector (signed char *contents, size_t len) +scm_c_take_gc_bytevector (signed char *contents, size_t len, SCM parent) { - return make_bytevector_from_buffer (len, contents, SCM_ARRAY_ELEMENT_TYPE_VU8); + SCM ret; + + ret = make_bytevector_from_buffer (len, contents, SCM_ARRAY_ELEMENT_TYPE_VU8); + SCM_BYTEVECTOR_SET_PARENT (ret, parent); + + return ret; } SCM scm_c_take_typed_bytevector (signed char *contents, size_t len, - scm_t_array_element_type element_type) + scm_t_array_element_type element_type, SCM parent) { - return make_bytevector_from_buffer (len, contents, element_type); + SCM ret; + + ret = make_bytevector_from_buffer (len, contents, element_type); + SCM_BYTEVECTOR_SET_PARENT (ret, parent); + + return ret; } /* Shrink BV to C_NEW_LEN (which is assumed to be smaller than its current @@ -316,7 +333,7 @@ scm_c_shrink_bytevector (SCM bv, size_t c_new_len) SCM_BYTEVECTOR_SET_LENGTH (bv, c_new_len); if (SCM_BYTEVECTOR_CONTIGUOUS_P (bv)) - new_bv = PTR2SCM (scm_gc_realloc (SCM2PTR (bv), + new_bv = SCM_PACK_POINTER (scm_gc_realloc (SCM_HEAP_OBJECT_BASE (bv), c_len + SCM_BYTEVECTOR_HEADER_BYTES, c_new_len + SCM_BYTEVECTOR_HEADER_BYTES, SCM_GC_BYTEVECTOR)); @@ -398,17 +415,17 @@ scm_i_print_bytevector (SCM bv, SCM port, scm_print_state *pstate SCM_UNUSED) scm_array_get_handle (bv, &h); - scm_putc ('#', port); + scm_putc_unlocked ('#', port); scm_write (scm_array_handle_element_type (&h), port); - scm_putc ('(', port); + scm_putc_unlocked ('(', port); for (i = h.dims[0].lbnd, ubnd = h.dims[0].ubnd, inc = h.dims[0].inc; i <= ubnd; i += inc) { if (i > 0) - scm_putc (' ', port); + scm_putc_unlocked (' ', port); scm_write (scm_array_handle_ref (&h, i), port); } - scm_putc (')', port); + scm_putc_unlocked (')', port); return 1; } diff --git a/libguile/bytevectors.h b/libguile/bytevectors.h index 8bafff3a3..a5eeaea0c 100644 --- a/libguile/bytevectors.h +++ b/libguile/bytevectors.h @@ -28,12 +28,14 @@ /* The size in words of the bytevector header (type tag and flags, length, and pointer to the underlying buffer). */ -#define SCM_BYTEVECTOR_HEADER_SIZE 3U +#define SCM_BYTEVECTOR_HEADER_SIZE 4U #define SCM_BYTEVECTOR_LENGTH(_bv) \ ((size_t) SCM_CELL_WORD_1 (_bv)) #define SCM_BYTEVECTOR_CONTENTS(_bv) \ ((signed char *) SCM_CELL_WORD_2 (_bv)) +#define SCM_BYTEVECTOR_PARENT(_bv) \ + (SCM_CELL_OBJECT_3 (_bv)) SCM_API SCM scm_endianness_big; @@ -115,7 +117,7 @@ SCM_API SCM scm_utf32_to_string (SCM, SCM); /* Internal API. */ #define SCM_BYTEVECTOR_P(x) \ - (!SCM_IMP (x) && SCM_TYP7(x) == scm_tc7_bytevector) + (SCM_HAS_TYP7 (x, scm_tc7_bytevector)) #define SCM_BYTEVECTOR_FLAGS(_bv) \ (SCM_CELL_TYPE (_bv) >> 7UL) #define SCM_SET_BYTEVECTOR_FLAGS(_bv, _f) \ @@ -132,13 +134,13 @@ SCM_API SCM scm_utf32_to_string (SCM, SCM); SCM_INTERNAL SCM scm_i_make_typed_bytevector (size_t, scm_t_array_element_type); SCM_INTERNAL SCM scm_c_take_typed_bytevector (signed char *, size_t, - scm_t_array_element_type); + scm_t_array_element_type, SCM); SCM_INTERNAL void scm_bootstrap_bytevectors (void); SCM_INTERNAL void scm_init_bytevectors (void); SCM_INTERNAL SCM scm_i_native_endianness; -SCM_INTERNAL SCM scm_c_take_gc_bytevector (signed char *, size_t); +SCM_INTERNAL SCM scm_c_take_gc_bytevector (signed char *, size_t, SCM); SCM_INTERNAL int scm_i_print_bytevector (SCM, SCM, scm_print_state *); diff --git a/libguile/chars.c b/libguile/chars.c index 2e1610566..fbedb0fe2 100644 --- a/libguile/chars.c +++ b/libguile/chars.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995,1996,1998, 2000, 2001, 2004, 2006, 2008, 2009, 2010 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996,1998, 2000, 2001, 2004, 2006, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -492,7 +492,7 @@ SCM_DEFINE (scm_char_general_category, "char-general-category", 1, 0, 0, sym = uc_general_category_name (cat); if (sym != NULL) - return scm_from_locale_symbol (sym); + return scm_from_utf8_symbol (sym); return SCM_BOOL_F; } #undef FUNC_NAME diff --git a/libguile/continuations.c b/libguile/continuations.c index cf8b6ac03..86627703c 100644 --- a/libguile/continuations.c +++ b/libguile/continuations.c @@ -174,14 +174,25 @@ continuation_print (SCM obj, SCM port, scm_print_state *state SCM_UNUSED) { scm_t_contregs *continuation = SCM_CONTREGS (obj); - scm_puts ("#<continuation ", port); + scm_puts_unlocked ("#<continuation ", port); scm_intprint (continuation->num_stack_items, 10, port); - scm_puts (" @ ", port); + scm_puts_unlocked (" @ ", port); scm_uintprint (SCM_SMOB_DATA_1 (obj), 16, port); - scm_putc ('>', port); + scm_putc_unlocked ('>', port); return 1; } +/* James Clark came up with this neat one instruction fix for + * continuations on the SPARC. It flushes the register windows so + * that all the state of the process is contained in the stack. + */ + +#if defined (sparc) || defined (__sparc__) || defined (__sparc) +# define SCM_FLUSH_REGISTER_WINDOWS asm("ta 3") +#else +# define SCM_FLUSH_REGISTER_WINDOWS /* empty */ +#endif + /* this may return more than once: the first time with the escape procedure, then subsequently with SCM_UNDEFINED (the vals already having been placed on the VM stack). */ @@ -487,7 +498,7 @@ print_exception_and_backtrace (SCM port, SCM tag, SCM args) if (should_print_backtrace (tag, stack)) { - scm_puts ("Backtrace:\n", port); + scm_puts_unlocked ("Backtrace:\n", port); scm_display_backtrace_with_highlights (stack, port, SCM_BOOL_F, SCM_BOOL_F, SCM_EOL); @@ -532,7 +543,7 @@ pre_unwind_handler (void *error_port, SCM tag, SCM args) { /* Print the exception unless TAG is `quit'. */ if (!scm_is_eq (tag, scm_from_latin1_symbol ("quit"))) - print_exception_and_backtrace (PTR2SCM (error_port), tag, args); + print_exception_and_backtrace (SCM_PACK_POINTER (error_port), tag, args); return SCM_UNSPECIFIED; } @@ -546,7 +557,7 @@ scm_c_with_continuation_barrier (void *(*func) (void *), void *data) scm_i_with_continuation_barrier (c_body, &c_data, c_handler, &c_data, pre_unwind_handler, - SCM2PTR (scm_current_error_port ())); + SCM_UNPACK_POINTER (scm_current_error_port ())); return c_data.result; } @@ -590,7 +601,7 @@ SCM_DEFINE (scm_with_continuation_barrier, "with-continuation-barrier", 1,0,0, return scm_i_with_continuation_barrier (scm_body, &scm_data, scm_handler, &scm_data, pre_unwind_handler, - SCM2PTR (scm_current_error_port ())); + SCM_UNPACK_POINTER (scm_current_error_port ())); } #undef FUNC_NAME diff --git a/libguile/control.c b/libguile/control.c index 661de8f4f..6302c0750 100644 --- a/libguile/control.c +++ b/libguile/control.c @@ -269,9 +269,9 @@ SCM_DEFINE (scm_at_abort, "@abort", 2, 0, 0, (SCM tag, SCM args), void scm_i_prompt_print (SCM exp, SCM port, scm_print_state *pstate SCM_UNUSED) { - scm_puts ("#<prompt ", port); + scm_puts_unlocked ("#<prompt ", port); scm_intprint (SCM_UNPACK (exp), 16, port); - scm_putc ('>', port); + scm_putc_unlocked ('>', port); } void diff --git a/libguile/control.h b/libguile/control.h index 2167ffa08..ebf255f72 100644 --- a/libguile/control.h +++ b/libguile/control.h @@ -22,7 +22,7 @@ #define SCM_F_PROMPT_ESCAPE 0x1 -#define SCM_PROMPT_P(x) (!SCM_IMP (x) && SCM_TYP7(x) == scm_tc7_prompt) +#define SCM_PROMPT_P(x) (SCM_HAS_TYP7 (x, scm_tc7_prompt)) #define SCM_PROMPT_FLAGS(x) (SCM_CELL_WORD ((x), 0) >> 8) #define SCM_PROMPT_ESCAPE_P(x) (SCM_PROMPT_FLAGS (x) & SCM_F_PROMPT_ESCAPE) #define SCM_PROMPT_TAG(x) (SCM_CELL_OBJECT ((x), 1)) diff --git a/libguile/debug.c b/libguile/debug.c index 88a01d6aa..c6ce99e7c 100644 --- a/libguile/debug.c +++ b/libguile/debug.c @@ -108,9 +108,7 @@ SCM_DEFINE (scm_debug_options, "debug-options-interface", 0, 1, 0, scm_dynwind_critical_section (SCM_BOOL_F); ans = scm_options (setting, scm_debug_opts, FUNC_NAME); -#ifdef STACK_CHECKING scm_stack_checking_enabled_p = SCM_STACK_CHECKING_P; -#endif scm_dynwind_end (); return ans; @@ -146,16 +144,9 @@ SCM_DEFINE (scm_procedure_source, "procedure-source", 1, 0, 0, if (scm_is_true (src)) return src; - switch (SCM_TYP7 (proc)) { - case scm_tcs_struct: - if (!SCM_STRUCT_APPLICABLE_P (proc) - || SCM_IMP (SCM_STRUCT_PROCEDURE (proc))) - break; - proc = SCM_STRUCT_PROCEDURE (proc); + if (SCM_STRUCTP (proc) && SCM_STRUCT_APPLICABLE_P (proc) + && SCM_HEAP_OBJECT_P ((proc = SCM_STRUCT_PROCEDURE (proc)))) continue; - default: - break; - } } while (0); diff --git a/libguile/debug.h b/libguile/debug.h index d862abab4..0749d283c 100644 --- a/libguile/debug.h +++ b/libguile/debug.h @@ -3,7 +3,7 @@ #ifndef SCM_DEBUG_H #define SCM_DEBUG_H -/* Copyright (C) 1995,1996,1998,1999,2000,2001,2002,2004,2008,2009,2010 +/* Copyright (C) 1995,1996,1998,1999,2000,2001,2002,2004,2008,2009,2010,2011 * Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or @@ -52,18 +52,6 @@ SCM_INTERNAL void scm_init_debug (void); SCM_API SCM scm_debug_hang (SCM obj); #endif /*GUILE_DEBUG*/ -#if SCM_ENABLE_DEPRECATED == 1 - -#define CHECK_ENTRY scm_check_entry_p -#define CHECK_APPLY scm_check_apply_p -#define CHECK_EXIT scm_check_exit_p - -/* Deprecated in guile 1.7.0 on 2004-03-29. */ -#define SCM_DEBUGGINGP scm_debug_mode_p -#define scm_debug_mode scm_debug_mode_p - -#endif - #endif /* SCM_DEBUG_H */ /* diff --git a/libguile/deprecated.c b/libguile/deprecated.c index 4ba305e80..e6ef91757 100644 --- a/libguile/deprecated.c +++ b/libguile/deprecated.c @@ -27,2559 +27,10 @@ #define SCM_BUILDING_DEPRECATED_CODE #include "libguile/_scm.h" -#include "libguile/async.h" -#include "libguile/arrays.h" -#include "libguile/array-map.h" -#include "libguile/generalized-arrays.h" -#include "libguile/bytevectors.h" -#include "libguile/bitvectors.h" -#include "libguile/deprecated.h" #include "libguile/deprecation.h" -#include "libguile/snarf.h" -#include "libguile/validate.h" -#include "libguile/strings.h" -#include "libguile/srfi-13.h" -#include "libguile/modules.h" -#include "libguile/eval.h" -#include "libguile/smob.h" -#include "libguile/procprop.h" -#include "libguile/vectors.h" -#include "libguile/hashtab.h" -#include "libguile/struct.h" -#include "libguile/variable.h" -#include "libguile/fluids.h" -#include "libguile/ports.h" -#include "libguile/eq.h" -#include "libguile/read.h" -#include "libguile/r6rs-ports.h" -#include "libguile/strports.h" -#include "libguile/smob.h" -#include "libguile/alist.h" -#include "libguile/keywords.h" -#include "libguile/socket.h" -#include "libguile/feature.h" -#include "libguile/uniform.h" - -#include <math.h> -#include <stdio.h> -#include <string.h> - -#include <arpa/inet.h> #if (SCM_ENABLE_DEPRECATED == 1) -/* From print.c: Internal symbol names of isyms. Deprecated in guile 1.7.0 on - * 2004-04-22. */ -char *scm_isymnames[] = -{ - "#@<deprecated>" -}; - - -SCM_REGISTER_PROC(s_substring_move_left_x, "substring-move-left!", 5, 0, 0, scm_substring_move_x); - -SCM_REGISTER_PROC(s_substring_move_right_x, "substring-move-right!", 5, 0, 0, scm_substring_move_x); - -SCM -scm_wta (SCM arg, const char *pos, const char *s_subr) -{ - if (!s_subr || !*s_subr) - s_subr = NULL; - if ((~0x1fL) & (long) pos) - { - /* error string supplied. */ - scm_misc_error (s_subr, pos, scm_list_1 (arg)); - } - else - { - /* numerical error code. */ - scm_t_bits error = (scm_t_bits) pos; - - switch (error) - { - case SCM_ARGn: - scm_wrong_type_arg (s_subr, 0, arg); - case SCM_ARG1: - scm_wrong_type_arg (s_subr, 1, arg); - case SCM_ARG2: - scm_wrong_type_arg (s_subr, 2, arg); - case SCM_ARG3: - scm_wrong_type_arg (s_subr, 3, arg); - case SCM_ARG4: - scm_wrong_type_arg (s_subr, 4, arg); - case SCM_ARG5: - scm_wrong_type_arg (s_subr, 5, arg); - case SCM_ARG6: - scm_wrong_type_arg (s_subr, 6, arg); - case SCM_ARG7: - scm_wrong_type_arg (s_subr, 7, arg); - case SCM_WNA: - scm_wrong_num_args (arg); - case SCM_OUTOFRANGE: - scm_out_of_range (s_subr, arg); - case SCM_NALLOC: - scm_memory_error (s_subr); - default: - /* this shouldn't happen. */ - scm_misc_error (s_subr, "Unknown error", SCM_EOL); - } - } - return SCM_UNSPECIFIED; -} - -/* Module registry - */ - -/* We can't use SCM objects here. One should be able to call - SCM_REGISTER_MODULE from a C++ constructor for a static - object. This happens before main and thus before libguile is - initialized. */ - -struct moddata { - struct moddata *link; - char *module_name; - void *init_func; -}; - -static struct moddata *registered_mods = NULL; - -void -scm_register_module_xxx (char *module_name, void *init_func) -{ - struct moddata *md; - - scm_c_issue_deprecation_warning - ("`scm_register_module_xxx' is deprecated. Use extensions instead."); - - /* XXX - should we (and can we) DEFER_INTS here? */ - - for (md = registered_mods; md; md = md->link) - if (!strcmp (md->module_name, module_name)) - { - md->init_func = init_func; - return; - } - - md = (struct moddata *) malloc (sizeof (struct moddata)); - if (md == NULL) - { - fprintf (stderr, - "guile: can't register module (%s): not enough memory", - module_name); - return; - } - - md->module_name = module_name; - md->init_func = init_func; - md->link = registered_mods; - registered_mods = md; -} - -SCM_DEFINE (scm_registered_modules, "c-registered-modules", 0, 0, 0, - (), - "Return a list of the object code modules that have been imported into\n" - "the current Guile process. Each element of the list is a pair whose\n" - "car is the name of the module, and whose cdr is the function handle\n" - "for that module's initializer function. The name is the string that\n" - "has been passed to scm_register_module_xxx.") -#define FUNC_NAME s_scm_registered_modules -{ - SCM res; - struct moddata *md; - - res = SCM_EOL; - for (md = registered_mods; md; md = md->link) - res = scm_cons (scm_cons (scm_from_locale_string (md->module_name), - scm_from_ulong ((unsigned long) md->init_func)), - res); - return res; -} -#undef FUNC_NAME - -SCM_DEFINE (scm_clear_registered_modules, "c-clear-registered-modules", 0, 0, 0, - (), - "Destroy the list of modules registered with the current Guile process.\n" - "The return value is unspecified. @strong{Warning:} this function does\n" - "not actually unlink or deallocate these modules, but only destroys the\n" - "records of which modules have been loaded. It should therefore be used\n" - "only by module bookkeeping operations.") -#define FUNC_NAME s_scm_clear_registered_modules -{ - struct moddata *md1, *md2; - - SCM_CRITICAL_SECTION_START; - - for (md1 = registered_mods; md1; md1 = md2) - { - md2 = md1->link; - free (md1); - } - registered_mods = NULL; - - SCM_CRITICAL_SECTION_END; - return SCM_UNSPECIFIED; -} -#undef FUNC_NAME - -void -scm_remember (SCM *ptr) -{ - scm_c_issue_deprecation_warning ("`scm_remember' is deprecated. " - "Use the `scm_remember_upto_here*' family of functions instead."); -} - -SCM -scm_protect_object (SCM obj) -{ - scm_c_issue_deprecation_warning ("`scm_protect_object' is deprecated. " - "Use `scm_gc_protect_object' instead."); - return scm_gc_protect_object (obj); -} - -SCM -scm_unprotect_object (SCM obj) -{ - scm_c_issue_deprecation_warning ("`scm_unprotect_object' is deprecated. " - "Use `scm_gc_unprotect_object' instead."); - return scm_gc_unprotect_object (obj); -} - -SCM_SYMBOL (scm_sym_app, "app"); -SCM_SYMBOL (scm_sym_modules, "modules"); -static SCM module_prefix = SCM_BOOL_F; -static SCM make_modules_in_var; -static SCM beautify_user_module_x_var; -static SCM try_module_autoload_var; - -static void -init_module_stuff () -{ - if (scm_is_false (module_prefix)) - { - module_prefix = scm_list_2 (scm_sym_app, scm_sym_modules); - make_modules_in_var = scm_c_lookup ("make-modules-in"); - beautify_user_module_x_var = - scm_c_lookup ("beautify-user-module!"); - try_module_autoload_var = scm_c_lookup ("try-module-autoload"); - } -} - -static SCM -scm_module_full_name (SCM name) -{ - init_module_stuff (); - if (scm_is_eq (SCM_CAR (name), scm_sym_app)) - return name; - else - return scm_append (scm_list_2 (module_prefix, name)); -} - -SCM -scm_make_module (SCM name) -{ - init_module_stuff (); - scm_c_issue_deprecation_warning ("`scm_make_module' is deprecated. " - "Use `scm_c_define_module instead."); - - return scm_call_2 (SCM_VARIABLE_REF (make_modules_in_var), - scm_the_root_module (), - scm_module_full_name (name)); -} - -SCM -scm_ensure_user_module (SCM module) -{ - init_module_stuff (); - scm_c_issue_deprecation_warning ("`scm_ensure_user_module' is deprecated. " - "Use `scm_c_define_module instead."); - - scm_call_1 (SCM_VARIABLE_REF (beautify_user_module_x_var), module); - return SCM_UNSPECIFIED; -} - -SCM -scm_load_scheme_module (SCM name) -{ - init_module_stuff (); - scm_c_issue_deprecation_warning ("`scm_load_scheme_module' is deprecated. " - "Use `scm_c_resolve_module instead."); - - return scm_call_1 (SCM_VARIABLE_REF (try_module_autoload_var), name); -} - -/* This is implemented in C solely for SCM_COERCE_OUTPORT ... */ - -static void -maybe_close_port (void *data, SCM port) -{ - SCM except_set = PTR2SCM (data); - - while (!scm_is_null (except_set)) - { - SCM p = SCM_COERCE_OUTPORT (SCM_CAR (except_set)); - if (scm_is_eq (p, port)) - return; - except_set = SCM_CDR (except_set); - } - - scm_close_port (port); -} - -SCM_DEFINE (scm_close_all_ports_except, "close-all-ports-except", 0, 0, 1, - (SCM ports), - "[DEPRECATED] Close all open file ports used by the interpreter\n" - "except for those supplied as arguments. This procedure\n" - "was intended to be used before an exec call to close file descriptors\n" - "which are not needed in the new process. However it has the\n" - "undesirable side effect of flushing buffers, so it's deprecated.\n" - "Use port-for-each instead.") -#define FUNC_NAME s_scm_close_all_ports_except -{ - SCM p; - SCM_VALIDATE_REST_ARGUMENT (ports); - - for (p = ports; !scm_is_null (p); p = SCM_CDR (p)) - SCM_VALIDATE_OPPORT (SCM_ARG1, SCM_COERCE_OUTPORT (SCM_CAR (p))); - - scm_c_port_for_each (maybe_close_port, SCM2PTR (ports)); - - return SCM_UNSPECIFIED; -} -#undef FUNC_NAME - -SCM_DEFINE (scm_variable_set_name_hint, "variable-set-name-hint!", 2, 0, 0, - (SCM var, SCM hint), - "Do not use this function.") -#define FUNC_NAME s_scm_variable_set_name_hint -{ - SCM_VALIDATE_VARIABLE (1, var); - SCM_VALIDATE_SYMBOL (2, hint); - scm_c_issue_deprecation_warning - ("'variable-set-name-hint!' is deprecated. Do not use it."); - return SCM_UNSPECIFIED; -} -#undef FUNC_NAME - -SCM_DEFINE (scm_builtin_variable, "builtin-variable", 1, 0, 0, - (SCM name), - "Do not use this function.") -#define FUNC_NAME s_scm_builtin_variable -{ - SCM_VALIDATE_SYMBOL (1,name); - scm_c_issue_deprecation_warning ("`builtin-variable' is deprecated. " - "Use module system operations instead."); - return scm_sym2var (name, SCM_BOOL_F, SCM_BOOL_T); -} -#undef FUNC_NAME - -SCM -scm_makstr (size_t len, int dummy) -{ - scm_c_issue_deprecation_warning - ("'scm_makstr' is deprecated. Use 'scm_c_make_string' instead."); - return scm_c_make_string (len, SCM_UNDEFINED); -} - -SCM -scm_makfromstr (const char *src, size_t len, int dummy SCM_UNUSED) -{ - scm_c_issue_deprecation_warning ("`scm_makfromstr' is deprecated. " - "Use `scm_from_locale_stringn' instead."); - - return scm_from_locale_stringn (src, len); -} - -SCM -scm_internal_with_fluids (SCM fluids, SCM values, SCM (*cproc) (), void *cdata) -{ - scm_c_issue_deprecation_warning ("`scm_internal_with_fluids' is deprecated. " - "Use `scm_c_with_fluids' instead."); - - return scm_c_with_fluids (fluids, values, cproc, cdata); -} - -SCM -scm_make_gsubr (const char *name, int req, int opt, int rst, SCM (*fcn)()) -{ - scm_c_issue_deprecation_warning - ("`scm_make_gsubr' is deprecated. Use `scm_c_define_gsubr' instead."); - - return scm_c_define_gsubr (name, req, opt, rst, fcn); -} - -SCM -scm_make_gsubr_with_generic (const char *name, - int req, int opt, int rst, - SCM (*fcn)(), SCM *gf) -{ - scm_c_issue_deprecation_warning - ("`scm_make_gsubr_with_generic' is deprecated. " - "Use `scm_c_define_gsubr_with_generic' instead."); - - return scm_c_define_gsubr_with_generic (name, req, opt, rst, fcn, gf); -} - -SCM -scm_create_hook (const char *name, int n_args) -{ - scm_c_issue_deprecation_warning - ("'scm_create_hook' is deprecated. " - "Use 'scm_make_hook' and 'scm_c_define' instead."); - { - SCM hook = scm_make_hook (scm_from_int (n_args)); - scm_c_define (name, hook); - return hook; - } -} - -SCM_DEFINE (scm_sloppy_memq, "sloppy-memq", 2, 0, 0, - (SCM x, SCM lst), - "This procedure behaves like @code{memq}, but does no type or error checking.\n" - "Its use is recommended only in writing Guile internals,\n" - "not for high-level Scheme programs.") -#define FUNC_NAME s_scm_sloppy_memq -{ - scm_c_issue_deprecation_warning - ("'sloppy-memq' is deprecated. Use 'memq' instead."); - - for(; scm_is_pair (lst); lst = SCM_CDR(lst)) - { - if (scm_is_eq (SCM_CAR (lst), x)) - return lst; - } - return lst; -} -#undef FUNC_NAME - - -SCM_DEFINE (scm_sloppy_memv, "sloppy-memv", 2, 0, 0, - (SCM x, SCM lst), - "This procedure behaves like @code{memv}, but does no type or error checking.\n" - "Its use is recommended only in writing Guile internals,\n" - "not for high-level Scheme programs.") -#define FUNC_NAME s_scm_sloppy_memv -{ - scm_c_issue_deprecation_warning - ("'sloppy-memv' is deprecated. Use 'memv' instead."); - - for(; scm_is_pair (lst); lst = SCM_CDR(lst)) - { - if (! scm_is_false (scm_eqv_p (SCM_CAR (lst), x))) - return lst; - } - return lst; -} -#undef FUNC_NAME - - -SCM_DEFINE (scm_sloppy_member, "sloppy-member", 2, 0, 0, - (SCM x, SCM lst), - "This procedure behaves like @code{member}, but does no type or error checking.\n" - "Its use is recommended only in writing Guile internals,\n" - "not for high-level Scheme programs.") -#define FUNC_NAME s_scm_sloppy_member -{ - scm_c_issue_deprecation_warning - ("'sloppy-member' is deprecated. Use 'member' instead."); - - for(; scm_is_pair (lst); lst = SCM_CDR(lst)) - { - if (! scm_is_false (scm_equal_p (SCM_CAR (lst), x))) - return lst; - } - return lst; -} -#undef FUNC_NAME - -SCM_SYMBOL (scm_end_of_file_key, "end-of-file"); - -SCM_DEFINE (scm_read_and_eval_x, "read-and-eval!", 0, 1, 0, - (SCM port), - "Read a form from @var{port} (standard input by default), and evaluate it\n" - "(memoizing it in the process) in the top-level environment. If no data\n" - "is left to be read from @var{port}, an @code{end-of-file} error is\n" - "signalled.") -#define FUNC_NAME s_scm_read_and_eval_x -{ - SCM form; - - scm_c_issue_deprecation_warning - ("'read-and-eval!' is deprecated. Use 'read' and 'eval' instead."); - - form = scm_read (port); - if (SCM_EOF_OBJECT_P (form)) - scm_ithrow (scm_end_of_file_key, SCM_EOL, 1); - return scm_eval_x (form, scm_current_module ()); -} -#undef FUNC_NAME - -/* Call thunk(closure) underneath a top-level error handler. - * If an error occurs, pass the exitval through err_filter and return it. - * If no error occurs, return the value of thunk. - */ - -#ifdef _UNICOS -typedef int setjmp_type; -#else -typedef long setjmp_type; -#endif - -struct cce_handler_data { - SCM (*err_filter) (); - void *closure; -}; - -static SCM -invoke_err_filter (void *d, SCM tag, SCM args) -{ - struct cce_handler_data *data = (struct cce_handler_data *)d; - return data->err_filter (SCM_BOOL_F, data->closure); -} - -SCM -scm_call_catching_errors (SCM (*thunk)(), SCM (*err_filter)(), void *closure) -{ - scm_c_issue_deprecation_warning - ("'scm_call_catching_errors' is deprecated. " - "Use 'scm_internal_catch' instead."); - - { - struct cce_handler_data data; - data.err_filter = err_filter; - data.closure = closure; - return scm_internal_catch (SCM_BOOL_T, - (scm_t_catch_body)thunk, closure, - (scm_t_catch_handler)invoke_err_filter, &data); - } -} - -long -scm_make_smob_type_mfpe (char *name, size_t size, - SCM (*mark) (SCM), - size_t (*free) (SCM), - int (*print) (SCM, SCM, scm_print_state *), - SCM (*equalp) (SCM, SCM)) -{ - scm_c_issue_deprecation_warning - ("'scm_make_smob_type_mfpe' is deprecated. " - "Use 'scm_make_smob_type' plus 'scm_set_smob_*' instead."); - - { - long answer = scm_make_smob_type (name, size); - scm_set_smob_mfpe (answer, mark, free, print, equalp); - return answer; - } -} - -void -scm_set_smob_mfpe (long tc, - SCM (*mark) (SCM), - size_t (*free) (SCM), - int (*print) (SCM, SCM, scm_print_state *), - SCM (*equalp) (SCM, SCM)) -{ - scm_c_issue_deprecation_warning - ("'scm_set_smob_mfpe' is deprecated. " - "Use 'scm_set_smob_mark' instead, for example."); - - if (mark) scm_set_smob_mark (tc, mark); - if (free) scm_set_smob_free (tc, free); - if (print) scm_set_smob_print (tc, print); - if (equalp) scm_set_smob_equalp (tc, equalp); -} - -size_t -scm_smob_free (SCM obj) -{ - long n = SCM_SMOBNUM (obj); - - scm_c_issue_deprecation_warning - ("`scm_smob_free' is deprecated. " - "It is no longer needed."); - - if (scm_smobs[n].size > 0) - scm_gc_free ((void *) SCM_SMOB_DATA_1 (obj), - scm_smobs[n].size, SCM_SMOBNAME (n)); - return 0; -} - -SCM -scm_read_0str (char *expr) -{ - scm_c_issue_deprecation_warning - ("scm_read_0str is deprecated. Use scm_c_read_string instead."); - - return scm_c_read_string (expr); -} - -SCM -scm_eval_0str (const char *expr) -{ - scm_c_issue_deprecation_warning - ("scm_eval_0str is deprecated. Use scm_c_eval_string instead."); - - return scm_c_eval_string (expr); -} - -SCM -scm_strprint_obj (SCM obj) -{ - scm_c_issue_deprecation_warning - ("scm_strprint_obj is deprecated. Use scm_object_to_string instead."); - return scm_object_to_string (obj, SCM_UNDEFINED); -} - -char * -scm_i_object_chars (SCM obj) -{ - scm_c_issue_deprecation_warning - ("SCM_CHARS is deprecated. See the manual for alternatives."); - if (SCM_STRINGP (obj)) - return SCM_STRING_CHARS (obj); - if (SCM_SYMBOLP (obj)) - return SCM_SYMBOL_CHARS (obj); - abort (); -} - -long -scm_i_object_length (SCM obj) -{ - scm_c_issue_deprecation_warning - ("SCM_LENGTH is deprecated. " - "Use scm_c_string_length instead, for example, or see the manual."); - if (SCM_STRINGP (obj)) - return SCM_STRING_LENGTH (obj); - if (SCM_SYMBOLP (obj)) - return SCM_SYMBOL_LENGTH (obj); - if (SCM_VECTORP (obj)) - return SCM_VECTOR_LENGTH (obj); - abort (); -} - -SCM -scm_sym2ovcell_soft (SCM sym, SCM obarray) -{ - SCM lsym, z; - size_t hash = scm_i_symbol_hash (sym) % SCM_VECTOR_LENGTH (obarray); - - scm_c_issue_deprecation_warning ("`scm_sym2ovcell_soft' is deprecated. " - "Use hashtables instead."); - - SCM_CRITICAL_SECTION_START; - for (lsym = SCM_VECTOR_REF (obarray, hash); - SCM_NIMP (lsym); - lsym = SCM_CDR (lsym)) - { - z = SCM_CAR (lsym); - if (scm_is_eq (SCM_CAR (z), sym)) - { - SCM_CRITICAL_SECTION_END; - return z; - } - } - SCM_CRITICAL_SECTION_END; - return SCM_BOOL_F; -} - - -SCM -scm_sym2ovcell (SCM sym, SCM obarray) -#define FUNC_NAME "scm_sym2ovcell" -{ - SCM answer; - - scm_c_issue_deprecation_warning ("`scm_sym2ovcell' is deprecated. " - "Use hashtables instead."); - - answer = scm_sym2ovcell_soft (sym, obarray); - if (scm_is_true (answer)) - return answer; - SCM_MISC_ERROR ("uninterned symbol: ~S", scm_list_1 (sym)); - return SCM_UNSPECIFIED; /* not reached */ -} -#undef FUNC_NAME - - -/* Intern a symbol whose name is the LEN characters at NAME in OBARRAY. - - OBARRAY should be a vector of lists, indexed by the name's hash - value, modulo OBARRAY's length. Each list has the form - ((SYMBOL . VALUE) ...), where SYMBOL is a symbol, and VALUE is the - value associated with that symbol (in the current module? in the - system module?) - - To "intern" a symbol means: if OBARRAY already contains a symbol by - that name, return its (SYMBOL . VALUE) pair; otherwise, create a - new symbol, add the pair (SYMBOL . SCM_UNDEFINED) to the - appropriate list of the OBARRAY, and return the pair. - - If softness is non-zero, don't create a symbol if it isn't already - in OBARRAY; instead, just return #f. - - If OBARRAY is SCM_BOOL_F, create a symbol listed in no obarray and - return (SYMBOL . SCM_UNDEFINED). */ - - -static SCM -intern_obarray_soft (SCM symbol, SCM obarray, unsigned int softness) -{ - size_t raw_hash = scm_i_symbol_hash (symbol); - size_t hash; - SCM lsym; - - if (scm_is_false (obarray)) - { - if (softness) - return SCM_BOOL_F; - else - return scm_cons (symbol, SCM_UNDEFINED); - } - - hash = raw_hash % SCM_VECTOR_LENGTH (obarray); - - for (lsym = SCM_VECTOR_REF(obarray, hash); - SCM_NIMP (lsym); lsym = SCM_CDR (lsym)) - { - SCM a = SCM_CAR (lsym); - SCM z = SCM_CAR (a); - if (scm_is_eq (z, symbol)) - return a; - } - - if (softness) - { - return SCM_BOOL_F; - } - else - { - SCM cell = scm_cons (symbol, SCM_UNDEFINED); - SCM slot = SCM_VECTOR_REF (obarray, hash); - - SCM_VECTOR_SET (obarray, hash, scm_cons (cell, slot)); - - return cell; - } -} - - -SCM -scm_intern_obarray_soft (const char *name, size_t len, SCM obarray, - unsigned int softness) -{ - SCM symbol = scm_from_locale_symboln (name, len); - - scm_c_issue_deprecation_warning ("`scm_intern_obarray_soft' is deprecated. " - "Use hashtables instead."); - - return intern_obarray_soft (symbol, obarray, softness); -} - -SCM -scm_intern_obarray (const char *name,size_t len,SCM obarray) -{ - scm_c_issue_deprecation_warning ("`scm_intern_obarray' is deprecated. " - "Use hashtables instead."); - - return scm_intern_obarray_soft (name, len, obarray, 0); -} - -/* Lookup the value of the symbol named by the nul-terminated string - NAME in the current module. */ -SCM -scm_symbol_value0 (const char *name) -{ - scm_c_issue_deprecation_warning ("`scm_symbol_value0' is deprecated. " - "Use `scm_lookup' instead."); - - return scm_variable_ref (scm_c_lookup (name)); -} - -SCM_DEFINE (scm_string_to_obarray_symbol, "string->obarray-symbol", 2, 1, 0, - (SCM o, SCM s, SCM softp), - "Intern a new symbol in @var{obarray}, a symbol table, with name\n" - "@var{string}.\n\n" - "If @var{obarray} is @code{#f}, use the default system symbol table. If\n" - "@var{obarray} is @code{#t}, the symbol should not be interned in any\n" - "symbol table; merely return the pair (@var{symbol}\n" - ". @var{#<undefined>}).\n\n" - "The @var{soft?} argument determines whether new symbol table entries\n" - "should be created when the specified symbol is not already present in\n" - "@var{obarray}. If @var{soft?} is specified and is a true value, then\n" - "new entries should not be added for symbols not already present in the\n" - "table; instead, simply return @code{#f}.") -#define FUNC_NAME s_scm_string_to_obarray_symbol -{ - SCM vcell; - SCM answer; - int softness; - - SCM_VALIDATE_STRING (2, s); - SCM_ASSERT (scm_is_bool (o) || SCM_VECTORP (o), o, SCM_ARG1, FUNC_NAME); - - scm_c_issue_deprecation_warning ("`string->obarray-symbol' is deprecated. " - "Use hashtables instead."); - - softness = (!SCM_UNBNDP (softp) && scm_is_true(softp)); - /* iron out some screwy calling conventions */ - if (scm_is_false (o)) - { - /* nothing interesting to do here. */ - return scm_string_to_symbol (s); - } - else if (scm_is_eq (o, SCM_BOOL_T)) - o = SCM_BOOL_F; - - vcell = intern_obarray_soft (scm_string_to_symbol (s), o, softness); - if (scm_is_false (vcell)) - return vcell; - answer = SCM_CAR (vcell); - return answer; -} -#undef FUNC_NAME - -SCM_DEFINE (scm_intern_symbol, "intern-symbol", 2, 0, 0, - (SCM o, SCM s), - "Add a new symbol to @var{obarray} with name @var{string}, bound to an\n" - "unspecified initial value. The symbol table is not modified if a symbol\n" - "with this name is already present.") -#define FUNC_NAME s_scm_intern_symbol -{ - size_t hval; - SCM_VALIDATE_SYMBOL (2,s); - if (scm_is_false (o)) - return SCM_UNSPECIFIED; - - scm_c_issue_deprecation_warning ("`intern-symbol' is deprecated. " - "Use hashtables instead."); - - SCM_VALIDATE_VECTOR (1,o); - hval = scm_i_symbol_hash (s) % SCM_VECTOR_LENGTH (o); - /* If the symbol is already interned, simply return. */ - SCM_CRITICAL_SECTION_START; - { - SCM lsym; - SCM sym; - for (lsym = SCM_VECTOR_REF (o, hval); - SCM_NIMP (lsym); - lsym = SCM_CDR (lsym)) - { - sym = SCM_CAR (lsym); - if (scm_is_eq (SCM_CAR (sym), s)) - { - SCM_CRITICAL_SECTION_END; - return SCM_UNSPECIFIED; - } - } - SCM_VECTOR_SET (o, hval, - scm_acons (s, SCM_UNDEFINED, - SCM_VECTOR_REF (o, hval))); - } - SCM_CRITICAL_SECTION_END; - return SCM_UNSPECIFIED; -} -#undef FUNC_NAME - -SCM_DEFINE (scm_unintern_symbol, "unintern-symbol", 2, 0, 0, - (SCM o, SCM s), - "Remove the symbol with name @var{string} from @var{obarray}. This\n" - "function returns @code{#t} if the symbol was present and @code{#f}\n" - "otherwise.") -#define FUNC_NAME s_scm_unintern_symbol -{ - size_t hval; - - scm_c_issue_deprecation_warning ("`unintern-symbol' is deprecated. " - "Use hashtables instead."); - - SCM_VALIDATE_SYMBOL (2,s); - if (scm_is_false (o)) - return SCM_BOOL_F; - SCM_VALIDATE_VECTOR (1,o); - hval = scm_i_symbol_hash (s) % SCM_VECTOR_LENGTH (o); - SCM_CRITICAL_SECTION_START; - { - SCM lsym_follow; - SCM lsym; - SCM sym; - for (lsym = SCM_VECTOR_REF (o, hval), lsym_follow = SCM_BOOL_F; - SCM_NIMP (lsym); - lsym_follow = lsym, lsym = SCM_CDR (lsym)) - { - sym = SCM_CAR (lsym); - if (scm_is_eq (SCM_CAR (sym), s)) - { - /* Found the symbol to unintern. */ - if (scm_is_false (lsym_follow)) - SCM_VECTOR_SET (o, hval, lsym); - else - SCM_SETCDR (lsym_follow, SCM_CDR(lsym)); - SCM_CRITICAL_SECTION_END; - return SCM_BOOL_T; - } - } - } - SCM_CRITICAL_SECTION_END; - return SCM_BOOL_F; -} -#undef FUNC_NAME - -SCM_DEFINE (scm_symbol_binding, "symbol-binding", 2, 0, 0, - (SCM o, SCM s), - "Look up in @var{obarray} the symbol whose name is @var{string}, and\n" - "return the value to which it is bound. If @var{obarray} is @code{#f},\n" - "use the global symbol table. If @var{string} is not interned in\n" - "@var{obarray}, an error is signalled.") -#define FUNC_NAME s_scm_symbol_binding -{ - SCM vcell; - - scm_c_issue_deprecation_warning ("`symbol-binding' is deprecated. " - "Use hashtables instead."); - - SCM_VALIDATE_SYMBOL (2,s); - if (scm_is_false (o)) - return scm_variable_ref (scm_lookup (s)); - SCM_VALIDATE_VECTOR (1,o); - vcell = scm_sym2ovcell (s, o); - return SCM_CDR(vcell); -} -#undef FUNC_NAME - -#if 0 -SCM_DEFINE (scm_symbol_interned_p, "symbol-interned?", 2, 0, 0, - (SCM o, SCM s), - "Return @code{#t} if @var{obarray} contains a symbol with name\n" - "@var{string}, and @code{#f} otherwise.") -#define FUNC_NAME s_scm_symbol_interned_p -{ - SCM vcell; - - scm_c_issue_deprecation_warning ("`symbol-interned?' is deprecated. " - "Use hashtables instead."); - - SCM_VALIDATE_SYMBOL (2,s); - if (scm_is_false (o)) - { - SCM var = scm_sym2var (s, SCM_BOOL_F, SCM_BOOL_F); - if (var != SCM_BOOL_F) - return SCM_BOOL_T; - return SCM_BOOL_F; - } - SCM_VALIDATE_VECTOR (1,o); - vcell = scm_sym2ovcell_soft (s, o); - return (SCM_NIMP(vcell) - ? SCM_BOOL_T - : SCM_BOOL_F); -} -#undef FUNC_NAME -#endif - -SCM_DEFINE (scm_symbol_bound_p, "symbol-bound?", 2, 0, 0, - (SCM o, SCM s), - "Return @code{#t} if @var{obarray} contains a symbol with name\n" - "@var{string} bound to a defined value. This differs from\n" - "@var{symbol-interned?} in that the mere mention of a symbol\n" - "usually causes it to be interned; @code{symbol-bound?}\n" - "determines whether a symbol has been given any meaningful\n" - "value.") -#define FUNC_NAME s_scm_symbol_bound_p -{ - SCM vcell; - - scm_c_issue_deprecation_warning ("`symbol-bound?' is deprecated. " - "Use hashtables instead."); - - SCM_VALIDATE_SYMBOL (2,s); - if (scm_is_false (o)) - { - SCM var = scm_sym2var (s, SCM_BOOL_F, SCM_BOOL_F); - if (SCM_VARIABLEP(var) && !SCM_UNBNDP(SCM_VARIABLE_REF(var))) - return SCM_BOOL_T; - return SCM_BOOL_F; - } - SCM_VALIDATE_VECTOR (1,o); - vcell = scm_sym2ovcell_soft (s, o); - return scm_from_bool (SCM_NIMP (vcell) && !SCM_UNBNDP (SCM_CDR (vcell))); -} -#undef FUNC_NAME - - -SCM_DEFINE (scm_symbol_set_x, "symbol-set!", 3, 0, 0, - (SCM o, SCM s, SCM v), - "Find the symbol in @var{obarray} whose name is @var{string}, and rebind\n" - "it to @var{value}. An error is signalled if @var{string} is not present\n" - "in @var{obarray}.") -#define FUNC_NAME s_scm_symbol_set_x -{ - SCM vcell; - - scm_c_issue_deprecation_warning ("`symbol-set!' is deprecated. " - "Use the module system instead."); - - SCM_VALIDATE_SYMBOL (2,s); - if (scm_is_false (o)) - { - scm_define (s, v); - return SCM_UNSPECIFIED; - } - SCM_VALIDATE_VECTOR (1,o); - vcell = scm_sym2ovcell (s, o); - SCM_SETCDR (vcell, v); - return SCM_UNSPECIFIED; -} -#undef FUNC_NAME - -#define MAX_PREFIX_LENGTH 30 - -static int gentemp_counter; - -SCM_DEFINE (scm_gentemp, "gentemp", 0, 2, 0, - (SCM prefix, SCM obarray), - "Create a new symbol with a name unique in an obarray.\n" - "The name is constructed from an optional string @var{prefix}\n" - "and a counter value. The default prefix is @code{t}. The\n" - "@var{obarray} is specified as a second optional argument.\n" - "Default is the system obarray where all normal symbols are\n" - "interned. The counter is increased by 1 at each\n" - "call. There is no provision for resetting the counter.") -#define FUNC_NAME s_scm_gentemp -{ - char buf[MAX_PREFIX_LENGTH + SCM_INTBUFLEN]; - char *name = buf; - int n_digits; - size_t len; - - scm_c_issue_deprecation_warning ("`gentemp' is deprecated. " - "Use `gensym' instead."); - - if (SCM_UNBNDP (prefix)) - { - name[0] = 't'; - len = 1; - } - else - { - SCM_VALIDATE_STRING (1, prefix); - len = scm_i_string_length (prefix); - name = scm_to_locale_stringn (prefix, &len); - name = scm_realloc (name, len + SCM_INTBUFLEN); - } - - if (SCM_UNBNDP (obarray)) - return scm_gensym (prefix); - else - SCM_ASSERT ((scm_is_vector (obarray) || SCM_I_WVECTP (obarray)), - obarray, - SCM_ARG2, - FUNC_NAME); - do - n_digits = scm_iint2str (gentemp_counter++, 10, &name[len]); - while (scm_is_true (scm_intern_obarray_soft (name, - len + n_digits, - obarray, - 1))); - { - SCM vcell = scm_intern_obarray_soft (name, - len + n_digits, - obarray, - 0); - if (name != buf) - free (name); - return SCM_CAR (vcell); - } -} -#undef FUNC_NAME - -SCM -scm_i_makinum (scm_t_signed_bits val) -{ - scm_c_issue_deprecation_warning - ("SCM_MAKINUM is deprecated. Use scm_from_int or similar instead."); - return SCM_I_MAKINUM (val); -} - -int -scm_i_inump (SCM obj) -{ - scm_c_issue_deprecation_warning - ("SCM_INUMP is deprecated. Use scm_is_integer or similar instead."); - return SCM_I_INUMP (obj); -} - -scm_t_signed_bits -scm_i_inum (SCM obj) -{ - scm_c_issue_deprecation_warning - ("SCM_INUM is deprecated. Use scm_to_int or similar instead."); - return scm_to_intmax (obj); -} - -char * -scm_c_string2str (SCM obj, char *str, size_t *lenp) -{ - scm_c_issue_deprecation_warning - ("scm_c_string2str is deprecated. Use scm_to_locale_stringbuf or similar instead."); - - if (str == NULL) - { - char *result = scm_to_locale_string (obj); - if (lenp) - *lenp = scm_i_string_length (obj); - return result; - } - else - { - /* Pray that STR is large enough. - */ - size_t len = scm_to_locale_stringbuf (obj, str, SCM_I_SIZE_MAX); - str[len] = '\0'; - if (lenp) - *lenp = len; - return str; - } -} - -char * -scm_c_substring2str (SCM obj, char *str, size_t start, size_t len) -{ - scm_c_issue_deprecation_warning - ("scm_c_substring2str is deprecated. Use scm_substring plus scm_to_locale_stringbuf instead."); - - if (start) - obj = scm_substring (obj, scm_from_size_t (start), SCM_UNDEFINED); - - scm_to_locale_stringbuf (obj, str, len); - return str; -} - -/* Converts the given Scheme symbol OBJ into a C string, containing a copy - of OBJ's content with a trailing null byte. If LENP is non-NULL, set - *LENP to the string's length. - - When STR is non-NULL it receives the copy and is returned by the function, - otherwise new memory is allocated and the caller is responsible for - freeing it via free(). If out of memory, NULL is returned. - - Note that Scheme symbols may contain arbitrary data, including null - characters. This means that null termination is not a reliable way to - determine the length of the returned value. However, the function always - copies the complete contents of OBJ, and sets *LENP to the length of the - scheme symbol (if LENP is non-null). */ -char * -scm_c_symbol2str (SCM obj, char *str, size_t *lenp) -{ - return scm_c_string2str (scm_symbol_to_string (obj), str, lenp); -} - -double -scm_truncate (double x) -{ - scm_c_issue_deprecation_warning - ("scm_truncate is deprecated. Use scm_c_truncate instead."); - return scm_c_truncate (x); -} - -double -scm_round (double x) -{ - scm_c_issue_deprecation_warning - ("scm_round is deprecated. Use scm_c_round instead."); - return scm_c_round (x); -} - -SCM -scm_sys_expt (SCM x, SCM y) -{ - scm_c_issue_deprecation_warning - ("scm_sys_expt is deprecated. Use scm_expt instead."); - return scm_expt (x, y); -} - -double -scm_asinh (double x) -{ - scm_c_issue_deprecation_warning - ("scm_asinh is deprecated. Use asinh instead."); -#if HAVE_ASINH - return asinh (x); -#else - return log (x + sqrt (x * x + 1)); -#endif -} - -double -scm_acosh (double x) -{ - scm_c_issue_deprecation_warning - ("scm_acosh is deprecated. Use acosh instead."); -#if HAVE_ACOSH - return acosh (x); -#else - return log (x + sqrt (x * x - 1)); -#endif -} - -double -scm_atanh (double x) -{ - scm_c_issue_deprecation_warning - ("scm_atanh is deprecated. Use atanh instead."); -#if HAVE_ATANH - return atanh (x); -#else - return 0.5 * log ((1 + x) / (1 - x)); -#endif -} - -SCM -scm_sys_atan2 (SCM z1, SCM z2) -{ - scm_c_issue_deprecation_warning - ("scm_sys_atan2 is deprecated. Use scm_atan instead."); - return scm_atan (z1, z2); -} - -char * -scm_i_deprecated_symbol_chars (SCM sym) -{ - scm_c_issue_deprecation_warning - ("SCM_SYMBOL_CHARS is deprecated. Use scm_symbol_to_string."); - - return (char *)scm_i_symbol_chars (sym); -} - -size_t -scm_i_deprecated_symbol_length (SCM sym) -{ - scm_c_issue_deprecation_warning - ("SCM_SYMBOL_LENGTH is deprecated. Use scm_symbol_to_string."); - return scm_i_symbol_length (sym); -} - -int -scm_i_keywordp (SCM obj) -{ - scm_c_issue_deprecation_warning - ("SCM_KEYWORDP is deprecated. Use scm_is_keyword instead."); - return scm_is_keyword (obj); -} - -SCM -scm_i_keywordsym (SCM keyword) -{ - scm_c_issue_deprecation_warning - ("SCM_KEYWORDSYM is deprecated. See scm_keyword_to_symbol instead."); - return scm_keyword_dash_symbol (keyword); -} - -int -scm_i_vectorp (SCM x) -{ - scm_c_issue_deprecation_warning - ("SCM_VECTORP is deprecated. Use scm_is_vector instead."); - return SCM_I_IS_VECTOR (x); -} - -unsigned long -scm_i_vector_length (SCM x) -{ - scm_c_issue_deprecation_warning - ("SCM_VECTOR_LENGTH is deprecated. Use scm_c_vector_length instead."); - return SCM_I_VECTOR_LENGTH (x); -} - -const SCM * -scm_i_velts (SCM x) -{ - scm_c_issue_deprecation_warning - ("SCM_VELTS is deprecated. Use scm_vector_elements instead."); - return SCM_I_VECTOR_ELTS (x); -} - -SCM * -scm_i_writable_velts (SCM x) -{ - scm_c_issue_deprecation_warning - ("SCM_WRITABLE_VELTS is deprecated. " - "Use scm_vector_writable_elements instead."); - return SCM_I_VECTOR_WELTS (x); -} - -SCM -scm_i_vector_ref (SCM x, size_t idx) -{ - scm_c_issue_deprecation_warning - ("SCM_VECTOR_REF is deprecated. " - "Use scm_c_vector_ref or scm_vector_elements instead."); - return scm_c_vector_ref (x, idx); -} - -void -scm_i_vector_set (SCM x, size_t idx, SCM val) -{ - scm_c_issue_deprecation_warning - ("SCM_VECTOR_SET is deprecated. " - "Use scm_c_vector_set_x or scm_vector_writable_elements instead."); - scm_c_vector_set_x (x, idx, val); -} - -SCM -scm_vector_equal_p (SCM x, SCM y) -{ - scm_c_issue_deprecation_warning - ("scm_vector_euqal_p is deprecated. " - "Use scm_equal_p instead."); - return scm_equal_p (x, y); -} - -SCM_DEFINE (scm_uniform_vector_read_x, "uniform-vector-read!", 1, 3, 0, - (SCM uvec, SCM port_or_fd, SCM start, SCM end), - "Fill the elements of @var{uvec} by reading\n" - "raw bytes from @var{port-or-fdes}, using host byte order.\n\n" - "The optional arguments @var{start} (inclusive) and @var{end}\n" - "(exclusive) allow a specified region to be read,\n" - "leaving the remainder of the vector unchanged.\n\n" - "When @var{port-or-fdes} is a port, all specified elements\n" - "of @var{uvec} are attempted to be read, potentially blocking\n" - "while waiting for more input or end-of-file.\n" - "When @var{port-or-fd} is an integer, a single call to\n" - "read(2) is made.\n\n" - "An error is signalled when the last element has only\n" - "been partially filled before reaching end-of-file or in\n" - "the single call to read(2).\n\n" - "@code{uniform-vector-read!} returns the number of elements\n" - "read.\n\n" - "@var{port-or-fdes} may be omitted, in which case it defaults\n" - "to the value returned by @code{(current-input-port)}.") -#define FUNC_NAME s_scm_uniform_vector_read_x -{ - SCM result; - size_t c_width, c_start, c_end; - - SCM_VALIDATE_BYTEVECTOR (SCM_ARG1, uvec); - - scm_c_issue_deprecation_warning - ("`uniform-vector-read!' is deprecated. Use `get-bytevector-n!' from\n" - "`(rnrs io ports)' instead."); - - if (SCM_UNBNDP (port_or_fd)) - port_or_fd = scm_current_input_port (); - - c_width = scm_to_size_t (scm_uniform_vector_element_size (uvec)); - - c_start = SCM_UNBNDP (start) ? 0 : scm_to_size_t (start); - c_start *= c_width; - - c_end = SCM_UNBNDP (end) ? SCM_BYTEVECTOR_LENGTH (uvec) : scm_to_size_t (end); - c_end *= c_width; - - result = scm_get_bytevector_n_x (port_or_fd, uvec, - scm_from_size_t (c_start), - scm_from_size_t (c_end - c_start)); - - if (SCM_EOF_OBJECT_P (result)) - result = SCM_INUM0; - - return result; -} -#undef FUNC_NAME - -SCM_DEFINE (scm_uniform_vector_write, "uniform-vector-write", 1, 3, 0, - (SCM uvec, SCM port_or_fd, SCM start, SCM end), - "Write the elements of @var{uvec} as raw bytes to\n" - "@var{port-or-fdes}, in the host byte order.\n\n" - "The optional arguments @var{start} (inclusive)\n" - "and @var{end} (exclusive) allow\n" - "a specified region to be written.\n\n" - "When @var{port-or-fdes} is a port, all specified elements\n" - "of @var{uvec} are attempted to be written, potentially blocking\n" - "while waiting for more room.\n" - "When @var{port-or-fd} is an integer, a single call to\n" - "write(2) is made.\n\n" - "An error is signalled when the last element has only\n" - "been partially written in the single call to write(2).\n\n" - "The number of objects actually written is returned.\n" - "@var{port-or-fdes} may be\n" - "omitted, in which case it defaults to the value returned by\n" - "@code{(current-output-port)}.") -#define FUNC_NAME s_scm_uniform_vector_write -{ - size_t c_width, c_start, c_end; - - SCM_VALIDATE_BYTEVECTOR (SCM_ARG1, uvec); - - scm_c_issue_deprecation_warning - ("`uniform-vector-write' is deprecated. Use `put-bytevector' from\n" - "`(rnrs io ports)' instead."); - - if (SCM_UNBNDP (port_or_fd)) - port_or_fd = scm_current_output_port (); - - port_or_fd = SCM_COERCE_OUTPORT (port_or_fd); - - c_width = scm_to_size_t (scm_uniform_vector_element_size (uvec)); - - c_start = SCM_UNBNDP (start) ? 0 : scm_to_size_t (start); - c_start *= c_width; - - c_end = SCM_UNBNDP (end) ? SCM_BYTEVECTOR_LENGTH (uvec) : scm_to_size_t (end); - c_end *= c_width; - - return scm_put_bytevector (port_or_fd, uvec, - scm_from_size_t (c_start), - scm_from_size_t (c_end - c_start)); -} -#undef FUNC_NAME - -static SCM -scm_ra2contig (SCM ra, int copy) -{ - SCM ret; - long inc = 1; - size_t k, len = 1; - for (k = SCM_I_ARRAY_NDIM (ra); k--;) - len *= SCM_I_ARRAY_DIMS (ra)[k].ubnd - SCM_I_ARRAY_DIMS (ra)[k].lbnd + 1; - k = SCM_I_ARRAY_NDIM (ra); - if (SCM_I_ARRAY_CONTP (ra) && ((0 == k) || (1 == SCM_I_ARRAY_DIMS (ra)[k - 1].inc))) - { - if (!scm_is_bitvector (SCM_I_ARRAY_V (ra))) - return ra; - if ((len == scm_c_bitvector_length (SCM_I_ARRAY_V (ra)) && - 0 == SCM_I_ARRAY_BASE (ra) % SCM_LONG_BIT && - 0 == len % SCM_LONG_BIT)) - return ra; - } - ret = scm_i_make_array (k); - SCM_I_ARRAY_BASE (ret) = 0; - while (k--) - { - SCM_I_ARRAY_DIMS (ret)[k].lbnd = SCM_I_ARRAY_DIMS (ra)[k].lbnd; - SCM_I_ARRAY_DIMS (ret)[k].ubnd = SCM_I_ARRAY_DIMS (ra)[k].ubnd; - SCM_I_ARRAY_DIMS (ret)[k].inc = inc; - inc *= SCM_I_ARRAY_DIMS (ra)[k].ubnd - SCM_I_ARRAY_DIMS (ra)[k].lbnd + 1; - } - SCM_I_ARRAY_V (ret) = - scm_make_generalized_vector (scm_array_type (ra), scm_from_size_t (inc), - SCM_UNDEFINED); - if (copy) - scm_array_copy_x (ra, ret); - return ret; -} - -SCM_DEFINE (scm_uniform_array_read_x, "uniform-array-read!", 1, 3, 0, - (SCM ura, SCM port_or_fd, SCM start, SCM end), - "@deffnx {Scheme Procedure} uniform-vector-read! uve [port-or-fdes] [start] [end]\n" - "Attempt to read all elements of @var{ura}, in lexicographic order, as\n" - "binary objects from @var{port-or-fdes}.\n" - "If an end of file is encountered,\n" - "the objects up to that point are put into @var{ura}\n" - "(starting at the beginning) and the remainder of the array is\n" - "unchanged.\n\n" - "The optional arguments @var{start} and @var{end} allow\n" - "a specified region of a vector (or linearized array) to be read,\n" - "leaving the remainder of the vector unchanged.\n\n" - "@code{uniform-array-read!} returns the number of objects read.\n" - "@var{port-or-fdes} may be omitted, in which case it defaults to the value\n" - "returned by @code{(current-input-port)}.") -#define FUNC_NAME s_scm_uniform_array_read_x -{ - if (SCM_UNBNDP (port_or_fd)) - port_or_fd = scm_current_input_port (); - - if (scm_is_uniform_vector (ura)) - { - return scm_uniform_vector_read_x (ura, port_or_fd, start, end); - } - else if (SCM_I_ARRAYP (ura)) - { - size_t base, vlen, cstart, cend; - SCM cra, ans; - - cra = scm_ra2contig (ura, 0); - base = SCM_I_ARRAY_BASE (cra); - vlen = SCM_I_ARRAY_DIMS (cra)->inc * - (SCM_I_ARRAY_DIMS (cra)->ubnd - SCM_I_ARRAY_DIMS (cra)->lbnd + 1); - - cstart = 0; - cend = vlen; - if (!SCM_UNBNDP (start)) - { - cstart = scm_to_unsigned_integer (start, 0, vlen); - if (!SCM_UNBNDP (end)) - cend = scm_to_unsigned_integer (end, cstart, vlen); - } - - ans = scm_uniform_vector_read_x (SCM_I_ARRAY_V (cra), port_or_fd, - scm_from_size_t (base + cstart), - scm_from_size_t (base + cend)); - - if (!scm_is_eq (cra, ura)) - scm_array_copy_x (cra, ura); - return ans; - } - else - scm_wrong_type_arg_msg (NULL, 0, ura, "array"); -} -#undef FUNC_NAME - -SCM_DEFINE (scm_uniform_array_write, "uniform-array-write", 1, 3, 0, - (SCM ura, SCM port_or_fd, SCM start, SCM end), - "Writes all elements of @var{ura} as binary objects to\n" - "@var{port-or-fdes}.\n\n" - "The optional arguments @var{start}\n" - "and @var{end} allow\n" - "a specified region of a vector (or linearized array) to be written.\n\n" - "The number of objects actually written is returned.\n" - "@var{port-or-fdes} may be\n" - "omitted, in which case it defaults to the value returned by\n" - "@code{(current-output-port)}.") -#define FUNC_NAME s_scm_uniform_array_write -{ - if (SCM_UNBNDP (port_or_fd)) - port_or_fd = scm_current_output_port (); - - if (scm_is_uniform_vector (ura)) - { - return scm_uniform_vector_write (ura, port_or_fd, start, end); - } - else if (SCM_I_ARRAYP (ura)) - { - size_t base, vlen, cstart, cend; - SCM cra, ans; - - cra = scm_ra2contig (ura, 1); - base = SCM_I_ARRAY_BASE (cra); - vlen = SCM_I_ARRAY_DIMS (cra)->inc * - (SCM_I_ARRAY_DIMS (cra)->ubnd - SCM_I_ARRAY_DIMS (cra)->lbnd + 1); - - cstart = 0; - cend = vlen; - if (!SCM_UNBNDP (start)) - { - cstart = scm_to_unsigned_integer (start, 0, vlen); - if (!SCM_UNBNDP (end)) - cend = scm_to_unsigned_integer (end, cstart, vlen); - } - - ans = scm_uniform_vector_write (SCM_I_ARRAY_V (cra), port_or_fd, - scm_from_size_t (base + cstart), - scm_from_size_t (base + cend)); - - return ans; - } - else - scm_wrong_type_arg_msg (NULL, 0, ura, "array"); -} -#undef FUNC_NAME - -SCM -scm_i_cur_inp (void) -{ - scm_c_issue_deprecation_warning - ("scm_cur_inp is deprecated. Use scm_current_input_port instead."); - return scm_current_input_port (); -} - -SCM -scm_i_cur_outp (void) -{ - scm_c_issue_deprecation_warning - ("scm_cur_outp is deprecated. Use scm_current_output_port instead."); - return scm_current_output_port (); -} - -SCM -scm_i_cur_errp (void) -{ - scm_c_issue_deprecation_warning - ("scm_cur_errp is deprecated. Use scm_current_error_port instead."); - return scm_current_error_port (); -} - -SCM -scm_i_cur_loadp (void) -{ - scm_c_issue_deprecation_warning - ("scm_cur_loadp is deprecated. Use scm_current_load_port instead."); - return scm_current_load_port (); -} - -SCM -scm_i_progargs (void) -{ - scm_c_issue_deprecation_warning - ("scm_progargs is deprecated. Use scm_program_arguments instead."); - return scm_program_arguments (); -} - -SCM -scm_i_deprecated_dynwinds (void) -{ - scm_c_issue_deprecation_warning - ("scm_dynwinds is deprecated. Do not use it."); - return scm_i_dynwinds (); -} - -SCM_STACKITEM * -scm_i_stack_base (void) -{ - scm_c_issue_deprecation_warning - ("scm_stack_base is deprecated. Do not use it."); - return SCM_I_CURRENT_THREAD->base; -} - -int -scm_i_fluidp (SCM x) -{ - scm_c_issue_deprecation_warning - ("SCM_FLUIDP is deprecated. Use scm_is_fluid instead."); - return scm_is_fluid (x); -} - - -/* Networking. */ - -#ifdef HAVE_NETWORKING - -SCM_DEFINE (scm_inet_aton, "inet-aton", 1, 0, 0, - (SCM address), - "Convert an IPv4 Internet address from printable string\n" - "(dotted decimal notation) to an integer. E.g.,\n\n" - "@lisp\n" - "(inet-aton \"127.0.0.1\") @result{} 2130706433\n" - "@end lisp") -#define FUNC_NAME s_scm_inet_aton -{ - scm_c_issue_deprecation_warning - ("`inet-aton' is deprecated. Use `inet-pton' instead."); - - return scm_inet_pton (scm_from_int (AF_INET), address); -} -#undef FUNC_NAME - - -SCM_DEFINE (scm_inet_ntoa, "inet-ntoa", 1, 0, 0, - (SCM inetid), - "Convert an IPv4 Internet address to a printable\n" - "(dotted decimal notation) string. E.g.,\n\n" - "@lisp\n" - "(inet-ntoa 2130706433) @result{} \"127.0.0.1\"\n" - "@end lisp") -#define FUNC_NAME s_scm_inet_ntoa -{ - scm_c_issue_deprecation_warning - ("`inet-ntoa' is deprecated. Use `inet-ntop' instead."); - - return scm_inet_ntop (scm_from_int (AF_INET), inetid); -} -#undef FUNC_NAME - -#endif /* HAVE_NETWORKING */ - - -void -scm_i_defer_ints_etc () -{ - scm_c_issue_deprecation_warning - ("SCM_DEFER_INTS etc are deprecated. " - "Use a mutex instead if appropriate."); -} - -int -scm_i_mask_ints (void) -{ - scm_c_issue_deprecation_warning ("`scm_mask_ints' is deprecated."); - return (SCM_I_CURRENT_THREAD->block_asyncs != 0); -} - - -SCM -scm_guard (SCM guardian, SCM obj, int throw_p) -{ - scm_c_issue_deprecation_warning - ("scm_guard is deprecated. Use scm_call_1 instead."); - - return scm_call_1 (guardian, obj); -} - -SCM -scm_get_one_zombie (SCM guardian) -{ - scm_c_issue_deprecation_warning - ("scm_guard is deprecated. Use scm_call_0 instead."); - - return scm_call_0 (guardian); -} - -SCM_DEFINE (scm_guardian_destroyed_p, "guardian-destroyed?", 1, 0, 0, - (SCM guardian), - "Return @code{#t} if @var{guardian} has been destroyed, otherwise @code{#f}.") -#define FUNC_NAME s_scm_guardian_destroyed_p -{ - scm_c_issue_deprecation_warning - ("'guardian-destroyed?' is deprecated."); - return SCM_BOOL_F; -} -#undef FUNC_NAME - -SCM_DEFINE (scm_guardian_greedy_p, "guardian-greedy?", 1, 0, 0, - (SCM guardian), - "Return @code{#t} if @var{guardian} is a greedy guardian, otherwise @code{#f}.") -#define FUNC_NAME s_scm_guardian_greedy_p -{ - scm_c_issue_deprecation_warning - ("'guardian-greedy?' is deprecated."); - return SCM_BOOL_F; -} -#undef FUNC_NAME - -SCM_DEFINE (scm_destroy_guardian_x, "destroy-guardian!", 1, 0, 0, - (SCM guardian), - "Destroys @var{guardian}, by making it impossible to put any more\n" - "objects in it or get any objects from it. It also unguards any\n" - "objects guarded by @var{guardian}.") -#define FUNC_NAME s_scm_destroy_guardian_x -{ - scm_c_issue_deprecation_warning - ("'destroy-guardian!' is deprecated and ineffective."); - return SCM_UNSPECIFIED; -} -#undef FUNC_NAME - - -/* GC-related things. */ - -unsigned long scm_mallocated, scm_mtrigger; -size_t scm_max_segment_size; - -#if defined (GUILE_DEBUG) || defined (GUILE_DEBUG_FREELIST) -SCM -scm_map_free_list (void) -{ - return SCM_EOL; -} -#endif - -#if defined (GUILE_DEBUG_FREELIST) -SCM -scm_gc_set_debug_check_freelist_x (SCM flag) -{ - return SCM_UNSPECIFIED; -} -#endif - - -/* Trampolines - * - * Trampolines were an intent to speed up calling the same Scheme procedure many - * times from C. - * - * However, this was the wrong thing to optimize; if you really know what you're - * calling, call its function directly, otherwise you're in Scheme-land, and we - * have many better tricks there (inlining, for example, which can remove the - * need for closures and free variables). - * - * Also, in the normal debugging case, trampolines were being computed but not - * used. Silliness. - */ - -scm_t_trampoline_0 -scm_trampoline_0 (SCM proc) -{ - scm_c_issue_deprecation_warning - ("`scm_trampoline_0' is deprecated. Just use `scm_call_0' instead."); - return scm_call_0; -} - -scm_t_trampoline_1 -scm_trampoline_1 (SCM proc) -{ - scm_c_issue_deprecation_warning - ("`scm_trampoline_1' is deprecated. Just use `scm_call_1' instead."); - return scm_call_1; -} - -scm_t_trampoline_2 -scm_trampoline_2 (SCM proc) -{ - scm_c_issue_deprecation_warning - ("`scm_trampoline_2' is deprecated. Just use `scm_call_2' instead."); - return scm_call_2; -} - -int -scm_i_subr_p (SCM x) -{ - scm_c_issue_deprecation_warning ("`scm_subr_p' is deprecated. Use SCM_PRIMITIVE_P instead."); - return SCM_PRIMITIVE_P (x); -} - - - -SCM -scm_internal_lazy_catch (SCM tag, scm_t_catch_body body, void *body_data, scm_t_catch_handler handler, void *handler_data) -{ - scm_c_issue_deprecation_warning - ("`scm_internal_lazy_catch' is no longer supported. Instead this call will\n" - "dispatch to `scm_c_with_throw_handler'. Your handler will be invoked from\n" - "within the dynamic context of the corresponding `throw'.\n" - "\nTHIS COULD CHANGE YOUR PROGRAM'S BEHAVIOR.\n\n" - "Please modify your program to use `scm_c_with_throw_handler' directly,\n" - "and adapt it (if necessary) to expect to be within the dynamic context\n" - "of the throw."); - return scm_c_with_throw_handler (tag, body, body_data, handler, handler_data, 0); -} - -SCM_DEFINE (scm_lazy_catch, "lazy-catch", 3, 0, 0, - (SCM key, SCM thunk, SCM handler), - "This behaves exactly like @code{catch}, except that it does\n" - "not unwind the stack before invoking @var{handler}.\n" - "If the @var{handler} procedure returns normally, Guile\n" - "rethrows the same exception again to the next innermost catch,\n" - "lazy-catch or throw handler. If the @var{handler} exits\n" - "non-locally, that exit determines the continuation.") -#define FUNC_NAME s_scm_lazy_catch -{ - struct scm_body_thunk_data c; - - SCM_ASSERT (scm_is_symbol (key) || scm_is_eq (key, SCM_BOOL_T), - key, SCM_ARG1, FUNC_NAME); - - c.tag = key; - c.body_proc = thunk; - - scm_c_issue_deprecation_warning - ("`lazy-catch' is no longer supported. Instead this call will dispatch\n" - "to `with-throw-handler'. Your handler will be invoked from within the\n" - "dynamic context of the corresponding `throw'.\n" - "\nTHIS COULD CHANGE YOUR PROGRAM'S BEHAVIOR.\n\n" - "Please modify your program to use `with-throw-handler' directly, and\n" - "adapt it (if necessary) to expect to be within the dynamic context of\n" - "the throw."); - - return scm_c_with_throw_handler (key, - scm_body_thunk, &c, - scm_handle_by_proc, &handler, 0); -} -#undef FUNC_NAME - - - - - -SCM -scm_raequal (SCM ra0, SCM ra1) -{ - return scm_array_equal_p (ra0, ra1); -} - - - - - -SCM_DEFINE (scm_dynamic_args_call, "dynamic-args-call", 3, 0, 0, - (SCM func, SCM dobj, SCM args), - "Call the C function indicated by @var{func} and @var{dobj},\n" - "just like @code{dynamic-call}, but pass it some arguments and\n" - "return its return value. The C function is expected to take\n" - "two arguments and return an @code{int}, just like @code{main}:\n" - "@smallexample\n" - "int c_func (int argc, char **argv);\n" - "@end smallexample\n\n" - "The parameter @var{args} must be a list of strings and is\n" - "converted into an array of @code{char *}. The array is passed\n" - "in @var{argv} and its size in @var{argc}. The return value is\n" - "converted to a Scheme number and returned from the call to\n" - "@code{dynamic-args-call}.") -#define FUNC_NAME s_scm_dynamic_args_call -{ - int (*fptr) (int argc, char **argv); - int result, argc; - char **argv; - - if (scm_is_string (func)) - { -#if HAVE_MODULES - func = scm_dynamic_func (func, dobj); -#else - scm_misc_error ("dynamic-args-call", - "dynamic-func not available to resolve ~S", - scm_list_1 (func)); -#endif - } - SCM_VALIDATE_POINTER (SCM_ARG1, func); - - fptr = SCM_POINTER_VALUE (func); - - argv = scm_i_allocate_string_pointers (args); - for (argc = 0; argv[argc]; argc++) - ; - result = (*fptr) (argc, argv); - - return scm_from_int (result); -} -#undef FUNC_NAME - - - - - -int -scm_badargsp (SCM formals, SCM args) -{ - scm_c_issue_deprecation_warning - ("`scm_badargsp' is deprecated. Copy it into your project if you need it."); - - while (!scm_is_null (formals)) - { - if (!scm_is_pair (formals)) - return 0; - if (scm_is_null (args)) - return 1; - formals = scm_cdr (formals); - args = scm_cdr (args); - } - return !scm_is_null (args) ? 1 : 0; -} - - - -/* scm_internal_stack_catch - Use this one if you want debugging information to be stored in - the-last-stack on error. */ - -static SCM -ss_handler (void *data SCM_UNUSED, SCM tag, SCM throw_args) -{ - /* In the stack */ - scm_fluid_set_x (scm_variable_ref - (scm_c_module_lookup - (scm_c_resolve_module ("ice-9 save-stack"), - "the-last-stack")), - scm_make_stack (SCM_BOOL_T, SCM_EOL)); - /* Throw the error */ - return scm_throw (tag, throw_args); -} - -struct cwss_data -{ - SCM tag; - scm_t_catch_body body; - void *data; -}; - -static SCM -cwss_body (void *data) -{ - struct cwss_data *d = data; - return scm_c_with_throw_handler (d->tag, d->body, d->data, ss_handler, NULL, 0); -} - -SCM -scm_internal_stack_catch (SCM tag, - scm_t_catch_body body, - void *body_data, - scm_t_catch_handler handler, - void *handler_data) -{ - struct cwss_data d; - d.tag = tag; - d.body = body; - d.data = body_data; - scm_c_issue_deprecation_warning - ("`scm_internal_stack_catch' is deprecated. Talk to guile-devel if you see this message."); - return scm_internal_catch (tag, cwss_body, &d, handler, handler_data); -} - - - -SCM -scm_short2num (short x) -{ - scm_c_issue_deprecation_warning - ("`scm_short2num' is deprecated. Use scm_from_short instead."); - return scm_from_short (x); -} - -SCM -scm_ushort2num (unsigned short x) -{ - scm_c_issue_deprecation_warning - ("`scm_ushort2num' is deprecated. Use scm_from_ushort instead."); - return scm_from_ushort (x); -} - -SCM -scm_int2num (int x) -{ - scm_c_issue_deprecation_warning - ("`scm_int2num' is deprecated. Use scm_from_int instead."); - return scm_from_int (x); -} - -SCM -scm_uint2num (unsigned int x) -{ - scm_c_issue_deprecation_warning - ("`scm_uint2num' is deprecated. Use scm_from_uint instead."); - return scm_from_uint (x); -} - -SCM -scm_long2num (long x) -{ - scm_c_issue_deprecation_warning - ("`scm_long2num' is deprecated. Use scm_from_long instead."); - return scm_from_long (x); -} - -SCM -scm_ulong2num (unsigned long x) -{ - scm_c_issue_deprecation_warning - ("`scm_ulong2num' is deprecated. Use scm_from_ulong instead."); - return scm_from_ulong (x); -} - -SCM -scm_size2num (size_t x) -{ - scm_c_issue_deprecation_warning - ("`scm_size2num' is deprecated. Use scm_from_size_t instead."); - return scm_from_size_t (x); -} - -SCM -scm_ptrdiff2num (ptrdiff_t x) -{ - scm_c_issue_deprecation_warning - ("`scm_ptrdiff2num' is deprecated. Use scm_from_ssize_t instead."); - return scm_from_ssize_t (x); -} - -short -scm_num2short (SCM x, unsigned long pos, const char *s_caller) -{ - scm_c_issue_deprecation_warning - ("`scm_num2short' is deprecated. Use scm_to_short instead."); - return scm_to_short (x); -} - -unsigned short -scm_num2ushort (SCM x, unsigned long pos, const char *s_caller) -{ - scm_c_issue_deprecation_warning - ("`scm_num2ushort' is deprecated. Use scm_to_ushort instead."); - return scm_to_ushort (x); -} - -int -scm_num2int (SCM x, unsigned long pos, const char *s_caller) -{ - scm_c_issue_deprecation_warning - ("`scm_num2int' is deprecated. Use scm_to_int instead."); - return scm_to_int (x); -} - -unsigned int -scm_num2uint (SCM x, unsigned long pos, const char *s_caller) -{ - scm_c_issue_deprecation_warning - ("`scm_num2uint' is deprecated. Use scm_to_uint instead."); - return scm_to_uint (x); -} - -long -scm_num2long (SCM x, unsigned long pos, const char *s_caller) -{ - scm_c_issue_deprecation_warning - ("`scm_num2long' is deprecated. Use scm_to_long instead."); - return scm_to_long (x); -} - -unsigned long -scm_num2ulong (SCM x, unsigned long pos, const char *s_caller) -{ - scm_c_issue_deprecation_warning - ("`scm_num2ulong' is deprecated. Use scm_to_ulong instead."); - return scm_to_ulong (x); -} - -size_t -scm_num2size (SCM x, unsigned long pos, const char *s_caller) -{ - scm_c_issue_deprecation_warning - ("`scm_num2size' is deprecated. Use scm_to_size_t instead."); - return scm_to_size_t (x); -} - -ptrdiff_t -scm_num2ptrdiff (SCM x, unsigned long pos, const char *s_caller) -{ - scm_c_issue_deprecation_warning - ("`scm_num2ptrdiff' is deprecated. Use scm_to_ssize_t instead."); - return scm_to_ssize_t (x); -} - -#if SCM_SIZEOF_LONG_LONG != 0 - -SCM -scm_long_long2num (long long x) -{ - scm_c_issue_deprecation_warning - ("`scm_long_long2num' is deprecated. Use scm_from_long_long instead."); - return scm_from_long_long (x); -} - -SCM -scm_ulong_long2num (unsigned long long x) -{ - scm_c_issue_deprecation_warning - ("`scm_ulong_long2num' is deprecated. Use scm_from_ulong_long instead."); - return scm_from_ulong_long (x); -} - -long long -scm_num2long_long (SCM x, unsigned long pos, const char *s_caller) -{ - scm_c_issue_deprecation_warning - ("`scm_num2long_long' is deprecated. Use scm_to_long_long instead."); - return scm_to_long_long (x); -} - -unsigned long long -scm_num2ulong_long (SCM x, unsigned long pos, const char *s_caller) -{ - scm_c_issue_deprecation_warning - ("`scm_num2ulong_long' is deprecated. Use scm_from_ulong_long instead."); - return scm_to_ulong_long (x); -} - -#endif - -SCM -scm_make_real (double x) -{ - scm_c_issue_deprecation_warning - ("`scm_make_real' is deprecated. Use scm_from_double instead."); - return scm_from_double (x); -} - -double -scm_num2dbl (SCM a, const char *why) -{ - scm_c_issue_deprecation_warning - ("`scm_num2dbl' is deprecated. Use scm_to_double instead."); - return scm_to_double (a); -} - -SCM -scm_float2num (float n) -{ - scm_c_issue_deprecation_warning - ("`scm_float2num' is deprecated. Use scm_from_double instead."); - return scm_from_double ((double) n); -} - -SCM -scm_double2num (double n) -{ - scm_c_issue_deprecation_warning - ("`scm_double2num' is deprecated. Use scm_from_double instead."); - return scm_from_double (n); -} - -SCM -scm_make_complex (double x, double y) -{ - scm_c_issue_deprecation_warning - ("`scm_make_complex' is deprecated. Use scm_c_make_rectangular instead."); - return scm_c_make_rectangular (x, y); -} - -SCM -scm_mem2symbol (const char *mem, size_t len) -{ - scm_c_issue_deprecation_warning - ("`scm_mem2symbol' is deprecated. Use scm_from_locale_symboln instead."); - return scm_from_locale_symboln (mem, len); -} - -SCM -scm_mem2uninterned_symbol (const char *mem, size_t len) -{ - scm_c_issue_deprecation_warning - ("`scm_mem2uninterned_symbol' is deprecated. " - "Use scm_make_symbol and scm_from_locale_symboln instead."); - return scm_make_symbol (scm_from_locale_stringn (mem, len)); -} - -SCM -scm_str2symbol (const char *str) -{ - scm_c_issue_deprecation_warning - ("`scm_str2symbol' is deprecated. Use scm_from_locale_symbol instead."); - return scm_from_locale_symbol (str); -} - - -/* This function must only be applied to memory obtained via malloc, - since the GC is going to apply `free' to it when the string is - dropped. - - Also, s[len] must be `\0', since we promise that strings are - null-terminated. Perhaps we could handle non-null-terminated - strings by claiming they're shared substrings of a string we just - made up. */ -SCM -scm_take_str (char *s, size_t len) -{ - scm_c_issue_deprecation_warning - ("`scm_take_str' is deprecated. Use scm_take_locale_stringn instead."); - return scm_take_locale_stringn (s, len); -} - -/* `s' must be a malloc'd string. See scm_take_str. */ -SCM -scm_take0str (char *s) -{ - scm_c_issue_deprecation_warning - ("`scm_take0str' is deprecated. Use scm_take_locale_string instead."); - return scm_take_locale_string (s); -} - -SCM -scm_mem2string (const char *src, size_t len) -{ - scm_c_issue_deprecation_warning - ("`scm_mem2string' is deprecated. Use scm_from_locale_stringn instead."); - return scm_from_locale_stringn (src, len); -} - -SCM -scm_str2string (const char *src) -{ - scm_c_issue_deprecation_warning - ("`scm_str2string' is deprecated. Use scm_from_locale_string instead."); - return scm_from_locale_string (src); -} - -SCM -scm_makfrom0str (const char *src) -{ - scm_c_issue_deprecation_warning - ("`scm_makfrom0str' is deprecated." - "Use scm_from_locale_string instead, but check for NULL first."); - if (!src) return SCM_BOOL_F; - return scm_from_locale_string (src); -} - -SCM -scm_makfrom0str_opt (const char *src) -{ - scm_c_issue_deprecation_warning - ("`scm_makfrom0str_opt' is deprecated." - "Use scm_from_locale_string instead, but check for NULL first."); - return scm_makfrom0str (src); -} - - -SCM -scm_allocate_string (size_t len) -{ - scm_c_issue_deprecation_warning - ("`scm_allocate_string' is deprecated. Use scm_c_make_string instead."); - return scm_i_make_string (len, NULL, 0); -} - -SCM_DEFINE (scm_make_keyword_from_dash_symbol, "make-keyword-from-dash-symbol", 1, 0, 0, - (SCM symbol), - "Make a keyword object from a @var{symbol} that starts with a dash.") -#define FUNC_NAME s_scm_make_keyword_from_dash_symbol -{ - SCM dash_string, non_dash_symbol; - - scm_c_issue_deprecation_warning - ("`scm_make_keyword_from_dash_symbol' is deprecated. Don't use dash symbols."); - - SCM_ASSERT (scm_is_symbol (symbol) - && (scm_i_symbol_ref (symbol, 0) == '-'), - symbol, SCM_ARG1, FUNC_NAME); - - dash_string = scm_symbol_to_string (symbol); - non_dash_symbol = - scm_string_to_symbol (scm_c_substring (dash_string, - 1, - scm_c_string_length (dash_string))); - - return scm_symbol_to_keyword (non_dash_symbol); -} -#undef FUNC_NAME - -SCM_DEFINE (scm_keyword_dash_symbol, "keyword-dash-symbol", 1, 0, 0, - (SCM keyword), - "Return the dash symbol for @var{keyword}.\n" - "This is the inverse of @code{make-keyword-from-dash-symbol}.") -#define FUNC_NAME s_scm_keyword_dash_symbol -{ - SCM symbol = scm_keyword_to_symbol (keyword); - SCM parts = scm_list_2 (scm_from_locale_string ("-"), - scm_symbol_to_string (symbol)); - scm_c_issue_deprecation_warning - ("`scm_keyword_dash_symbol' is deprecated. Don't use dash symbols."); - - return scm_string_to_symbol (scm_string_append (parts)); -} -#undef FUNC_NAME - -SCM -scm_c_make_keyword (const char *s) -{ - scm_c_issue_deprecation_warning - ("`scm_c_make_keyword' is deprecated. Use scm_from_locale_keyword instead."); - return scm_from_locale_keyword (s); -} - -unsigned int -scm_thread_sleep (unsigned int t) -{ - scm_c_issue_deprecation_warning - ("`scm_thread_sleep' is deprecated. Use scm_std_sleep instead."); - return scm_std_sleep (t); -} - -unsigned long -scm_thread_usleep (unsigned long t) -{ - scm_c_issue_deprecation_warning - ("`scm_thread_usleep' is deprecated. Use scm_std_usleep instead."); - return scm_std_usleep (t); -} - -int scm_internal_select (int fds, - SELECT_TYPE *rfds, - SELECT_TYPE *wfds, - SELECT_TYPE *efds, - struct timeval *timeout) -{ - scm_c_issue_deprecation_warning - ("`scm_internal_select' is deprecated. Use scm_std_select instead."); - return scm_std_select (fds, rfds, wfds, efds, timeout); -} - - - -#ifdef HAVE_CUSERID - -# if !HAVE_DECL_CUSERID -extern char *cuserid (char *); -# endif - -SCM_DEFINE (scm_cuserid, "cuserid", 0, 0, 0, - (void), - "Return a string containing a user name associated with the\n" - "effective user id of the process. Return @code{#f} if this\n" - "information cannot be obtained.") -#define FUNC_NAME s_scm_cuserid -{ - char buf[L_cuserid]; - char * p; - - scm_c_issue_deprecation_warning - ("`cuserid' is deprecated. Use `(passwd:name (getpwuid (geteuid)))' instead."); - - p = cuserid (buf); - if (!p || !*p) - return SCM_BOOL_F; - return scm_from_locale_string (p); -} -#undef FUNC_NAME -#endif /* HAVE_CUSERID */ - - - -/* {Properties} - */ - -static SCM properties_whash; - -SCM_DEFINE (scm_primitive_make_property, "primitive-make-property", 1, 0, 0, - (SCM not_found_proc), - "Create a @dfn{property token} that can be used with\n" - "@code{primitive-property-ref} and @code{primitive-property-set!}.\n" - "See @code{primitive-property-ref} for the significance of\n" - "@var{not_found_proc}.") -#define FUNC_NAME s_scm_primitive_make_property -{ - scm_c_issue_deprecation_warning - ("`primitive-make-property' is deprecated. Use object properties."); - - if (!scm_is_false (not_found_proc)) - SCM_VALIDATE_PROC (SCM_ARG1, not_found_proc); - return scm_cons (not_found_proc, SCM_EOL); -} -#undef FUNC_NAME - - -SCM_DEFINE (scm_primitive_property_ref, "primitive-property-ref", 2, 0, 0, - (SCM prop, SCM obj), - "Return the property @var{prop} of @var{obj}.\n" - "\n" - "When no value has yet been associated with @var{prop} and\n" - "@var{obj}, the @var{not-found-proc} from @var{prop} is used. A\n" - "call @code{(@var{not-found-proc} @var{prop} @var{obj})} is made\n" - "and the result set as the property value. If\n" - "@var{not-found-proc} is @code{#f} then @code{#f} is the\n" - "property value.") -#define FUNC_NAME s_scm_primitive_property_ref -{ - SCM alist; - - scm_c_issue_deprecation_warning - ("`primitive-property-ref' is deprecated. Use object properties."); - - SCM_VALIDATE_CONS (SCM_ARG1, prop); - - alist = scm_hashq_ref (properties_whash, obj, SCM_EOL); - if (scm_is_pair (alist)) - { - SCM assoc = scm_assq (prop, alist); - if (scm_is_true (assoc)) - return SCM_CDR (assoc); - } - - if (scm_is_false (SCM_CAR (prop))) - return SCM_BOOL_F; - else - { - SCM val = scm_call_2 (SCM_CAR (prop), prop, obj); - scm_hashq_set_x (properties_whash, obj, - scm_acons (prop, val, alist)); - return val; - } -} -#undef FUNC_NAME - - -SCM_DEFINE (scm_primitive_property_set_x, "primitive-property-set!", 3, 0, 0, - (SCM prop, SCM obj, SCM val), - "Set the property @var{prop} of @var{obj} to @var{val}.") -#define FUNC_NAME s_scm_primitive_property_set_x -{ - SCM alist, assoc; - - scm_c_issue_deprecation_warning - ("`primitive-property-set!' is deprecated. Use object properties."); - - SCM_VALIDATE_CONS (SCM_ARG1, prop); - alist = scm_hashq_ref (properties_whash, obj, SCM_EOL); - assoc = scm_assq (prop, alist); - if (scm_is_pair (assoc)) - SCM_SETCDR (assoc, val); - else - scm_hashq_set_x (properties_whash, obj, - scm_acons (prop, val, alist)); - return SCM_UNSPECIFIED; -} -#undef FUNC_NAME - - -SCM_DEFINE (scm_primitive_property_del_x, "primitive-property-del!", 2, 0, 0, - (SCM prop, SCM obj), - "Remove any value associated with @var{prop} and @var{obj}.") -#define FUNC_NAME s_scm_primitive_property_del_x -{ - SCM alist; - - scm_c_issue_deprecation_warning - ("`primitive-property-del!' is deprecated. Use object properties."); - - SCM_VALIDATE_CONS (SCM_ARG1, prop); - alist = scm_hashq_ref (properties_whash, obj, SCM_EOL); - if (scm_is_pair (alist)) - scm_hashq_set_x (properties_whash, obj, scm_assq_remove_x (alist, prop)); - return SCM_UNSPECIFIED; -} -#undef FUNC_NAME - - - -SCM -scm_whash_get_handle (SCM whash, SCM key) -{ - scm_c_issue_deprecation_warning - ("The `scm_whash' API is deprecated. Use the `scm_hashq' API instead."); - - return scm_hashq_get_handle (whash, key); -} - -int -SCM_WHASHFOUNDP (SCM h) -{ - scm_c_issue_deprecation_warning - ("The `scm_whash' API is deprecated. Use the `scm_hashq' API instead."); - - return scm_is_true (h); -} - -SCM -SCM_WHASHREF (SCM whash, SCM handle) -{ - scm_c_issue_deprecation_warning - ("The `scm_whash' API is deprecated. Use the `scm_hashq' API instead."); - - return SCM_CDR (handle); -} - -void -SCM_WHASHSET (SCM whash, SCM handle, SCM obj) -{ - scm_c_issue_deprecation_warning - ("The `scm_whash' API is deprecated. Use the `scm_hashq' API instead."); - - SCM_SETCDR (handle, obj); -} - -SCM -scm_whash_create_handle (SCM whash, SCM key) -{ - scm_c_issue_deprecation_warning - ("The `scm_whash' API is deprecated. Use the `scm_hashq' API instead."); - - return scm_hashq_create_handle_x (whash, key, SCM_UNSPECIFIED); -} - -SCM -scm_whash_lookup (SCM whash, SCM obj) -{ - scm_c_issue_deprecation_warning - ("The `scm_whash' API is deprecated. Use the `scm_hashq' API instead."); - - return scm_hashq_ref (whash, obj, SCM_BOOL_F); -} - -void -scm_whash_insert (SCM whash, SCM key, SCM obj) -{ - scm_c_issue_deprecation_warning - ("The `scm_whash' API is deprecated. Use the `scm_hashq' API instead."); - - scm_hashq_set_x (whash, key, obj); -} - - - -SCM scm_struct_table = SCM_BOOL_F; - -SCM -scm_struct_create_handle (SCM obj) -{ - scm_c_issue_deprecation_warning - ("`scm_struct_create_handle' is deprecated, and has no effect."); - - return scm_cons (obj, scm_cons (SCM_BOOL_F, SCM_BOOL_F)); -} - SCM @@ -2630,8 +81,6 @@ scm_immutable_double_cell (scm_t_bits car, scm_t_bits cbr, void scm_i_init_deprecated () { - properties_whash = scm_make_weak_key_hash_table (SCM_UNDEFINED); - scm_struct_table = scm_make_hash_table (SCM_UNDEFINED); #include "libguile/deprecated.x" } diff --git a/libguile/deprecated.h b/libguile/deprecated.h index 82415ea2e..d11667191 100644 --- a/libguile/deprecated.h +++ b/libguile/deprecated.h @@ -31,119 +31,6 @@ #if (SCM_ENABLE_DEPRECATED == 1) -/* From eval.h: Macros for handling ilocs. These were deprecated in guile - * 1.7.0 on 2004-04-22. */ -#define SCM_IFRINC (0x00000100L) -#define SCM_ICDR (0x00080000L) -#define SCM_IFRAME(n) ((long)((SCM_ICDR-SCM_IFRINC)>>8) \ - & (SCM_UNPACK (n) >> 8)) -#define SCM_IDIST(n) (SCM_UNPACK (n) >> 20) -#define SCM_ICDRP(n) (SCM_ICDR & SCM_UNPACK (n)) - - -/* From tags.h: Macros to access internal symbol names of isyms. Deprecated - * in guile 1.7.0 on 2004-04-22. */ -SCM_API char *scm_isymnames[]; -#define SCM_ISYMNUM(n) 0 -#define SCM_ISYMCHARS(n) "#@<deprecated>" - - -/* From tags.h: Macro checking for two tc16 types that are allocated to differ - * only in the 's'-bit. Deprecated in guile 1.7.0 on 2003-09-21. */ -#define SCM_TYP16S(x) (0xfeff & SCM_CELL_TYPE (x)) - - -/* From numbers.h: Macros checking for types, but avoiding a redundant check - * for !SCM_IMP. These were deprecated in guile 1.7.0 on 2003-09-06. */ -#define SCM_SLOPPY_INEXACTP(x) (SCM_TYP16S (x) == scm_tc16_real) -#define SCM_SLOPPY_REALP(x) (SCM_TYP16 (x) == scm_tc16_real) -#define SCM_SLOPPY_COMPLEXP(x) (SCM_TYP16 (x) == scm_tc16_complex) - - -/* From structs.h: - Deprecated in Guile 1.9.5 on 2009-11-03. */ -#define scm_vtable_index_vtable scm_vtable_index_self -#define scm_vtable_index_printer scm_vtable_index_instance_printer -#define scm_struct_i_free scm_vtable_index_instance_finalize -#define scm_struct_i_flags scm_vtable_index_flags -#define SCM_STRUCTF_MASK ((scm_t_bits)-1) -#define SCM_SET_VTABLE_DESTRUCTOR(X, D) (SCM_STRUCT_DATA(x)[scm_struct_i_free]=(scm_t_bits)(D)) - -#define scm_substring_move_left_x scm_substring_move_x -#define scm_substring_move_right_x scm_substring_move_x - -#define scm_sizet size_t - -SCM_DEPRECATED SCM scm_wta (SCM arg, const char *pos, const char *s_subr); - -#define SCM_WNA 8 -#define SCM_OUTOFRANGE 10 -#define SCM_NALLOC 11 - -SCM_DEPRECATED void scm_register_module_xxx (char *module_name, void *init_func); -SCM_DEPRECATED SCM scm_registered_modules (void); -SCM_DEPRECATED SCM scm_clear_registered_modules (void); - -SCM_DEPRECATED SCM scm_protect_object (SCM obj); -SCM_DEPRECATED SCM scm_unprotect_object (SCM obj); - -#define SCM_SETAND_CAR(x, y) \ - (SCM_SETCAR ((x), SCM_PACK (SCM_UNPACK (SCM_CAR (x)) & (y)))) -#define SCM_SETOR_CAR(x, y)\ - (SCM_SETCAR ((x), SCM_PACK (SCM_UNPACK (SCM_CAR (x)) | (y)))) -#define SCM_SETAND_CDR(x, y)\ - (SCM_SETCDR ((x), SCM_PACK (SCM_UNPACK (SCM_CDR (x)) & (y)))) -#define SCM_SETOR_CDR(x, y)\ - (SCM_SETCDR ((x), SCM_PACK (SCM_UNPACK (SCM_CDR (x)) | (y)))) -#define SCM_FREEP(x) (0) -#define SCM_NFREEP(x) (1) -#define SCM_GCTYP16(x) SCM_TYP16 (x) -#define SCM_GCCDR(x) SCM_CDR (x) -SCM_DEPRECATED void scm_remember (SCM * ptr); - -SCM_DEPRECATED SCM scm_make_module (SCM name); -SCM_DEPRECATED SCM scm_ensure_user_module (SCM name); -SCM_DEPRECATED SCM scm_load_scheme_module (SCM name); - -#define scm_port scm_t_port -#define scm_ptob_descriptor scm_t_ptob_descriptor -#define scm_port_rw_active scm_t_port_rw_active - -SCM_DEPRECATED SCM scm_close_all_ports_except (SCM ports); - -#define scm_rstate scm_t_rstate -#define scm_rng scm_t_rng - -#define SCM_SLOPPY_CONSP(x) ((1 & SCM_CELL_TYPE (x)) == 0) -#define SCM_SLOPPY_NCONSP(x) (!SCM_SLOPPY_CONSP(x)) - -#define scm_tc7_ssymbol scm_tc7_symbol -#define scm_tc7_msymbol scm_tc7_symbol -#define scm_tcs_symbols scm_tc7_symbol - -SCM_DEPRECATED SCM scm_makstr (size_t len, int); -SCM_DEPRECATED SCM scm_makfromstr (const char *src, size_t len, int); - -SCM_DEPRECATED SCM scm_variable_set_name_hint (SCM var, SCM hint); -SCM_DEPRECATED SCM scm_builtin_variable (SCM name); - -SCM_DEPRECATED SCM scm_internal_with_fluids (SCM fluids, SCM vals, - SCM (*cproc)(void *), - void *cdata); - -SCM_DEPRECATED SCM scm_make_gsubr (const char *name, - int req, int opt, int rst, - scm_t_subr fcn); -SCM_DEPRECATED SCM scm_make_gsubr_with_generic (const char *name, - int req, - int opt, - int rst, - scm_t_subr fcn, - SCM *gf); - -SCM_DEPRECATED SCM scm_create_hook (const char* name, int n_args); - - /* Deprecated 13-05-2011 because it's better just to scm_dynwind_begin. That also avoids the temptation to stuff pointers in an SCM. */ @@ -154,6 +41,39 @@ SCM_DEPRECATED SCM scm_internal_dynamic_wind (scm_t_guard before, void *inner_data, void *guard_data); + +/* Deprecated 15-05-2011 because it's better to be explicit with the + `return'. Code is more readable that way. */ +#define SCM_WTA_DISPATCH_0(gf, subr) \ + return scm_wta_dispatch_0 ((gf), (subr)) +#define SCM_WTA_DISPATCH_1(gf, a1, pos, subr) \ + return scm_wta_dispatch_1 ((gf), (a1), (pos), (subr)) +#define SCM_WTA_DISPATCH_2(gf, a1, a2, pos, subr) \ + return scm_wta_dispatch_2 ((gf), (a1), (a2), (pos), (subr)) +#define SCM_WTA_DISPATCH_N(gf, args, pos, subr) \ + return scm_wta_dispatch_n ((gf), (args), (pos), (subr)) + +/* Deprecated 15-05-2011 because this idiom is not very readable. */ +#define SCM_GASSERT0(cond, gf, subr) \ + if (SCM_UNLIKELY (!(cond))) \ + return scm_wta_dispatch_0 ((gf), (subr)) +#define SCM_GASSERT1(cond, gf, a1, pos, subr) \ + if (SCM_UNLIKELY (!(cond))) \ + return scm_wta_dispatch_1 ((gf), (a1), (pos), (subr)) +#define SCM_GASSERT2(cond, gf, a1, a2, pos, subr) \ + if (SCM_UNLIKELY (!(cond))) \ + return scm_wta_dispatch_2 ((gf), (a1), (a2), (pos), (subr)) +#define SCM_GASSERTn(cond, gf, args, pos, subr) \ + if (SCM_UNLIKELY (!(cond))) \ + return scm_wta_dispatch_n ((gf), (args), (pos), (subr)) + +/* Deprecated 15-05-2011 because this is a one-off macro that does + strange things. */ +#define SCM_WTA_DISPATCH_1_SUBR(subr, a1, pos) \ + return (SCM_UNPACK ((*SCM_SUBR_GENERIC (subr))) \ + ? scm_call_1 ((*SCM_SUBR_GENERIC (subr)), (a1)) \ + : (scm_i_wrong_type_arg_symbol (SCM_SUBR_NAME (subr), (pos), (a1)), SCM_UNSPECIFIED)) + #define SCM_LIST0 SCM_EOL #define SCM_LIST1(e0) scm_cons ((e0), SCM_EOL) #define SCM_LIST2(e0, e1) scm_cons2 ((e0), (e1), SCM_EOL) @@ -172,625 +92,48 @@ SCM_DEPRECATED SCM scm_internal_dynamic_wind (scm_t_guard before, scm_cons ((e0),\ SCM_LIST8 ((e1), (e2), (e3), (e4), (e5), (e6), (e7), (e8))) -#define scm_listify scm_list_n - -SCM_DEPRECATED SCM scm_sloppy_memq (SCM x, SCM lst); -SCM_DEPRECATED SCM scm_sloppy_memv (SCM x, SCM lst); -SCM_DEPRECATED SCM scm_sloppy_member (SCM x, SCM lst); - -SCM_DEPRECATED SCM scm_read_and_eval_x (SCM port); - -#define scm_subr_entry scm_t_subr_entry - -#define SCM_SUBR_DOC(x) SCM_BOOL_F - -SCM_DEPRECATED SCM scm_call_catching_errors (scm_t_subr thunk, - scm_t_subr err_filter, - void * closure); - -SCM_DEPRECATED long scm_make_smob_type_mfpe (char *name, size_t size, - SCM (*mark) (SCM), - size_t (*free) (SCM), - int (*print) (SCM, SCM, - scm_print_state*), - SCM (*equalp) (SCM, SCM)); - -SCM_DEPRECATED void scm_set_smob_mfpe (long tc, - SCM (*mark) (SCM), - size_t (*free) (SCM), - int (*print) (SCM, SCM, scm_print_state*), - SCM (*equalp) (SCM, SCM)); - -SCM_DEPRECATED size_t scm_smob_free (SCM obj); - -SCM_DEPRECATED SCM scm_strprint_obj (SCM obj); -SCM_DEPRECATED SCM scm_read_0str (char *expr); -SCM_DEPRECATED SCM scm_eval_0str (const char *expr); - -SCM_DEPRECATED char *scm_i_object_chars (SCM); - -#define SCM_CHARS(x) scm_i_object_chars(x) -#define SCM_UCHARS(x) ((unsigned char *)SCM_CHARS(x)) - -SCM_DEPRECATED long scm_i_object_length (SCM); - -#define SCM_LENGTH(x) scm_i_object_length(x) - -#define scm_strhash(str, len, n) (scm_string_hash ((str), (len)) % (n)) - -SCM_DEPRECATED SCM scm_sym2ovcell_soft (SCM sym, SCM obarray); -SCM_DEPRECATED SCM scm_sym2ovcell (SCM sym, SCM obarray); -SCM_DEPRECATED SCM scm_intern_obarray_soft (const char *name, size_t len, - SCM obarray, unsigned int softness); -SCM_DEPRECATED SCM scm_intern_obarray (const char *name, size_t len, SCM obarray); -SCM_DEPRECATED SCM scm_symbol_value0 (const char *name); - -SCM_DEPRECATED SCM scm_string_to_obarray_symbol (SCM o, SCM s, SCM softp); -SCM_DEPRECATED SCM scm_intern_symbol (SCM o, SCM s); -SCM_DEPRECATED SCM scm_unintern_symbol (SCM o, SCM s); -SCM_DEPRECATED SCM scm_symbol_binding (SCM o, SCM s); -#if 0 -/* This name has been reused for real uninterned symbols. */ -SCM_DEPRECATED SCM scm_symbol_interned_p (SCM o, SCM s); -#endif -SCM_DEPRECATED SCM scm_symbol_bound_p (SCM o, SCM s); -SCM_DEPRECATED SCM scm_symbol_set_x (SCM o, SCM s, SCM v); - -SCM_DEPRECATED SCM scm_gentemp (SCM prefix, SCM obarray); - -#define SCM_OPDIRP(x) (SCM_DIRP (x) && (SCM_DIR_OPEN_P (x))) -#define scm_fport scm_t_fport -#define scm_option scm_t_option -#define scm_srcprops scm_t_srcprops -#define scm_srcprops_chunk scm_t_srcprops_chunk -#define scm_array scm_t_array -#define scm_array_dim scm_t_array_dim -#define SCM_FUNC_NAME (scm_makfrom0str (FUNC_NAME)) - -#define SCM_WTA(pos, scm) \ - do { scm_wta (scm, (char *) pos, FUNC_NAME); } while (0) - -#define RETURN_SCM_WTA(pos, scm) \ - do { return scm_wta (scm, (char *) pos, FUNC_NAME); } while (0) - -#define SCM_VALIDATE_NUMBER_COPY(pos, z, cvar) \ - do { \ - if (SCM_I_INUMP (z)) \ - cvar = (double) SCM_I_INUM (z); \ - else if (SCM_REALP (z)) \ - cvar = SCM_REAL_VALUE (z); \ - else if (SCM_BIGP (z)) \ - cvar = scm_i_big2dbl (z); \ - else \ - { \ - cvar = 0.0; \ - SCM_WRONG_TYPE_ARG (pos, z); \ - } \ - } while (0) - -#define SCM_VALIDATE_NUMBER_DEF_COPY(pos, number, def, cvar) \ - do { \ - if (SCM_UNBNDP (number)) \ - cvar = def; \ - else \ - SCM_VALIDATE_NUMBER_COPY(pos, number, cvar); \ - } while (0) - -#define SCM_VALIDATE_OPDIR(pos, port) SCM_MAKE_VALIDATE (pos, port, OPDIRP) - -/* Deprecated because we can not safely cast a SCM* to a scm_t_bits* - */ - -#define SCM_CELL_WORD_LOC(x, n) ((scm_t_bits*)SCM_CELL_OBJECT_LOC((x),(n))) - -/* Users shouldn't know about INUMs. - */ - -SCM_DEPRECATED SCM scm_i_makinum (scm_t_signed_bits val); -SCM_DEPRECATED int scm_i_inump (SCM obj); -SCM_DEPRECATED scm_t_signed_bits scm_i_inum (SCM obj); - -#define SCM_MAKINUM(x) scm_i_makinum(x) -#define SCM_INUM(x) scm_i_inum(x) -#define SCM_INUMP(x) scm_i_inump(x) -#define SCM_NINUMP(x) (!SCM_INUMP(x)) - -#define SCM_VALIDATE_INUM(pos, k) SCM_MAKE_VALIDATE_MSG (pos, k, INUMP, "exact integer") - -#define SCM_VALIDATE_INUM_COPY(pos, k, cvar) \ - do { \ - SCM_ASSERT (SCM_I_INUMP (k), k, pos, FUNC_NAME); \ - cvar = SCM_I_INUM (k); \ - } while (0) - -#define SCM_VALIDATE_BIGINT(pos, k) SCM_MAKE_VALIDATE_MSG (pos, k, BIGP, "bignum") - -#define SCM_VALIDATE_INUM_MIN(pos, k, min) \ - do { \ - SCM_ASSERT (SCM_I_INUMP(k), k, pos, FUNC_NAME); \ - SCM_ASSERT_RANGE (pos, k, (SCM_I_INUM (k) >= min)); \ - } while (0) - -#define SCM_VALIDATE_INUM_MIN_COPY(pos, k, min, cvar) \ - do { \ - SCM_ASSERT (SCM_I_INUMP (k), k, pos, FUNC_NAME); \ - SCM_ASSERT_RANGE (pos, k, (SCM_I_INUM (k) >= min)); \ - cvar = SCM_INUM (k); \ - } while (0) - -#define SCM_VALIDATE_INUM_MIN_DEF_COPY(pos, k, min, default, cvar) \ - do { \ - if (SCM_UNBNDP (k)) \ - k = SCM_I_MAKINUM (default); \ - SCM_ASSERT (SCM_I_INUMP (k), k, pos, FUNC_NAME); \ - SCM_ASSERT_RANGE (pos, k, (SCM_I_INUM (k) >= min)); \ - cvar = SCM_INUM (k); \ - } while (0) - -#define SCM_VALIDATE_INUM_DEF(pos, k, default) \ - do { \ - if (SCM_UNBNDP (k)) \ - k = SCM_I_MAKINUM (default); \ - else SCM_ASSERT (SCM_I_INUMP (k), k, pos, FUNC_NAME); \ - } while (0) - -#define SCM_VALIDATE_INUM_DEF_COPY(pos, k, default, cvar) \ - do { \ - if (SCM_UNBNDP (k)) \ - { \ - k = SCM_I_MAKINUM (default); \ - cvar = default; \ - } \ - else \ - { \ - SCM_ASSERT (SCM_I_INUMP (k), k, pos, FUNC_NAME); \ - cvar = SCM_INUM (k); \ - } \ - } while (0) - -/* [low, high) */ -#define SCM_VALIDATE_INUM_RANGE(pos, k, low, high) \ - do { SCM_ASSERT(SCM_I_INUMP(k), k, pos, FUNC_NAME); \ - SCM_ASSERT_RANGE(pos, k, \ - (SCM_I_INUM (k) >= low && \ - SCM_I_INUM (k) < high)); \ - } while (0) - -#define SCM_VALIDATE_INUM_RANGE_COPY(pos, k, low, high, cvar) \ - do { \ - SCM_ASSERT (SCM_INUMP (k), k, pos, FUNC_NAME); \ - SCM_ASSERT_RANGE (pos, k, low <= SCM_INUM (k) && SCM_INUM (k) < high); \ - cvar = SCM_INUM (k); \ - } while (0) - -#define SCM_STRING_COERCE_0TERMINATION_X(x) (x) - -/* XXX - buggy interface, STR might not be large enough. - - Converts the given Scheme string OBJ into a C string, containing a copy - of OBJ's content with a trailing null byte. If LENP is non-NULL, set - *LENP to the string's length. - - When STR is non-NULL it receives the copy and is returned by the function, - otherwise new memory is allocated and the caller is responsible for - freeing it via free(). If out of memory, NULL is returned. - - Note that Scheme strings may contain arbitrary data, including null - characters. This means that null termination is not a reliable way to - determine the length of the returned value. However, the function always - copies the complete contents of OBJ, and sets *LENP to the length of the - scheme string (if LENP is non-null). -*/ -SCM_DEPRECATED char *scm_c_string2str (SCM obj, char *str, size_t *lenp); - -/* XXX - buggy interface, you don't know how many bytes have been copied. - - Copy LEN characters at START from the Scheme string OBJ to memory - at STR. START is an index into OBJ; zero means the beginning of - the string. STR has already been allocated by the caller. - - If START + LEN is off the end of OBJ, silently truncate the source - region to fit the string. If truncation occurs, the corresponding - area of STR is left unchanged. -*/ -SCM_DEPRECATED char *scm_c_substring2str (SCM obj, char *str, size_t start, size_t len); - -SCM_DEPRECATED char *scm_c_symbol2str (SCM obj, char *str, size_t *lenp); - -/* Deprecated because the names belong to what is now - scm_truncate_number and scm_round_number. -*/ -SCM_DEPRECATED double scm_truncate (double x); -SCM_DEPRECATED double scm_round (double x); -/* Deprecated, use scm_expt */ -SCM_DEPRECATED SCM scm_sys_expt (SCM x, SCM y); - -/* if your platform doesn't have asinh et al */ -SCM_DEPRECATED double scm_asinh (double x); -SCM_DEPRECATED double scm_acosh (double x); -SCM_DEPRECATED double scm_atanh (double x); -SCM_DEPRECATED SCM scm_sys_atan2 (SCM z1, SCM z2); - -/* Deprecated because we don't want people to access the internal - representation of strings directly. -*/ - -#define SCM_VALIDATE_STRING_COPY(pos, str, cvar) \ - do { \ - SCM_ASSERT (SCM_STRINGP (str), str, pos, FUNC_NAME); \ - cvar = SCM_STRING_CHARS(str); \ - } while (0) - -/* validate a string and optional start/end arguments which default to - 0/string-len. this is unrelated to the old shared substring - support, so please do not deprecate it :) */ -#define SCM_VALIDATE_SUBSTRING_SPEC_COPY(pos_str, str, c_str, \ - pos_start, start, c_start,\ - pos_end, end, c_end) \ - do {\ - SCM_VALIDATE_STRING_COPY (pos_str, str, c_str);\ - c_start = SCM_UNBNDP(start)? 0 : scm_to_size_t (start);\ - c_end = SCM_UNBNDP(end)? SCM_STRING_LENGTH(str) : scm_to_size_t (end);\ - SCM_ASSERT_RANGE (pos_start, start,\ - 0 <= c_start \ - && (size_t) c_start <= SCM_STRING_LENGTH (str));\ - SCM_ASSERT_RANGE (pos_end, end,\ - c_start <= c_end \ - && (size_t) c_end <= SCM_STRING_LENGTH (str));\ - } while (0) - -/* Deprecated because we don't want people to access the internals of - symbols directly. -*/ - -SCM_DEPRECATED char *scm_i_deprecated_symbol_chars (SCM sym); -SCM_DEPRECATED size_t scm_i_deprecated_symbol_length (SCM sym); - -#define SCM_SYMBOL_CHARS(x) scm_i_deprecated_symbol_chars(x) -#define SCM_SYMBOL_LENGTH(x) scm_i_deprecated_symbol_length(x) - -/* Deprecated because the macros used to evaluate the arguments more - than once and because the symbol of a keyword now has no dash. -*/ - -SCM_DEPRECATED int scm_i_keywordp (SCM obj); -SCM_DEPRECATED SCM scm_i_keywordsym (SCM keyword); - -#define SCM_KEYWORDP(x) scm_i_keywordp(x) -#define SCM_KEYWORDSYM(x) scm_i_keywordsym(x) - -/* Deprecated because we don't want to hand out unprotected pointers - to arrays, vectors, etc. */ - -#define SCM_VECTOR_MAX_LENGTH ((1L << 24) - 1) - -SCM_DEPRECATED int scm_i_vectorp (SCM x); -SCM_DEPRECATED unsigned long scm_i_vector_length (SCM x); -SCM_DEPRECATED const SCM *scm_i_velts (SCM x); -SCM_DEPRECATED SCM *scm_i_writable_velts (SCM x); -SCM_DEPRECATED SCM scm_i_vector_ref (SCM x, size_t idx); -SCM_DEPRECATED void scm_i_vector_set (SCM x, size_t idx, SCM val); -SCM_DEPRECATED SCM scm_vector_equal_p (SCM x, SCM y); - -#define SCM_VECTORP(x) scm_i_vectorp(x) -#define SCM_VECTOR_LENGTH(x) scm_i_vector_length(x) -#define SCM_VELTS(x) scm_i_velts(x) -#define SCM_WRITABLE_VELTS(x) scm_i_writable_velts(x) -#define SCM_VECTOR_REF(x,y) scm_i_vector_ref(x,y) -#define SCM_VECTOR_SET(x,y,z) scm_i_vector_set(x,y,z) - -typedef scm_i_t_array scm_t_array; - -SCM_DEPRECATED int scm_i_arrayp (SCM a); -SCM_DEPRECATED size_t scm_i_array_ndim (SCM a); -SCM_DEPRECATED int scm_i_array_contp (SCM a); -SCM_DEPRECATED scm_t_array *scm_i_array_mem (SCM a); -SCM_DEPRECATED SCM scm_i_array_v (SCM a); -SCM_DEPRECATED size_t scm_i_array_base (SCM a); -SCM_DEPRECATED scm_t_array_dim *scm_i_array_dims (SCM a); - -#define SCM_ARRAYP(a) scm_i_arrayp(a) -#define SCM_ARRAY_NDIM(a) scm_i_array_ndim(a) -#define SCM_ARRAY_CONTP(a) scm_i_array_contp(a) -#define SCM_ARRAY_MEM(a) scm_i_array_mem(a) -#define SCM_ARRAY_V(a) scm_i_array_v(a) -#define SCM_ARRAY_BASE(a) scm_i_array_base(a) -#define SCM_ARRAY_DIMS(a) scm_i_array_dims(a) - -SCM_DEPRECATED SCM scm_uniform_vector_read_x (SCM v, SCM port_or_fd, - SCM start, SCM end); -SCM_DEPRECATED SCM scm_uniform_vector_write (SCM v, SCM port_or_fd, - SCM start, SCM end); -SCM_DEPRECATED SCM scm_uniform_array_read_x (SCM ra, SCM port_or_fd, - SCM start, SCM end); -SCM_DEPRECATED SCM scm_uniform_array_write (SCM v, SCM port_or_fd, - SCM start, SCM end); - -/* Deprecated because they should not be lvalues and we want people to - use the official interfaces. - */ - -#define scm_cur_inp scm_i_cur_inp () -#define scm_cur_outp scm_i_cur_outp () -#define scm_cur_errp scm_i_cur_errp () -#define scm_cur_loadp scm_i_cur_loadp () -#define scm_progargs scm_i_progargs () -#define scm_dynwinds scm_i_deprecated_dynwinds () -#define scm_stack_base scm_i_stack_base () - -SCM_DEPRECATED SCM scm_i_cur_inp (void); -SCM_DEPRECATED SCM scm_i_cur_outp (void); -SCM_DEPRECATED SCM scm_i_cur_errp (void); -SCM_DEPRECATED SCM scm_i_cur_loadp (void); -SCM_DEPRECATED SCM scm_i_progargs (void); -SCM_DEPRECATED SCM scm_i_deprecated_dynwinds (void); -SCM_DEPRECATED SCM_STACKITEM *scm_i_stack_base (void); - -/* Deprecated because it evaluates its argument twice. - */ -#define SCM_FLUIDP(x) scm_i_fluidp (x) -SCM_DEPRECATED int scm_i_fluidp (SCM x); - -/* Deprecated in Guile 1.9.5 on 2009-11-15 because these are IPv4-only - functions which are deprecated upstream. */ - -SCM_DEPRECATED SCM scm_inet_aton (SCM address); -SCM_DEPRECATED SCM scm_inet_ntoa (SCM inetid); - -/* In the old days, SCM_CRITICAL_SECTION_START stopped signal handlers - from running, since in those days the handler directly ran scheme - code, and that had to be avoided when the heap was not in a - consistent state etc. And since the scheme code could do a stack - swapping new continuation etc, signals had to be deferred around - various C library functions which were not safe or not known to be - safe to swap away, which was a lot of stuff. - - These days signals are implemented with asyncs and don't directly - run scheme code in the handler, but hold it until an SCM_TICK etc - where it will be safe. This means interrupt protection is not - needed and SCM_CRITICAL_SECTION_START / SCM_CRITICAL_SECTION_END is - something of an anachronism. - - What past SCM_CRITICAL_SECTION_START usage also did though was - indicate code that was not reentrant, ie. could not be reentered by - signal handler code. The present definitions are a mutex lock, - affording that reentrancy protection against the new guile 1.8 - free-running posix threads. - - One big problem with the present defintions though is that code which - throws an error from within a DEFER/ALLOW region will leave the - defer_mutex locked and hence hang other threads that attempt to enter a - similar DEFER/ALLOW region. -*/ - -SCM_DEPRECATED void scm_i_defer_ints_etc (void); -#define SCM_DEFER_INTS scm_i_defer_ints_etc () -#define SCM_ALLOW_INTS scm_i_defer_ints_etc () -#define SCM_REDEFER_INTS scm_i_defer_ints_etc () -#define SCM_REALLOW_INTS scm_i_defer_ints_etc () - -/* In the old days (pre-1.8), this macro was sometimes used as an lvalue as - in "scm_mask_ints = 1" to block async execution. It no longer works. */ -#define scm_mask_ints (scm_i_mask_ints ()) - -SCM_DEPRECATED int scm_i_mask_ints (void); - -/* Deprecated since they are unnecessary and had not been documented. - */ -SCM_DEPRECATED SCM scm_guard (SCM guardian, SCM obj, int throw_p); -SCM_DEPRECATED SCM scm_get_one_zombie (SCM guardian); - -/* Deprecated since guardians no longer have these special features. - */ -SCM_DEPRECATED SCM scm_destroy_guardian_x (SCM guardian); -SCM_DEPRECATED SCM scm_guardian_greedy_p (SCM guardian); -SCM_DEPRECATED SCM scm_guardian_destroyed_p (SCM guardian); - - -/* GC-related things deprecated with the move to BDW-GC starting from 1.9.3 - (2009-09-15). */ - -SCM_DEPRECATED unsigned long scm_mallocated; -SCM_DEPRECATED unsigned long scm_mtrigger; - -SCM_DEPRECATED size_t scm_max_segment_size; - -#if defined (GUILE_DEBUG) || defined (GUILE_DEBUG_FREELIST) -SCM_DEPRECATED SCM scm_map_free_list (void); -#endif - -#if defined (GUILE_DEBUG_FREELIST) -SCM_DEPRECATED SCM scm_gc_set_debug_check_freelist_x (SCM flag); -#endif - - - -/* Deprecated 2009-11-27, scm_call_N is sufficient */ -SCM_DEPRECATED scm_t_trampoline_0 scm_trampoline_0 (SCM proc); -SCM_DEPRECATED scm_t_trampoline_1 scm_trampoline_1 (SCM proc); -SCM_DEPRECATED scm_t_trampoline_2 scm_trampoline_2 (SCM proc); - - - -/* Deprecated 2009-12-06, use the procedures instead */ -#define SCM_PROCEDURE_WITH_SETTER_P(obj) (scm_is_true (scm_procedure_with_setter_p (obj))) -#define SCM_PROCEDURE(obj) SCM_STRUCT_PROCEDURE (obj, 0) -#define SCM_SETTER(obj) SCM_STRUCT_SETTER (obj, 1) - - - -/* Deprecated 2010-01-05, use SCM_PRIMITIVE_P instead */ -SCM_DEPRECATED int scm_i_subr_p (SCM x); -#define scm_subr_p(x) (scm_i_subr_p (x)) - - - -/* Deprecated 2010-01-31, use with-throw-handler instead */ -SCM_DEPRECATED SCM scm_lazy_catch (SCM tag, SCM thunk, SCM handler); -SCM_DEPRECATED SCM scm_internal_lazy_catch (SCM tag, - scm_t_catch_body body, - void *body_data, - scm_t_catch_handler handler, - void *handler_data); - - - -/* Deprecated 2010-03-31, use array-equal? instead */ -SCM_DEPRECATED SCM scm_raequal (SCM ra0, SCM ra1); - -/* Deprecated 2010-04-01, use the dynamic FFI instead */ -SCM_DEPRECATED SCM scm_dynamic_args_call (SCM symb, SCM dobj, SCM args); - -/* Deprecated 2010-05-12, no replacement */ -SCM_DEPRECATED int scm_badargsp (SCM formals, SCM args); - -/* Deprecated 2010-06-19, use call-with-error-handling instead */ -SCM_DEPRECATED SCM scm_internal_stack_catch (SCM tag, - scm_t_catch_body body, - void *body_data, - scm_t_catch_handler handler, - void *handler_data); - - - -/* These functions were "discouraged" in 1.8, and now are deprecated. */ - -/* scm_to_int, scm_from_int are the official functions to do the job, - but there is nothing wrong with using scm_num2int, etc. - - These could be trivially defined via macros, but we leave them as - functions since existing code may take their addresses. -*/ - -SCM_DEPRECATED SCM scm_short2num (short n); -SCM_DEPRECATED SCM scm_ushort2num (unsigned short n); -SCM_DEPRECATED SCM scm_int2num (int n); -SCM_DEPRECATED SCM scm_uint2num (unsigned int n); -SCM_DEPRECATED SCM scm_long2num (long n); -SCM_DEPRECATED SCM scm_ulong2num (unsigned long n); -SCM_DEPRECATED SCM scm_size2num (size_t n); -SCM_DEPRECATED SCM scm_ptrdiff2num (scm_t_ptrdiff n); -SCM_DEPRECATED short scm_num2short (SCM num, unsigned long int pos, - const char *s_caller); -SCM_DEPRECATED unsigned short scm_num2ushort (SCM num, unsigned long int pos, - const char *s_caller); -SCM_DEPRECATED int scm_num2int (SCM num, unsigned long int pos, - const char *s_caller); -SCM_DEPRECATED unsigned int scm_num2uint (SCM num, unsigned long int pos, - const char *s_caller); -SCM_DEPRECATED long scm_num2long (SCM num, unsigned long int pos, - const char *s_caller); -SCM_DEPRECATED unsigned long scm_num2ulong (SCM num, unsigned long int pos, - const char *s_caller); -SCM_DEPRECATED scm_t_ptrdiff scm_num2ptrdiff (SCM num, unsigned long int pos, - const char *s_caller); -SCM_DEPRECATED size_t scm_num2size (SCM num, unsigned long int pos, - const char *s_caller); -#if SCM_SIZEOF_LONG_LONG != 0 -SCM_DEPRECATED SCM scm_long_long2num (long long sl); -SCM_DEPRECATED SCM scm_ulong_long2num (unsigned long long sl); -SCM_DEPRECATED long long scm_num2long_long (SCM num, unsigned long int pos, - const char *s_caller); -SCM_DEPRECATED unsigned long long scm_num2ulong_long (SCM num, unsigned long int pos, - const char *s_caller); +#define SCM_OPDIRP SCM_OPDIRP__GONE__REPLACE_WITH__SCM_DIRP_and_SCM_DIR_OPEN_P +#define SCM_PROCEDURE SCM_PROCEDURE__GONE__REPLACE_WITH__scm_procedure +#define SCM_PROCEDURE_WITH_SETTER_P SCM_PROCEDURE_WITH_SETTER_P__GONE__REPLACE_WITH__scm_is_true__scm_procedure_with_setter_p +#define SCM_SETTER SCM_SETTER__GONE__REPLACE_WITH__scm_setter +#define SCM_THREAD_SWITCHING_CODE SCM_THREAD_SWITCHING_CODE__GONE__REMOVE_FROM_YOUR_CODE +#define SCM_VALIDATE_NUMBER_COPY SCM_VALIDATE_NUMBER_COPY__GONE__REPLACE_WITH__SCM_VALIDATE_DOUBLE_COPY +#define SCM_VALIDATE_NUMBER_DEF_COPY SCM_VALIDATE_NUMBER_DEF_COPY__GONE__REPLACE_WITH__SCM_UNBNDP_and_SCM_VALIDATE_DOUBLE_COPY +#define SCM_VALIDATE_OPDIR SCM_VALIDATE_OPDIR__GONE +#define SCM_VALIDATE_STRING_COPY SCM_VALIDATE_STRING_COPY__GONE +#define SCM_VALIDATE_SUBSTRING_SPEC_COPY SCM_VALIDATE_SUBSTRING_SPEC_COPY__GONE +#define scm_array scm_array__GONE__REPLACE_WITH__scm_t_array +#define scm_array_dim scm_array_dim__GONE__REPLACE_WITH__scm_t_array_dim +#define scm_async_click scm_async_click__GONE__REPLACE_WITH__scm_async_tick +#define scm_call_generic_0 scm_call_generic_0__GONE__REPLACE_WITH__scm_call_0 +#define scm_call_generic_1 scm_call_generic_1__GONE__REPLACE_WITH__scm_call_1 +#define scm_call_generic_2 scm_call_generic_2__GONE__REPLACE_WITH__scm_call_2 +#define scm_call_generic_3 scm_call_generic_3__GONE__REPLACE_WITH__scm_call_3 +#define scm_apply_generic scm_apply_generic__GONE__REPLACE_WITH__scm_apply_0 +#define scm_fport scm_fport__GONE__REPLACE_WITH__scm_t_fport +#define scm_listify scm_listify__GONE__REPLACE_WITH__scm_list_n +#define scm_option scm_option__GONE__REPLACE_WITH__scm_t_option +#define scm_port scm_port__GONE__REPLACE_WITH__scm_t_port +#define scm_port_rw_active scm_port_rw_active__GONE__REPLACE_WITH__scm_t_port_rw_active +#define scm_ptob_descriptor scm_ptob_descriptor__GONE__REPLACE_WITH__scm_t_ptob_descriptor +#define scm_rng scm_rng__GONE__REPLACE_WITH__scm_t_rng +#define scm_rstate scm_rstate__GONE__REPLACE_WITH__scm_t_rstate +#define scm_sizet scm_sizet__GONE__REPLACE_WITH__size_t +#define scm_srcprops scm_srcprops__GONE__REPLACE_WITH__scm_t_srcprops +#define scm_srcprops_chunk scm_srcprops_chunk__GONE__REPLACE_WITH__scm_t_srcprops_chunk +#define scm_struct_i_flags scm_struct_i_flags__GONE__REPLACE_WITH__scm_vtable_index_flags +#define scm_struct_i_free scm_struct_i_free__GONE__REPLACE_WITH__scm_vtable_index_instance_finalize +#define scm_subr_entry scm_subr_entry__GONE__REPLACE_WITH__scm_t_subr_entry +#define scm_substring_move_left_x scm_substring_move_left_x__GONE__REPLACE_WITH__scm_substring_move_x +#define scm_substring_move_right_x scm_substring_move_right_x__GONE__REPLACE_WITH__scm_substring_move_x +#define scm_vtable_index_printer scm_vtable_index_printer__GONE__REPLACE_WITH__scm_vtable_index_instance_printer +#define scm_vtable_index_vtable scm_vtable_index_vtable__GONE__REPLACE_WITH__scm_vtable_index_self +typedef scm_i_t_array scm_i_t_array__GONE__REPLACE_WITH__scm_t_array; + +#ifndef BUILDING_LIBGUILE +#define SCM_ASYNC_TICK SCM_ASYNC_TICK__GONE__REPLACE_WITH__scm_async_tick #endif -SCM_DEPRECATED SCM scm_make_real (double x); -SCM_DEPRECATED double scm_num2dbl (SCM a, const char * why); -SCM_DEPRECATED SCM scm_float2num (float n); -SCM_DEPRECATED SCM scm_double2num (double n); - -/* The next two are implemented in numbers.c since they use features - only available there. -*/ -SCM_DEPRECATED float scm_num2float (SCM num, unsigned long int pos, - const char *s_caller); -SCM_DEPRECATED double scm_num2double (SCM num, unsigned long int pos, - const char *s_caller); - -SCM_DEPRECATED SCM scm_make_complex (double x, double y); - -/* Discouraged because they don't make the encoding explicit. - */ - -SCM_DEPRECATED SCM scm_mem2symbol (const char *mem, size_t len); -SCM_DEPRECATED SCM scm_mem2uninterned_symbol (const char *mem, size_t len); -SCM_DEPRECATED SCM scm_str2symbol (const char *str); - -SCM_DEPRECATED SCM scm_take_str (char *s, size_t len); -SCM_DEPRECATED SCM scm_take0str (char *s); -SCM_DEPRECATED SCM scm_mem2string (const char *src, size_t len); -SCM_DEPRECATED SCM scm_str2string (const char *src); -SCM_DEPRECATED SCM scm_makfrom0str (const char *src); -SCM_DEPRECATED SCM scm_makfrom0str_opt (const char *src); - -/* Discouraged because scm_c_make_string has a better name and is more - consistent with make-string. - */ -SCM_DEPRECATED SCM scm_allocate_string (size_t len); - -/* Discouraged because they are just strange. - */ - -SCM_DEPRECATED SCM scm_make_keyword_from_dash_symbol (SCM symbol); -SCM_DEPRECATED SCM scm_keyword_dash_symbol (SCM keyword); - -/* Discouraged because it does not state what encoding S is in. - */ - -SCM_DEPRECATED SCM scm_c_make_keyword (const char *s); - -SCM_DEPRECATED unsigned int scm_thread_sleep (unsigned int); -SCM_DEPRECATED unsigned long scm_thread_usleep (unsigned long); -SCM_DEPRECATED int scm_internal_select (int fds, - SELECT_TYPE *rfds, - SELECT_TYPE *wfds, - SELECT_TYPE *efds, - struct timeval *timeout); - -/* Deprecated because the cuserid call is deprecated. - */ -SCM_DEPRECATED SCM scm_cuserid (void); - - - -/* Deprecated because it's yet another property interface. - */ -SCM_DEPRECATED SCM scm_primitive_make_property (SCM not_found_proc); -SCM_DEPRECATED SCM scm_primitive_property_ref (SCM prop, SCM obj); -SCM_DEPRECATED SCM scm_primitive_property_set_x (SCM prop, SCM obj, SCM val); -SCM_DEPRECATED SCM scm_primitive_property_del_x (SCM prop, SCM obj); - - - -/* {The old whash table interface} - * Deprecated, as the hash table interface is sufficient, and accessing - * handles of weak hash tables is no longer supported. - */ - -#define scm_whash_handle SCM - -SCM_DEPRECATED SCM scm_whash_get_handle (SCM whash, SCM key); -SCM_DEPRECATED int SCM_WHASHFOUNDP (SCM h); -SCM_DEPRECATED SCM SCM_WHASHREF (SCM whash, SCM handle); -SCM_DEPRECATED void SCM_WHASHSET (SCM whash, SCM handle, SCM obj); -SCM_DEPRECATED SCM scm_whash_create_handle (SCM whash, SCM key); -SCM_DEPRECATED SCM scm_whash_lookup (SCM whash, SCM obj); -SCM_DEPRECATED void scm_whash_insert (SCM whash, SCM key, SCM obj); - - - - -/* No need for a table for names, and the struct->class mapping is - maintained by GOOPS now. */ -#define SCM_STRUCT_TABLE_NAME(X) SCM_CAR (X) -#define SCM_SET_STRUCT_TABLE_NAME(X, NAME) SCM_SETCAR (X, NAME) -#define SCM_STRUCT_TABLE_CLASS(X) SCM_CDR (X) -#define SCM_SET_STRUCT_TABLE_CLASS(X, CLASS) SCM_SETCDR (X, CLASS) - -SCM_DEPRECATED SCM scm_struct_table; -SCM_DEPRECATED SCM scm_struct_create_handle (SCM obj); - diff --git a/libguile/deprecation.c b/libguile/deprecation.c index be5fffc90..1622406a8 100644 --- a/libguile/deprecation.c +++ b/libguile/deprecation.c @@ -89,7 +89,7 @@ scm_c_issue_deprecation_warning (const char *msg) fprintf (stderr, "%s\n", msg); else { - scm_puts (msg, scm_current_error_port ()); + scm_puts_unlocked (msg, scm_current_error_port ()); scm_newline (scm_current_error_port ()); } } diff --git a/libguile/dynl.c b/libguile/dynl.c index a2ae6e267..72305a41b 100644 --- a/libguile/dynl.c +++ b/libguile/dynl.c @@ -185,11 +185,11 @@ scm_t_bits scm_tc16_dynamic_obj; static int dynl_obj_print (SCM exp, SCM port, scm_print_state *pstate) { - scm_puts ("#<dynamic-object ", port); + scm_puts_unlocked ("#<dynamic-object ", port); scm_iprin1 (DYNL_FILENAME (exp), port, pstate); if (DYNL_HANDLE (exp) == NULL) - scm_puts (" (unlinked)", port); - scm_putc ('>', port); + scm_puts_unlocked (" (unlinked)", port); + scm_putc_unlocked ('>', port); return 1; } diff --git a/libguile/dynwind.c b/libguile/dynwind.c index 14dd861dc..bec2dc806 100644 --- a/libguile/dynwind.c +++ b/libguile/dynwind.c @@ -195,7 +195,7 @@ void scm_swap_bindings (SCM vars, SCM vals) { SCM tmp; - while (SCM_NIMP (vals)) + while (scm_is_pair (vals)) { tmp = SCM_VARIABLE_REF (SCM_CAR (vars)); SCM_VARIABLE_SET (SCM_CAR (vars), SCM_CAR (vals)); diff --git a/libguile/eq.c b/libguile/eq.c index 11dce99a1..5e270a25c 100644 --- a/libguile/eq.c +++ b/libguile/eq.c @@ -365,7 +365,7 @@ scm_equal_p (SCM x, SCM y) generic_equal: if (SCM_UNPACK (g_scm_i_equal_p)) - return scm_call_generic_2 (g_scm_i_equal_p, x, y); + return scm_call_2 (g_scm_i_equal_p, x, y); else return SCM_BOOL_F; } diff --git a/libguile/error.h b/libguile/error.h index 8cc68b752..1611fd529 100644 --- a/libguile/error.h +++ b/libguile/error.h @@ -3,7 +3,7 @@ #ifndef SCM_ERROR_H #define SCM_ERROR_H -/* Copyright (C) 1995,1996,1997,1998,2000,2001, 2002, 2006, 2008 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996,1997,1998,2000,2001, 2002, 2006, 2008, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -36,6 +36,16 @@ SCM_API SCM scm_misc_error_key; +#define SCM_ASSERT(_cond, _arg, _pos, _subr) \ + do { if (SCM_UNLIKELY (!(_cond))) \ + scm_wrong_type_arg (_subr, _pos, _arg); } while (0) +#define SCM_ASSERT_TYPE(_cond, _arg, _pos, _subr, _msg) \ + do { if (SCM_UNLIKELY (!(_cond))) \ + scm_wrong_type_arg_msg(_subr, _pos, _arg, _msg); } while (0) + + + + SCM_API void scm_error (SCM key, const char *subr, const char *message, SCM args, SCM rest) SCM_NORETURN; SCM_API SCM scm_error_scm (SCM key, SCM subr, SCM message, diff --git a/libguile/eval.c b/libguile/eval.c index e008b3a08..ad0a84a58 100644 --- a/libguile/eval.c +++ b/libguile/eval.c @@ -229,10 +229,9 @@ eval (SCM x, SCM env) mx = SCM_MEMOIZED_ARGS (x); switch (SCM_MEMOIZED_TAG (x)) { - case SCM_M_BEGIN: - for (; !scm_is_null (CDR (mx)); mx = CDR (mx)) - eval (CAR (mx), env); - x = CAR (mx); + case SCM_M_SEQ: + eval (CAR (mx), env); + x = CDR (mx); goto loop; case SCM_M_IF: @@ -914,16 +913,16 @@ static int boot_closure_print (SCM closure, SCM port, scm_print_state *pstate) { SCM args; - scm_puts ("#<boot-closure ", port); - scm_uintprint ((scm_t_bits)SCM2PTR (closure), 16, port); - scm_putc (' ', port); + scm_puts_unlocked ("#<boot-closure ", port); + scm_uintprint (SCM_UNPACK (closure), 16, port); + scm_putc_unlocked (' ', port); args = scm_make_list (scm_from_int (BOOT_CLOSURE_NUM_REQUIRED_ARGS (closure)), scm_from_latin1_symbol ("_")); if (!BOOT_CLOSURE_IS_FIXED (closure) && BOOT_CLOSURE_HAS_REST_ARGS (closure)) args = scm_cons_star (scm_from_latin1_symbol ("_"), args); /* FIXME: optionals and rests */ scm_display (args, port); - scm_putc ('>', port); + scm_putc_unlocked ('>', port); return 1; } diff --git a/libguile/evalext.c b/libguile/evalext.c index 1e5bd6822..779c63d0a 100644 --- a/libguile/evalext.c +++ b/libguile/evalext.c @@ -76,6 +76,8 @@ SCM_DEFINE (scm_self_evaluating_p, "self-evaluating?", 1, 0, 0, case scm_tc7_wvect: case scm_tc7_pointer: case scm_tc7_hashtable: + case scm_tc7_weak_set: + case scm_tc7_weak_table: case scm_tc7_fluid: case scm_tc7_dynamic_state: case scm_tc7_frame: diff --git a/libguile/evalext.h b/libguile/evalext.h index fc3f1e617..7718ec621 100644 --- a/libguile/evalext.h +++ b/libguile/evalext.h @@ -3,7 +3,7 @@ #ifndef SCM_EVALEXT_H #define SCM_EVALEXT_H -/* Copyright (C) 1998,1999,2000, 2003, 2006, 2008 Free Software Foundation, Inc. +/* Copyright (C) 1998,1999,2000, 2003, 2006, 2008, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -31,12 +31,6 @@ SCM_API SCM scm_defined_p (SCM sym, SCM env); SCM_API SCM scm_self_evaluating_p (SCM obj); SCM_INTERNAL void scm_init_evalext (void); -#if (SCM_ENABLE_DEPRECATED == 1) - -#define scm_definedp scm_defined_p - -#endif - #endif /* SCM_EVALEXT_H */ /* diff --git a/libguile/expand.c b/libguile/expand.c index bdecd80d8..3f23d4f8f 100644 --- a/libguile/expand.c +++ b/libguile/expand.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010 +/* Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005,2006,2007,2008,2009,2010,2011 * Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or @@ -71,10 +71,10 @@ static const char** exp_field_names[SCM_NUM_EXPANDED_TYPES]; SCM_MAKE_EXPANDED_TOPLEVEL_DEFINE(src, name, exp) #define CONDITIONAL(src, test, consequent, alternate) \ SCM_MAKE_EXPANDED_CONDITIONAL(src, test, consequent, alternate) -#define APPLICATION(src, proc, exps) \ - SCM_MAKE_EXPANDED_APPLICATION(src, proc, exps) -#define SEQUENCE(src, exps) \ - SCM_MAKE_EXPANDED_SEQUENCE(src, exps) +#define CALL(src, proc, exps) \ + SCM_MAKE_EXPANDED_CALL(src, proc, exps) +#define SEQ(src, head, tail) \ + SCM_MAKE_EXPANDED_SEQ(src, head, tail) #define LAMBDA(src, meta, body) \ SCM_MAKE_EXPANDED_LAMBDA(src, meta, body) #define LAMBDA_CASE(src, req, opt, rest, kw, inits, gensyms, body, alternate) \ @@ -359,9 +359,9 @@ expand (SCM exp, SCM env) arg_exps = CDR (arg_exps)) args = scm_cons (expand (CAR (arg_exps), env), args); if (scm_is_null (arg_exps)) - return APPLICATION (scm_source_properties (exp), - expand (proc, env), - scm_reverse_x (args, SCM_UNDEFINED)); + return CALL (scm_source_properties (exp), + expand (proc, env), + scm_reverse_x (args, SCM_UNDEFINED)); else syntax_error ("expected a proper list", exp, SCM_UNDEFINED); } @@ -396,7 +396,9 @@ expand_sequence (const SCM forms, const SCM env) if (scm_is_null (CDR (forms))) return expand (CAR (forms), env); else - return SEQUENCE (SCM_BOOL_F, expand_exprs (forms, env)); + return SEQ (scm_source_properties (forms), + expand (CAR (forms), env), + expand_sequence (CDR (forms), env)); } @@ -487,10 +489,10 @@ expand_cond_clauses (SCM clause, SCM rest, int elp, int alp, SCM env) scm_list_1 (expand (test, env)), CONDITIONAL (SCM_BOOL_F, LEXICAL_REF (SCM_BOOL_F, tmp, tmp), - APPLICATION (SCM_BOOL_F, - expand (CADDR (clause), new_env), - scm_list_1 (LEXICAL_REF (SCM_BOOL_F, - tmp, tmp))), + CALL (SCM_BOOL_F, + expand (CADDR (clause), new_env), + scm_list_1 (LEXICAL_REF (SCM_BOOL_F, + tmp, tmp))), rest)); } /* FIXME length == 1 case */ @@ -993,9 +995,9 @@ expand_named_let (const SCM expr, SCM env) SCM_BOOL_F, SCM_BOOL_F, var_syms, expand_sequence (CDDDR (expr), inner_env), SCM_BOOL_F))), - APPLICATION (SCM_BOOL_F, - LEXICAL_REF (SCM_BOOL_F, name, name_sym), - expand_exprs (inits, env))); + CALL (SCM_BOOL_F, + LEXICAL_REF (SCM_BOOL_F, name, name_sym), + expand_exprs (inits, env))); } static SCM @@ -1212,13 +1214,13 @@ make_exp_vtable (size_t n) (scm_string_append (scm_make_list (scm_from_size_t (exp_nfields[n]), scm_from_locale_string ("pw")))); printer = SCM_BOOL_F; - name = scm_from_locale_symbol (exp_names[n]); + name = scm_from_utf8_symbol (exp_names[n]); code = scm_from_size_t (n); fields = SCM_EOL; { size_t m = exp_nfields[n]; while (m--) - fields = scm_cons (scm_from_locale_symbol (exp_field_names[n][m]), fields); + fields = scm_cons (scm_from_utf8_symbol (exp_field_names[n][m]), fields); } return scm_c_make_struct (scm_exp_vtable_vtable, 0, 5, @@ -1243,8 +1245,9 @@ scm_init_expand () DEFINE_NAMES (TOPLEVEL_SET); DEFINE_NAMES (TOPLEVEL_DEFINE); DEFINE_NAMES (CONDITIONAL); - DEFINE_NAMES (APPLICATION); - DEFINE_NAMES (SEQUENCE); + DEFINE_NAMES (CALL); + DEFINE_NAMES (PRIMCALL); + DEFINE_NAMES (SEQ); DEFINE_NAMES (LAMBDA); DEFINE_NAMES (LAMBDA_CASE); DEFINE_NAMES (LET); diff --git a/libguile/expand.h b/libguile/expand.h index 02e6e179e..f5e7af5d4 100644 --- a/libguile/expand.h +++ b/libguile/expand.h @@ -47,8 +47,9 @@ typedef enum SCM_EXPANDED_TOPLEVEL_SET, SCM_EXPANDED_TOPLEVEL_DEFINE, SCM_EXPANDED_CONDITIONAL, - SCM_EXPANDED_APPLICATION, - SCM_EXPANDED_SEQUENCE, + SCM_EXPANDED_CALL, + SCM_EXPANDED_PRIMCALL, + SCM_EXPANDED_SEQ, SCM_EXPANDED_LAMBDA, SCM_EXPANDED_LAMBDA_CASE, SCM_EXPANDED_LET, @@ -228,30 +229,44 @@ enum #define SCM_MAKE_EXPANDED_CONDITIONAL(src, test, consequent, alternate) \ scm_c_make_struct (exp_vtables[SCM_EXPANDED_CONDITIONAL], 0, SCM_NUM_EXPANDED_CONDITIONAL_FIELDS, SCM_UNPACK (src), SCM_UNPACK (test), SCM_UNPACK (consequent), SCM_UNPACK (alternate)) -#define SCM_EXPANDED_APPLICATION_TYPE_NAME "application" -#define SCM_EXPANDED_APPLICATION_FIELD_NAMES \ +#define SCM_EXPANDED_CALL_TYPE_NAME "call" +#define SCM_EXPANDED_CALL_FIELD_NAMES \ { "src", "proc", "args", } enum { - SCM_EXPANDED_APPLICATION_SRC, - SCM_EXPANDED_APPLICATION_PROC, - SCM_EXPANDED_APPLICATION_ARGS, - SCM_NUM_EXPANDED_APPLICATION_FIELDS, + SCM_EXPANDED_CALL_SRC, + SCM_EXPANDED_CALL_PROC, + SCM_EXPANDED_CALL_ARGS, + SCM_NUM_EXPANDED_CALL_FIELDS, }; -#define SCM_MAKE_EXPANDED_APPLICATION(src, proc, args) \ - scm_c_make_struct (exp_vtables[SCM_EXPANDED_APPLICATION], 0, SCM_NUM_EXPANDED_APPLICATION_FIELDS, SCM_UNPACK (src), SCM_UNPACK (proc), SCM_UNPACK (args)) +#define SCM_MAKE_EXPANDED_CALL(src, proc, args) \ + scm_c_make_struct (exp_vtables[SCM_EXPANDED_CALL], 0, SCM_NUM_EXPANDED_CALL_FIELDS, SCM_UNPACK (src), SCM_UNPACK (proc), SCM_UNPACK (args)) -#define SCM_EXPANDED_SEQUENCE_TYPE_NAME "sequence" -#define SCM_EXPANDED_SEQUENCE_FIELD_NAMES \ - { "src", "exps", } +#define SCM_EXPANDED_PRIMCALL_TYPE_NAME "primcall" +#define SCM_EXPANDED_PRIMCALL_FIELD_NAMES \ + { "src", "name", "args", } enum { - SCM_EXPANDED_SEQUENCE_SRC, - SCM_EXPANDED_SEQUENCE_EXPS, - SCM_NUM_EXPANDED_SEQUENCE_FIELDS, + SCM_EXPANDED_PRIMCALL_SRC, + SCM_EXPANDED_PRIMCALL_NAME, + SCM_EXPANDED_PRIMCALL_ARGS, + SCM_NUM_EXPANDED_PRIMCALL_FIELDS, }; -#define SCM_MAKE_EXPANDED_SEQUENCE(src, exps) \ - scm_c_make_struct (exp_vtables[SCM_EXPANDED_SEQUENCE], 0, SCM_NUM_EXPANDED_SEQUENCE_FIELDS, SCM_UNPACK (src), SCM_UNPACK (exps)) +#define SCM_MAKE_EXPANDED_PRIMCALL(src, name, args) \ + scm_c_make_struct (exp_vtables[SCM_EXPANDED_PRIMCALL], 0, SCM_NUM_EXPANDED_PRIMCALL_FIELDS, SCM_UNPACK (src), SCM_UNPACK (name), SCM_UNPACK (args)) + +#define SCM_EXPANDED_SEQ_TYPE_NAME "seq" +#define SCM_EXPANDED_SEQ_FIELD_NAMES \ + { "src", "head", "tail", } +enum + { + SCM_EXPANDED_SEQ_SRC, + SCM_EXPANDED_SEQ_HEAD, + SCM_EXPANDED_SEQ_TAIL, + SCM_NUM_EXPANDED_SEQ_FIELDS, + }; +#define SCM_MAKE_EXPANDED_SEQ(src, head, tail) \ + scm_c_make_struct (exp_vtables[SCM_EXPANDED_SEQ], 0, SCM_NUM_EXPANDED_SEQ_FIELDS, SCM_UNPACK (src), SCM_UNPACK (head), SCM_UNPACK (tail)) #define SCM_EXPANDED_LAMBDA_TYPE_NAME "lambda" #define SCM_EXPANDED_LAMBDA_FIELD_NAMES \ diff --git a/libguile/feature.c b/libguile/feature.c index 700740319..ca83421eb 100644 --- a/libguile/feature.c +++ b/libguile/feature.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995,1996,1998,1999,2000,2001,2002, 2003, 2004, 2006, 2007, 2009 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996,1998,1999,2000,2001,2002, 2003, 2004, 2006, 2007, 2009, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -43,7 +43,7 @@ void scm_add_feature (const char *str) { SCM old = SCM_VARIABLE_REF (features_var); - SCM new = scm_cons (scm_from_locale_symbol (str), old); + SCM new = scm_cons (scm_from_utf8_symbol (str), old); SCM_VARIABLE_SET (features_var, new); } @@ -108,21 +108,13 @@ scm_init_feature() #ifdef vms scm_add_feature(s_ed); #endif -#ifdef SICP - scm_add_feature("sicp"); -#endif #ifndef GO32 scm_add_feature("char-ready?"); #endif -#ifndef CHEAP_CONTINUATIONS - scm_add_feature ("full-continuation"); -#endif #if SCM_USE_PTHREAD_THREADS scm_add_feature ("threads"); #endif - scm_c_define ("char-code-limit", scm_from_int (SCM_CHAR_CODE_LIMIT)); - #include "libguile/feature.x" } diff --git a/libguile/filesys.c b/libguile/filesys.c index f60032818..3856b4412 100644 --- a/libguile/filesys.c +++ b/libguile/filesys.c @@ -1027,7 +1027,7 @@ SCM_DEFINE (scm_fsync, "fsync", 1, 0, 0, if (SCM_OPFPORTP (object)) { - scm_flush (object); + scm_flush_unlocked (object); fdes = SCM_FPORT_FDES (object); } else @@ -1797,12 +1797,12 @@ SCM_DEFINE (scm_closedir, "closedir", 1, 0, 0, static int scm_dir_print (SCM exp, SCM port, scm_print_state *pstate SCM_UNUSED) { - scm_puts ("#<", port); + scm_puts_unlocked ("#<", port); if (!SCM_DIR_OPEN_P (exp)) - scm_puts ("closed: ", port); - scm_puts ("directory stream ", port); + scm_puts_unlocked ("closed: ", port); + scm_puts_unlocked ("directory stream ", port); scm_uintprint (SCM_SMOB_DATA_1 (exp), 16, port); - scm_putc ('>', port); + scm_putc_unlocked ('>', port); return 1; } diff --git a/libguile/filesys.h b/libguile/filesys.h index 967ce7450..c420992bd 100644 --- a/libguile/filesys.h +++ b/libguile/filesys.h @@ -3,7 +3,7 @@ #ifndef SCM_FILESYS_H #define SCM_FILESYS_H -/* Copyright (C) 1995,1997,1998,1999,2000,2001, 2006, 2008, 2009, 2010 Free Software Foundation, Inc. +/* Copyright (C) 1995,1997,1998,1999,2000,2001, 2006, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -31,7 +31,7 @@ SCM_API scm_t_bits scm_tc16_dir; #define SCM_DIR_FLAG_OPEN (1L << 0) -#define SCM_DIRP(x) (!SCM_IMP (x) && (SCM_TYP16 (x) == scm_tc16_dir)) +#define SCM_DIRP(x) (SCM_HAS_TYP16 (x, scm_tc16_dir)) #define SCM_DIR_OPEN_P(x) (SCM_SMOB_FLAGS (x) & SCM_DIR_FLAG_OPEN) diff --git a/libguile/fluids.c b/libguile/fluids.c index f92c5dddc..0c9c03ff8 100644 --- a/libguile/fluids.c +++ b/libguile/fluids.c @@ -79,25 +79,25 @@ grow_dynamic_state (SCM state) void scm_i_fluid_print (SCM exp, SCM port, scm_print_state *pstate SCM_UNUSED) { - scm_puts ("#<fluid ", port); + scm_puts_unlocked ("#<fluid ", port); scm_intprint ((int) FLUID_NUM (exp), 10, port); - scm_putc ('>', port); + scm_putc_unlocked ('>', port); } void scm_i_dynamic_state_print (SCM exp, SCM port, scm_print_state *pstate SCM_UNUSED) { - scm_puts ("#<dynamic-state ", port); + scm_puts_unlocked ("#<dynamic-state ", port); scm_intprint (SCM_UNPACK (exp), 16, port); - scm_putc ('>', port); + scm_putc_unlocked ('>', port); } void scm_i_with_fluids_print (SCM exp, SCM port, scm_print_state *pstate SCM_UNUSED) { - scm_puts ("#<with-fluids ", port); + scm_puts_unlocked ("#<with-fluids ", port); scm_intprint (SCM_UNPACK (exp), 16, port); - scm_putc ('>', port); + scm_putc_unlocked ('>', port); } @@ -156,11 +156,11 @@ new_fluid (SCM init) allocated_fluids_len += FLUID_GROW; } - allocated_fluids[n] = SCM2PTR (fluid); + allocated_fluids[n] = SCM_UNPACK_POINTER (fluid); SCM_SET_CELL_WORD_0 (fluid, (scm_tc7_fluid | (n << 8))); GC_GENERAL_REGISTER_DISAPPEARING_LINK (&allocated_fluids[n], - SCM2PTR (fluid)); + SCM_HEAP_OBJECT_BASE (fluid)); scm_dynwind_end (); diff --git a/libguile/fluids.h b/libguile/fluids.h index 2b91ff3d1..7d134b922 100644 --- a/libguile/fluids.h +++ b/libguile/fluids.h @@ -32,7 +32,7 @@ always in the same place for a given thread, in the dynamic-state vector. */ -#define SCM_WITH_FLUIDS_P(x) (!SCM_IMP (x) && SCM_TYP7(x) == scm_tc7_with_fluids) +#define SCM_WITH_FLUIDS_P(x) (SCM_HAS_TYP7 (x, scm_tc7_with_fluids)) #define SCM_WITH_FLUIDS_LEN(x) (SCM_CELL_WORD ((x), 0) >> 8) #define SCM_WITH_FLUIDS_NTH_FLUID(x,n) (SCM_CELL_OBJECT ((x), 1 + (n)*2)) #define SCM_WITH_FLUIDS_NTH_VAL(x,n) (SCM_CELL_OBJECT ((x), 2 + (n)*2)) @@ -54,7 +54,7 @@ grow. */ -#define SCM_FLUID_P(x) (!SCM_IMP (x) && SCM_TYP7 (x) == scm_tc7_fluid) +#define SCM_FLUID_P(x) (SCM_HAS_TYP7 (x, scm_tc7_fluid)) #ifdef BUILDING_LIBGUILE #define SCM_I_FLUID_NUM(x) ((size_t)(SCM_CELL_WORD_0 (x) >> 8)) #define SCM_I_FLUID_DEFAULT(x) (SCM_CELL_OBJECT_1 (x)) @@ -83,7 +83,7 @@ SCM_API SCM scm_with_fluid (SCM fluid, SCM val, SCM thunk); SCM_API void scm_dynwind_fluid (SCM fluid, SCM value); #ifdef BUILDING_LIBGUILE -#define SCM_I_DYNAMIC_STATE_P(x) (!SCM_IMP (x) && SCM_TYP7 (x) == scm_tc7_dynamic_state) +#define SCM_I_DYNAMIC_STATE_P(x) (SCM_HAS_TYP7 (x, scm_tc7_dynamic_state)) #define SCM_I_DYNAMIC_STATE_FLUIDS(x) SCM_PACK (SCM_CELL_WORD_1 (x)) #endif diff --git a/libguile/foreign.c b/libguile/foreign.c index f3af157b3..bb88cf563 100644 --- a/libguile/foreign.c +++ b/libguile/foreign.c @@ -87,22 +87,19 @@ static SCM cif_to_procedure (SCM cif, SCM func_ptr); static SCM pointer_weak_refs = SCM_BOOL_F; -static scm_i_pthread_mutex_t weak_refs_lock = SCM_I_PTHREAD_MUTEX_INITIALIZER; static void register_weak_reference (SCM from, SCM to) { - scm_i_pthread_mutex_lock (&weak_refs_lock); - scm_hashq_set_x (pointer_weak_refs, from, to); - scm_i_pthread_mutex_unlock (&weak_refs_lock); + scm_weak_table_putq_x (pointer_weak_refs, from, to); } static void pointer_finalizer_trampoline (GC_PTR ptr, GC_PTR data) { scm_t_pointer_finalizer finalizer = data; - finalizer (SCM_POINTER_VALUE (PTR2SCM (ptr))); + finalizer (SCM_POINTER_VALUE (SCM_PACK_POINTER (ptr))); } SCM_DEFINE (scm_pointer_p, "pointer?", 1, 0, 0, @@ -155,7 +152,7 @@ scm_from_pointer (void *ptr, scm_t_pointer_finalizer finalizer) /* Register a finalizer for the newly created instance. */ GC_finalization_proc prev_finalizer; GC_PTR prev_finalizer_data; - GC_REGISTER_FINALIZER_NO_ORDER (SCM2PTR (ret), + GC_REGISTER_FINALIZER_NO_ORDER (SCM_HEAP_OBJECT_BASE (ret), pointer_finalizer_trampoline, finalizer, &prev_finalizer, @@ -198,7 +195,7 @@ SCM_DEFINE (scm_scm_to_pointer, "scm->pointer", 1, 0, 0, SCM ret; ret = scm_from_pointer ((void*) SCM_UNPACK (scm), NULL); - if (SCM_NIMP (ret)) + if (SCM_HEAP_OBJECT_P (ret)) register_weak_reference (ret, scm); return ret; @@ -269,8 +266,8 @@ SCM_DEFINE (scm_pointer_to_bytevector, "pointer->bytevector", 2, 2, 0, blen = scm_to_size_t (len); - ret = scm_c_take_typed_bytevector (ptr + boffset, blen, btype); - register_weak_reference (ret, pointer); + ret = scm_c_take_typed_bytevector (ptr + boffset, blen, btype, pointer); + return ret; } #undef FUNC_NAME @@ -320,7 +317,7 @@ SCM_DEFINE (scm_set_pointer_finalizer_x, "set-pointer-finalizer!", 2, 0, 0, SCM_SET_CELL_WORD_0 (pointer, SCM_CELL_WORD_0 (pointer) | (1 << 16UL)); - GC_REGISTER_FINALIZER_NO_ORDER (SCM2PTR (pointer), + GC_REGISTER_FINALIZER_NO_ORDER (SCM_HEAP_OBJECT_BASE (pointer), pointer_finalizer_trampoline, c_finalizer, &prev_finalizer, @@ -333,9 +330,9 @@ SCM_DEFINE (scm_set_pointer_finalizer_x, "set-pointer-finalizer!", 2, 0, 0, void scm_i_pointer_print (SCM pointer, SCM port, scm_print_state *pstate) { - scm_puts ("#<pointer 0x", port); + scm_puts_unlocked ("#<pointer 0x", port); scm_uintprint (scm_to_uintptr (scm_pointer_address (pointer)), 16, port); - scm_putc ('>', port); + scm_putc_unlocked ('>', port); } @@ -1105,7 +1102,7 @@ invoke_closure (ffi_cif *cif, void *ret, void **args, void *data) size_t i; SCM proc, *argv, result; - proc = PTR2SCM (data); + proc = SCM_PACK_POINTER (data); argv = alloca (cif->nargs * sizeof (*argv)); @@ -1136,7 +1133,7 @@ SCM_DEFINE (scm_procedure_to_pointer, "procedure->pointer", 3, 0, 0, closure = ffi_closure_alloc (sizeof (ffi_closure), &executable); err = ffi_prep_closure_loc ((ffi_closure *) closure, cif, - invoke_closure, SCM2PTR (proc), + invoke_closure, SCM_UNPACK_POINTER (proc), executable); if (err != FFI_OK) { @@ -1282,7 +1279,7 @@ scm_register_foreign (void) "scm_init_foreign", (scm_t_extension_init_func)scm_init_foreign, NULL); - pointer_weak_refs = scm_make_weak_key_hash_table (SCM_UNDEFINED); + pointer_weak_refs = scm_c_make_weak_table (0, SCM_WEAK_TABLE_KIND_KEY); } /* diff --git a/libguile/foreign.h b/libguile/foreign.h index 6c6f37306..eac4ca048 100644 --- a/libguile/foreign.h +++ b/libguile/foreign.h @@ -49,8 +49,7 @@ typedef enum scm_t_foreign_type scm_t_foreign_type; typedef void (*scm_t_pointer_finalizer) (void *); -#define SCM_POINTER_P(x) \ - (!SCM_IMP (x) && SCM_TYP7(x) == scm_tc7_pointer) +#define SCM_POINTER_P(x) (SCM_HAS_TYP7 (x, scm_tc7_pointer)) #define SCM_VALIDATE_POINTER(pos, x) \ SCM_MAKE_VALIDATE (pos, x, POINTER_P) #define SCM_POINTER_VALUE(x) \ diff --git a/libguile/fports.c b/libguile/fports.c index 1348b8b5c..683c25bde 100644 --- a/libguile/fports.c +++ b/libguile/fports.c @@ -215,7 +215,7 @@ SCM_DEFINE (scm_setvbuf, "setvbuf", 2, 1, 0, drained = scm_nullstr; if (SCM_OUTPUT_PORT_P (port)) - scm_flush (port); + scm_flush_unlocked (port); if (pt->read_buf == pt->putback_buf) { @@ -534,7 +534,7 @@ scm_i_fdes_to_port (int fdes, long mode_bits, SCM name) #define FUNC_NAME "scm_fdes_to_port" { SCM port; - scm_t_port *pt; + scm_t_fport *fp; int flags; /* test that fdes is valid. */ @@ -553,26 +553,21 @@ scm_i_fdes_to_port (int fdes, long mode_bits, SCM name) SCM_MISC_ERROR ("requested file mode not available on fdes", SCM_EOL); } - scm_i_scm_pthread_mutex_lock (&scm_i_port_table_mutex); + fp = (scm_t_fport *) scm_gc_malloc_pointerless (sizeof (scm_t_fport), + "file port"); + fp->fdes = fdes; + + port = scm_c_make_port (scm_tc16_fport, mode_bits, (scm_t_bits)fp); + + SCM_PTAB_ENTRY (port)->rw_random = SCM_FDES_RANDOM_P (fdes); + + if (mode_bits & SCM_BUF0) + scm_fport_buffer_add (port, 0, 0); + else + scm_fport_buffer_add (port, -1, -1); - port = scm_new_port_table_entry (scm_tc16_fport); - SCM_SET_CELL_TYPE(port, scm_tc16_fport | mode_bits); - pt = SCM_PTAB_ENTRY(port); - { - scm_t_fport *fp - = (scm_t_fport *) scm_gc_malloc_pointerless (sizeof (scm_t_fport), - "file port"); - - fp->fdes = fdes; - pt->rw_random = SCM_FDES_RANDOM_P (fdes); - SCM_SETSTREAM (port, fp); - if (mode_bits & SCM_BUF0) - scm_fport_buffer_add (port, 0, 0); - else - scm_fport_buffer_add (port, -1, -1); - } SCM_SET_FILENAME (port, name); - scm_i_pthread_mutex_unlock (&scm_i_port_table_mutex); + return port; } #undef FUNC_NAME @@ -641,7 +636,7 @@ fport_input_waiting (SCM port) static int fport_print (SCM exp, SCM port, scm_print_state *pstate SCM_UNUSED) { - scm_puts ("#<", port); + scm_puts_unlocked ("#<", port); scm_print_port_mode (exp, port); if (SCM_OPFPORTP (exp)) { @@ -650,8 +645,8 @@ fport_print (SCM exp, SCM port, scm_print_state *pstate SCM_UNUSED) if (scm_is_string (name) || scm_is_symbol (name)) scm_display (name, port); else - scm_puts (SCM_PTOBNAME (SCM_PTOBNUM (exp)), port); - scm_putc (' ', port); + scm_puts_unlocked (SCM_PTOBNAME (SCM_PTOBNUM (exp)), port); + scm_putc_unlocked (' ', port); fdes = (SCM_FSTREAM (exp))->fdes; #if (defined HAVE_TTYNAME) && (defined HAVE_POSIX) @@ -663,11 +658,11 @@ fport_print (SCM exp, SCM port, scm_print_state *pstate SCM_UNUSED) } else { - scm_puts (SCM_PTOBNAME (SCM_PTOBNUM (exp)), port); - scm_putc (' ', port); + scm_puts_unlocked (SCM_PTOBNAME (SCM_PTOBNUM (exp)), port); + scm_putc_unlocked (' ', port); scm_uintprint ((scm_t_bits) SCM_PTAB_ENTRY (exp), 16, port); } - scm_putc ('>', port); + scm_putc_unlocked ('>', port); return 1; } @@ -722,7 +717,7 @@ fport_seek (SCM port, scm_t_off offset, int whence) if (offset != 0 || whence != SEEK_CUR) { /* could expand to avoid a second seek. */ - scm_end_input (port); + scm_end_input_unlocked (port); result = rv = lseek_or_lseek64 (fp->fdes, offset, whence); } else diff --git a/libguile/fports.h b/libguile/fports.h index cbef0f8ec..32b6a5947 100644 --- a/libguile/fports.h +++ b/libguile/fports.h @@ -3,7 +3,7 @@ #ifndef SCM_FPORTS_H #define SCM_FPORTS_H -/* Copyright (C) 1995,1996,1997,1998,1999,2000,2001, 2006, 2008, 2009 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996,1997,1998,1999,2000,2001, 2006, 2008, 2009, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -39,7 +39,7 @@ SCM_API scm_t_bits scm_tc16_fport; #define SCM_FSTREAM(x) ((scm_t_fport *) SCM_STREAM (x)) #define SCM_FPORT_FDES(x) (SCM_FSTREAM (x)->fdes) -#define SCM_FPORTP(x) (!SCM_IMP (x) && (SCM_TYP16 (x) == scm_tc16_fport)) +#define SCM_FPORTP(x) (SCM_HAS_TYP16 (x, scm_tc16_fport)) #define SCM_OPFPORTP(x) (SCM_FPORTP (x) && (SCM_CELL_WORD_0 (x) & SCM_OPN)) #define SCM_OPINFPORTP(x) (SCM_OPFPORTP (x) && (SCM_CELL_WORD_0 (x) & SCM_RDNG)) #define SCM_OPOUTFPORTP(x) (SCM_OPFPORTP (x) && (SCM_CELL_WORD_0 (x) & SCM_WRTNG)) diff --git a/libguile/frames.c b/libguile/frames.c index 2e83cde9a..b805137a4 100644 --- a/libguile/frames.c +++ b/libguile/frames.c @@ -45,12 +45,12 @@ scm_c_make_frame (SCM stack_holder, SCM *fp, SCM *sp, void scm_i_frame_print (SCM frame, SCM port, scm_print_state *pstate) { - scm_puts ("#<frame ", port); + scm_puts_unlocked ("#<frame ", port); scm_uintprint (SCM_UNPACK (frame), 16, port); - scm_putc (' ', port); + scm_putc_unlocked (' ', port); scm_write (scm_frame_procedure (frame), port); /* don't write args, they can get us into trouble. */ - scm_puts (">", port); + scm_puts_unlocked (">", port); } diff --git a/libguile/frames.h b/libguile/frames.h index ffb577a8a..cae2bd0c0 100644 --- a/libguile/frames.h +++ b/libguile/frames.h @@ -111,7 +111,7 @@ struct scm_frame scm_t_ptrdiff offset; }; -#define SCM_VM_FRAME_P(x) (SCM_NIMP (x) && SCM_TYP7 (x) == scm_tc7_frame) +#define SCM_VM_FRAME_P(x) (SCM_HAS_TYP7 (x, scm_tc7_frame)) #define SCM_VM_FRAME_DATA(x) ((struct scm_frame*)SCM_CELL_WORD_1 (x)) #define SCM_VM_FRAME_STACK_HOLDER(f) SCM_VM_FRAME_DATA(f)->stack_holder #define SCM_VM_FRAME_FP(f) SCM_VM_FRAME_DATA(f)->fp diff --git a/libguile/gc-malloc.c b/libguile/gc-malloc.c index a7dab2a7e..3b64159cb 100644 --- a/libguile/gc-malloc.c +++ b/libguile/gc-malloc.c @@ -44,7 +44,6 @@ extern unsigned long * __libc_ia64_register_backing_store_base; #include "libguile/root.h" #include "libguile/strings.h" #include "libguile/vectors.h" -#include "libguile/weaks.h" #include "libguile/hashtab.h" #include "libguile/tags.h" @@ -240,106 +239,3 @@ scm_gc_strdup (const char *str, const char *what) { return scm_gc_strndup (str, strlen (str), what); } - -#if SCM_ENABLE_DEPRECATED == 1 - -/* {Deprecated front end to malloc} - * - * scm_must_malloc, scm_must_realloc, scm_must_free, scm_done_malloc, - * scm_done_free - * - * These functions provide services comparable to malloc, realloc, and - * free. - * - * There has been a fair amount of confusion around the use of these functions; - * see "Memory Blocks" in the manual. They are totally unnecessary in 2.0 given - * the Boehm GC. - */ - -void * -scm_must_malloc (size_t size, const char *what) -{ - scm_c_issue_deprecation_warning - ("scm_must_malloc is deprecated. " - "Use scm_gc_malloc and scm_gc_free instead."); - - return scm_gc_malloc (size, what); -} - -void * -scm_must_realloc (void *where, - size_t old_size, - size_t size, - const char *what) -{ - scm_c_issue_deprecation_warning - ("scm_must_realloc is deprecated. " - "Use scm_gc_realloc and scm_gc_free instead."); - - return scm_gc_realloc (where, old_size, size, what); -} - -char * -scm_must_strndup (const char *str, size_t length) -{ - scm_c_issue_deprecation_warning - ("scm_must_strndup is deprecated. " - "Use scm_gc_strndup and scm_gc_free instead."); - - return scm_gc_strndup (str, length, "string"); -} - -char * -scm_must_strdup (const char *str) -{ - scm_c_issue_deprecation_warning - ("scm_must_strdup is deprecated. " - "Use scm_gc_strdup and scm_gc_free instead."); - - return scm_gc_strdup (str, "string"); -} - -void -scm_must_free (void *obj) -#define FUNC_NAME "scm_must_free" -{ - scm_c_issue_deprecation_warning - ("scm_must_free is deprecated. " - "Use scm_gc_malloc and scm_gc_free instead."); - -#ifdef GUILE_DEBUG_MALLOC - scm_malloc_unregister (obj); -#endif - - GC_FREE (obj); -} -#undef FUNC_NAME - - -void -scm_done_malloc (long size) -{ - scm_c_issue_deprecation_warning - ("scm_done_malloc is deprecated. " - "Use scm_gc_register_collectable_memory instead."); - - if (size >= 0) - scm_gc_register_collectable_memory (NULL, size, "foreign mallocs"); - else - scm_gc_unregister_collectable_memory (NULL, -size, "foreign mallocs"); -} - -void -scm_done_free (long size) -{ - scm_c_issue_deprecation_warning - ("scm_done_free is deprecated. " - "Use scm_gc_unregister_collectable_memory instead."); - - if (size >= 0) - scm_gc_unregister_collectable_memory (NULL, size, "foreign mallocs"); - else - scm_gc_register_collectable_memory (NULL, -size, "foreign mallocs"); -} - -#endif /* SCM_ENABLE_DEPRECATED == 1 */ diff --git a/libguile/gc.c b/libguile/gc.c index ff1ebe6b1..71e713383 100644 --- a/libguile/gc.c +++ b/libguile/gc.c @@ -46,7 +46,6 @@ extern unsigned long * __libc_ia64_register_backing_store_base; #include "libguile/root.h" #include "libguile/strings.h" #include "libguile/vectors.h" -#include "libguile/weaks.h" #include "libguile/hashtab.h" #include "libguile/tags.h" @@ -83,14 +82,10 @@ int scm_expensive_debug_cell_accesses_p = 0; */ int scm_debug_cells_gc_interval = 0; -#if SCM_ENABLE_DEPRECATED == 1 /* Hash table that keeps a reference to objects the user wants to protect from - garbage collection. It could arguably be private but applications have come - to rely on it (e.g., Lilypond 2.13.9). */ -SCM scm_protects; -#else + garbage collection. */ static SCM scm_protects; -#endif + #if (SCM_DEBUG_CELL_ACCESSES == 1) @@ -948,6 +943,10 @@ scm_i_tag_name (scm_t_bits tag) return "foreign"; case scm_tc7_hashtable: return "hashtable"; + case scm_tc7_weak_set: + return "weak-set"; + case scm_tc7_weak_table: + return "weak-table"; case scm_tc7_fluid: return "fluid"; case scm_tc7_dynamic_state: diff --git a/libguile/gc.h b/libguile/gc.h index 310569d29..30d06995e 100644 --- a/libguile/gc.h +++ b/libguile/gc.h @@ -35,22 +35,9 @@ typedef struct scm_t_cell SCM word_1; } scm_t_cell; -/* Cray machines have pointers that are incremented once for each - * word, rather than each byte, the 3 most significant bits encode the - * byte within the word. The following macros deal with this by - * storing the native Cray pointers like the ones that looks like scm - * expects. This is done for any pointers that point to a cell, - * pointers to scm_vector elts, functions, &c are not munged. - */ -#ifdef _UNICOS -# define SCM2PTR(x) ((scm_t_cell *) (SCM_UNPACK (x) >> 3)) -# define PTR2SCM(x) (SCM_PACK (((scm_t_bits) (x)) << 3)) -#else -# define SCM2PTR(x) ((scm_t_cell *) (SCM_UNPACK (x))) -# define PTR2SCM(x) (SCM_PACK ((scm_t_bits) (x))) -#endif /* def _UNICOS */ - - +/* FIXME: deprecate. */ +#define PTR2SCM(x) (SCM_PACK_POINTER (x)) +#define SCM2PTR(x) ((scm_t_cell *) (SCM_UNPACK_POINTER (x))) /* Low level cell data accessing macros. These macros should only be used * from within code related to garbage collection issues, since they will @@ -58,12 +45,13 @@ typedef struct scm_t_cell * in debug mode. In particular these macros will even work for free cells, * which should never be encountered by user code. */ -#define SCM_GC_CELL_OBJECT(x, n) (((SCM *)SCM2PTR (x)) [n]) -#define SCM_GC_CELL_WORD(x, n) (SCM_UNPACK (SCM_GC_CELL_OBJECT ((x), (n)))) +#define SCM_GC_CELL_OBJECT(x, n) (SCM_PACK (SCM_HEAP_OBJECT_BASE (x)[n])) +#define SCM_GC_CELL_WORD(x, n) (SCM_HEAP_OBJECT_BASE (x)[n]) -#define SCM_GC_SET_CELL_OBJECT(x, n, v) ((((SCM *)SCM2PTR (x)) [n]) = (v)) +#define SCM_GC_SET_CELL_OBJECT(x, n, v) \ + (SCM_HEAP_OBJECT_BASE (x)[n] = SCM_UNPACK (v)) #define SCM_GC_SET_CELL_WORD(x, n, v) \ - (SCM_GC_SET_CELL_OBJECT ((x), (n), SCM_PACK (v))) + (SCM_HEAP_OBJECT_BASE (x)[n] = (v)) #define SCM_GC_CELL_TYPE(x) (SCM_GC_CELL_OBJECT ((x), 0)) @@ -109,7 +97,8 @@ typedef struct scm_t_cell #define SCM_SET_CELL_OBJECT_2(x, v) SCM_SET_CELL_OBJECT ((x), 2, (v)) #define SCM_SET_CELL_OBJECT_3(x, v) SCM_SET_CELL_OBJECT ((x), 3, (v)) -#define SCM_CELL_OBJECT_LOC(x, n) (SCM_VALIDATE_CELL((x), &SCM_GC_CELL_OBJECT ((x), (n)))) +#define SCM_CELL_WORD_LOC(x, n) (SCM_VALIDATE_CELL((x), &SCM_GC_CELL_WORD ((x), (n)))) +#define SCM_CELL_OBJECT_LOC(x, n) ((SCM *) SCM_CELL_WORD_LOC (x, n)) #define SCM_CARLOC(x) (SCM_CELL_OBJECT_LOC ((x), 0)) #define SCM_CDRLOC(x) (SCM_CELL_OBJECT_LOC ((x), 1)) @@ -138,20 +127,6 @@ void *scm_ia64_ar_bsp (const void *); -#if (SCM_ENABLE_DEPRECATED == 1) -SCM_DEPRECATED size_t scm_default_init_heap_size_1; -SCM_DEPRECATED int scm_default_min_yield_1; -SCM_DEPRECATED size_t scm_default_init_heap_size_2; -SCM_DEPRECATED int scm_default_min_yield_2; -SCM_DEPRECATED size_t scm_default_max_segment_size; -#else -#define scm_default_init_heap_size_1 deprecated -#define scm_default_min_yield_1 deprecated -#define scm_default_init_heap_size_2 deprecated -#define scm_default_min_yield_2 deprecated -#define scm_default_max_segment_size deprecated -#endif - SCM_API unsigned long scm_gc_ports_collected; SCM_API SCM scm_after_gc_hook; @@ -207,6 +182,114 @@ SCM_API char *scm_gc_strdup (const char *str, const char *what) SCM_API char *scm_gc_strndup (const char *str, size_t n, const char *what) SCM_MALLOC; + +#ifdef BUILDING_LIBGUILE +#include "libguile/bdw-gc.h" +#define SCM_GC_MALLOC(size) GC_MALLOC (size) +#define SCM_GC_MALLOC_POINTERLESS(size) GC_MALLOC_ATOMIC (size) +#else +#define SCM_GC_MALLOC(size) scm_gc_malloc (size, NULL) +#define SCM_GC_MALLOC_POINTERLESS(size) scm_gc_malloc_pointerless (size, NULL) +#endif + + +SCM_INLINE SCM scm_cell (scm_t_bits car, scm_t_bits cdr); +SCM_INLINE SCM scm_double_cell (scm_t_bits car, scm_t_bits cbr, + scm_t_bits ccr, scm_t_bits cdr); +SCM_INLINE SCM scm_words (scm_t_bits car, scm_t_uint16 n_words); + +#if SCM_CAN_INLINE || defined SCM_INLINE_C_IMPLEMENTING_INLINES + +SCM_INLINE_IMPLEMENTATION SCM +scm_cell (scm_t_bits car, scm_t_bits cdr) +{ + SCM cell = SCM_PACK_POINTER (SCM_GC_MALLOC (sizeof (scm_t_cell))); + + /* Initialize the type slot last so that the cell is ignored by the GC + until it is completely initialized. This is only relevant when the GC + can actually run during this code, which it can't since the GC only runs + when all other threads are stopped. */ + SCM_GC_SET_CELL_WORD (cell, 1, cdr); + SCM_GC_SET_CELL_WORD (cell, 0, car); + + return cell; +} + +SCM_INLINE_IMPLEMENTATION SCM +scm_double_cell (scm_t_bits car, scm_t_bits cbr, + scm_t_bits ccr, scm_t_bits cdr) +{ + SCM z; + + z = SCM_PACK_POINTER (SCM_GC_MALLOC (2 * sizeof (scm_t_cell))); + /* Initialize the type slot last so that the cell is ignored by the + GC until it is completely initialized. This is only relevant + when the GC can actually run during this code, which it can't + since the GC only runs when all other threads are stopped. + */ + SCM_GC_SET_CELL_WORD (z, 1, cbr); + SCM_GC_SET_CELL_WORD (z, 2, ccr); + SCM_GC_SET_CELL_WORD (z, 3, cdr); + SCM_GC_SET_CELL_WORD (z, 0, car); + + /* When this function is inlined, it's possible that the last + SCM_GC_SET_CELL_WORD above will be adjacent to a following + initialization of z. E.g., it occurred in scm_make_real. GCC + from around version 3 (e.g., certainly 3.2) began taking + advantage of strict C aliasing rules which say that it's OK to + interchange the initialization above and the one below when the + pointer types appear to differ sufficiently. We don't want that, + of course. GCC allows this behaviour to be disabled with the + -fno-strict-aliasing option, but would also need to be supplied + by Guile users. Instead, the following statements prevent the + reordering. + */ +#ifdef __GNUC__ + __asm__ volatile ("" : : : "memory"); +#else + /* portable version, just in case any other compiler does the same + thing. */ + scm_remember_upto_here_1 (z); +#endif + + return z; +} + +SCM_INLINE_IMPLEMENTATION SCM +scm_words (scm_t_bits car, scm_t_uint16 n_words) +{ + SCM z; + + z = SCM_PACK_POINTER (SCM_GC_MALLOC (sizeof (scm_t_bits) * n_words)); + SCM_GC_SET_CELL_WORD (z, 0, car); + + /* FIXME: is the following concern even relevant with BDW-GC? */ + + /* When this function is inlined, it's possible that the last + SCM_GC_SET_CELL_WORD above will be adjacent to a following + initialization of z. E.g., it occurred in scm_make_real. GCC + from around version 3 (e.g., certainly 3.2) began taking + advantage of strict C aliasing rules which say that it's OK to + interchange the initialization above and the one below when the + pointer types appear to differ sufficiently. We don't want that, + of course. GCC allows this behaviour to be disabled with the + -fno-strict-aliasing option, but would also need to be supplied + by Guile users. Instead, the following statements prevent the + reordering. + */ +#ifdef __GNUC__ + __asm__ volatile ("" : : : "memory"); +#else + /* portable version, just in case any other compiler does the same + thing. */ + scm_remember_upto_here_1 (z); +#endif + + return z; +} + +#endif /* SCM_CAN_INLINE || defined SCM_INLINE_C_IMPLEMENTING_INLINES */ + SCM_API void scm_remember_upto_here_1 (SCM obj); SCM_API void scm_remember_upto_here_2 (SCM obj1, SCM obj2); SCM_API void scm_remember_upto_here (SCM obj1, ...); @@ -244,35 +327,10 @@ SCM_API void scm_gc_register_root (SCM *p); SCM_API void scm_gc_unregister_root (SCM *p); SCM_API void scm_gc_register_roots (SCM *b, unsigned long n); SCM_API void scm_gc_unregister_roots (SCM *b, unsigned long n); -#if SCM_ENABLE_DEPRECATED == 1 -SCM_DEPRECATED SCM scm_protects; -#endif SCM_INTERNAL void scm_storage_prehistory (void); SCM_INTERNAL void scm_init_gc_protect_object (void); SCM_INTERNAL void scm_init_gc (void); -#if SCM_ENABLE_DEPRECATED == 1 - -SCM_DEPRECATED SCM scm_deprecated_newcell (void); -SCM_DEPRECATED SCM scm_deprecated_newcell2 (void); - -#define SCM_NEWCELL(_into) \ - do { _into = scm_deprecated_newcell (); } while (0) -#define SCM_NEWCELL2(_into) \ - do { _into = scm_deprecated_newcell2 (); } while (0) - -SCM_DEPRECATED void * scm_must_malloc (size_t len, const char *what); -SCM_DEPRECATED void * scm_must_realloc (void *where, - size_t olen, size_t len, - const char *what); -SCM_DEPRECATED char *scm_must_strdup (const char *str); -SCM_DEPRECATED char *scm_must_strndup (const char *str, size_t n); -SCM_DEPRECATED void scm_done_malloc (long size); -SCM_DEPRECATED void scm_done_free (long size); -SCM_DEPRECATED void scm_must_free (void *obj); - -#endif - #endif /* SCM_GC_H */ /* diff --git a/libguile/gdbint.c b/libguile/gdbint.c index 77fdbd17a..b502c7c46 100644 --- a/libguile/gdbint.c +++ b/libguile/gdbint.c @@ -150,7 +150,7 @@ gdb_read (char *str) SCM_BEGIN_FOREIGN_BLOCK; unmark_port (gdb_input_port); scm_seek (gdb_input_port, SCM_INUM0, scm_from_int (SEEK_SET)); - scm_puts (str, gdb_input_port); + scm_puts_unlocked (str, gdb_input_port); scm_truncate_file (gdb_input_port, SCM_UNDEFINED); scm_seek (gdb_input_port, SCM_INUM0, scm_from_int (SEEK_SET)); @@ -158,7 +158,7 @@ gdb_read (char *str) ans = scm_read (gdb_input_port); if (SCM_GC_P) { - if (SCM_NIMP (ans)) + if (SCM_HEAP_OBJECT_P (ans)) { SEND_STRING ("Non-immediate created during gc. Memory may be trashed."); status = -1; @@ -167,7 +167,7 @@ gdb_read (char *str) } gdb_result = ans; /* Protect answer from future GC (FIXME: still needed with BDW-GC?) */ - if (SCM_NIMP (ans)) + if (SCM_HEAP_OBJECT_P (ans)) scm_permanent_object (ans); exit: remark_port (gdb_input_port); @@ -213,7 +213,7 @@ gdb_print (SCM obj) { scm_t_port *pt = SCM_PTAB_ENTRY (gdb_output_port); - scm_flush (gdb_output_port); + scm_flush_unlocked (gdb_output_port); *(pt->write_buf + pt->read_buf_size) = 0; SEND_STRING (pt->read_buf); } diff --git a/libguile/gen-scmconfig.c b/libguile/gen-scmconfig.c index 176f25c02..422f826c3 100644 --- a/libguile/gen-scmconfig.c +++ b/libguile/gen-scmconfig.c @@ -37,9 +37,9 @@ - use 1 and 0 for public #defines instead of "def and undef", i.e. use #define SCM_HAVE_FOO rather than just not defining SCM_HAVE_FOO whenever possible. See GNU Coding Guidelines for - rationale. The only notable non-deprecated exceptions to this - rule are GUILE_DEBUG and GUILE_DEBUG_FREELIST which do not follow - this convention in order to retain backward compatibility. + rationale. The only notable non-deprecated exception to this rule + is GUILE_DEBUG which does not follow this convention in order to + retain backward compatibility. - in the code below, be *VERY* careful not to use or rely on any runtime-dynamic information below. For example, you cannot use @@ -383,15 +383,6 @@ main (int argc, char *argv[]) #endif pf ("\n"); - pf ("#if SCM_ENABLE_DEPRECATED == 1\n" - "# define USE_THREADS 1 /* always true now */\n" - "# define GUILE_ISELECT 1 /* always true now */\n" - "# define READER_EXTENSIONS 1 /* always true now */\n" - "# define DEBUG_EXTENSIONS 1 /* always true now */\n" - "# define DYNAMIC_LINKING 1 /* always true now */\n" - "#endif\n"); - printf ("\n"); - pf ("#define SCM_HAVE_ARRAYS 1 /* always true now */\n"); pf ("\n"); diff --git a/libguile/goops.c b/libguile/goops.c index 31fa17975..df1a64f7f 100644 --- a/libguile/goops.c +++ b/libguile/goops.c @@ -53,7 +53,6 @@ #include "libguile/strings.h" #include "libguile/strports.h" #include "libguile/vectors.h" -#include "libguile/weaks.h" #include "libguile/vm.h" #include "libguile/validate.h" @@ -85,13 +84,6 @@ SCM_SYMBOL (sym_change_class, "change-class"); SCM_VARIABLE (scm_var_make_extended_generic, "make-extended-generic"); -/* FIXME, exports should come from the scm file only */ -#define DEFVAR(v, val) \ - { scm_module_define (scm_module_goops, (v), (val)); \ - scm_module_export (scm_module_goops, scm_list_1 ((v))); \ - } - - /* Class redefinition protocol: A class is represented by a heap header h1 which points to a @@ -170,7 +162,6 @@ static SCM class_bytevector; static SCM class_uvec; static SCM vtable_class_map = SCM_BOOL_F; -static scm_i_pthread_mutex_t vtable_class_map_lock = SCM_I_PTHREAD_MUTEX_INITIALIZER; /* Port classes. Allocate 3 times the maximum number of port types so that input ports, output ports, and in/out ports can be stored at different @@ -198,17 +189,15 @@ scm_i_define_class_for_vtable (SCM vtable) { SCM class; - scm_i_pthread_mutex_lock (&vtable_class_map_lock); - + scm_i_pthread_mutex_lock (&scm_i_misc_mutex); if (scm_is_false (vtable_class_map)) - vtable_class_map = scm_make_weak_key_hash_table (SCM_UNDEFINED); + vtable_class_map = scm_c_make_weak_table (0, SCM_WEAK_TABLE_KIND_KEY); + scm_i_pthread_mutex_unlock (&scm_i_misc_mutex); if (scm_is_false (scm_struct_vtable_p (vtable))) abort (); - class = scm_hashq_ref (vtable_class_map, vtable, SCM_BOOL_F); - - scm_i_pthread_mutex_unlock (&vtable_class_map_lock); + class = scm_weak_table_refq (vtable_class_map, vtable, SCM_BOOL_F); if (scm_is_false (class)) { @@ -227,9 +216,7 @@ scm_i_define_class_for_vtable (SCM vtable) /* Don't worry about races. This only happens when creating a vtable, which happens by definition in one thread. */ - scm_i_pthread_mutex_lock (&vtable_class_map_lock); - scm_hashq_set_x (vtable_class_map, vtable, class); - scm_i_pthread_mutex_unlock (&vtable_class_map_lock); + scm_weak_table_putq_x (vtable_class_map, vtable, class); } return class; @@ -928,7 +915,6 @@ SCM_SYMBOL (sym_cpl, "cpl"); SCM_SYMBOL (sym_default_slot_definition_class, "default-slot-definition-class"); SCM_SYMBOL (sym_slots, "slots"); SCM_SYMBOL (sym_getters_n_setters, "getters-n-setters"); -SCM_SYMBOL (sym_keyword_access, "keyword-access"); SCM_SYMBOL (sym_nfields, "nfields"); @@ -963,7 +949,6 @@ build_class_class_slots (void) scm_list_1 (sym_default_slot_definition_class), scm_list_1 (sym_slots), scm_list_1 (sym_getters_n_setters), - scm_list_1 (sym_keyword_access), scm_list_1 (sym_nfields), SCM_UNDEFINED); } @@ -976,7 +961,7 @@ create_basic_classes (void) /**** <class> ****/ SCM cs = scm_from_locale_string (SCM_CLASS_CLASS_LAYOUT); SCM name = scm_from_latin1_symbol ("<class>"); - scm_class_class = scm_make_vtable_vtable (cs, SCM_INUM0, SCM_EOL); + scm_class_class = scm_i_make_vtable_vtable (cs); SCM_SET_CLASS_FLAGS (scm_class_class, (SCM_CLASSF_GOOPS_OR_VALID | SCM_CLASSF_METACLASS)); @@ -994,21 +979,21 @@ create_basic_classes (void) prep_hashsets (scm_class_class); - DEFVAR(name, scm_class_class); + scm_module_define (scm_module_goops, name, scm_class_class); /**** <top> ****/ name = scm_from_latin1_symbol ("<top>"); scm_class_top = scm_basic_make_class (scm_class_class, name, SCM_EOL, SCM_EOL); - DEFVAR(name, scm_class_top); + scm_module_define (scm_module_goops, name, scm_class_top); /**** <object> ****/ name = scm_from_latin1_symbol ("<object>"); scm_class_object = scm_basic_make_class (scm_class_class, name, scm_list_1 (scm_class_top), SCM_EOL); - DEFVAR (name, scm_class_object); + scm_module_define (scm_module_goops, name, scm_class_object); /* <top> <object> and <class> were partially initialized. Correct them here */ SCM_SET_SLOT (scm_class_object, scm_si_direct_subclasses, scm_list_1 (scm_class_class)); @@ -1727,36 +1712,6 @@ SCM_KEYWORD (k_name, "name"); SCM_GLOBAL_SYMBOL (scm_sym_args, "args"); -SCM -scm_apply_generic (SCM gf, SCM args) -{ - return scm_apply (SCM_STRUCT_PROCEDURE (gf), args, SCM_EOL); -} - -SCM -scm_call_generic_0 (SCM gf) -{ - return scm_call_0 (SCM_STRUCT_PROCEDURE (gf)); -} - -SCM -scm_call_generic_1 (SCM gf, SCM a1) -{ - return scm_call_1 (SCM_STRUCT_PROCEDURE (gf), a1); -} - -SCM -scm_call_generic_2 (SCM gf, SCM a1, SCM a2) -{ - return scm_call_2 (SCM_STRUCT_PROCEDURE (gf), a1, a2); -} - -SCM -scm_call_generic_3 (SCM gf, SCM a1, SCM a2, SCM a3) -{ - return scm_call_3 (SCM_STRUCT_PROCEDURE (gf), a1, a2, a3); -} - SCM_SYMBOL (sym_delayed_compile, "delayed-compile"); static SCM make_dispatch_procedure (SCM gf) @@ -1900,6 +1855,47 @@ setup_extended_primitive_generics () } } +/* Dirk:FIXME:: In all of these scm_wta_dispatch_* routines it is + * assumed that 'gf' is zero if uninitialized. It would be cleaner if + * some valid SCM value like SCM_BOOL_F or SCM_UNDEFINED were chosen. + */ + +SCM +scm_wta_dispatch_0 (SCM gf, const char *subr) +{ + if (!SCM_UNPACK (gf)) + scm_error_num_args_subr (subr); + + return scm_call_0 (gf); +} + +SCM +scm_wta_dispatch_1 (SCM gf, SCM a1, int pos, const char *subr) +{ + if (!SCM_UNPACK (gf)) + scm_wrong_type_arg (subr, pos, a1); + + return scm_call_1 (gf, a1); +} + +SCM +scm_wta_dispatch_2 (SCM gf, SCM a1, SCM a2, int pos, const char *subr) +{ + if (!SCM_UNPACK (gf)) + scm_wrong_type_arg (subr, pos, (pos == SCM_ARG1) ? a1 : a2); + + return scm_call_2 (gf, a1, a2); +} + +SCM +scm_wta_dispatch_n (SCM gf, SCM args, int pos, const char *subr) +{ + if (!SCM_UNPACK (gf)) + scm_wrong_type_arg (subr, pos, scm_list_ref (args, scm_from_int (pos))); + + return scm_apply_0 (gf, args); +} + /****************************************************************************** * * Protocol for calling a generic fumction @@ -2361,12 +2357,12 @@ fix_cpl (SCM c, SCM before, SCM after) static void make_stdcls (SCM *var, char *name, SCM meta, SCM super, SCM slots) { - SCM tmp = scm_from_locale_symbol (name); + SCM tmp = scm_from_utf8_symbol (name); *var = scm_basic_make_class (meta, tmp, scm_is_pair (super) ? super : scm_list_1 (super), slots); - DEFVAR(tmp, *var); + scm_module_define (scm_module_goops, tmp, *var); } @@ -2562,30 +2558,25 @@ create_standard_classes (void) static SCM make_class_from_template (char const *template, char const *type_name, SCM supers, int applicablep) { - SCM class, name; + SCM name; if (type_name) { char buffer[100]; sprintf (buffer, template, type_name); - name = scm_from_locale_symbol (buffer); + name = scm_from_utf8_symbol (buffer); } else name = SCM_GOOPS_UNBOUND; - class = scm_basic_make_class (applicablep ? scm_class_procedure_class : scm_class_class, - name, supers, SCM_EOL); - - /* Only define name if doesn't already exist. */ - if (!SCM_GOOPS_UNBOUNDP (name) - && scm_is_false (scm_module_variable (scm_module_goops, name))) - DEFVAR (name, class); - return class; + return scm_basic_make_class (applicablep ? scm_class_procedure_class : scm_class_class, + name, supers, SCM_EOL); } static SCM make_class_from_symbol (SCM type_name_sym, SCM supers, int applicablep) { - SCM class, name; + SCM name; + if (scm_is_true (type_name_sym)) { name = scm_string_append (scm_list_3 (scm_from_locale_string ("<"), @@ -2596,14 +2587,8 @@ make_class_from_symbol (SCM type_name_sym, SCM supers, int applicablep) else name = SCM_GOOPS_UNBOUND; - class = scm_basic_make_class (applicablep ? scm_class_procedure_class : scm_class_class, - name, supers, SCM_EOL); - - /* Only define name if doesn't already exist. */ - if (!SCM_GOOPS_UNBOUNDP (name) - && scm_is_false (scm_module_variable (scm_module_goops, name))) - DEFVAR (name, class); - return class; + return scm_basic_make_class (applicablep ? scm_class_procedure_class : scm_class_class, + name, supers, SCM_EOL); } SCM @@ -2711,7 +2696,7 @@ create_port_classes (void) { long i; - for (i = 0; i < scm_numptob; ++i) + for (i = scm_c_num_port_types () - 1; i >= 0; i--) scm_make_port_classes (i, SCM_PTOBNAME (i)); } @@ -2833,7 +2818,7 @@ scm_init_goops_builtins (void) SCM name = scm_from_latin1_symbol ("no-applicable-method"); scm_no_applicable_method = scm_make (scm_list_3 (scm_class_generic, k_name, name)); - DEFVAR (name, scm_no_applicable_method); + scm_module_define (scm_module_goops, name, scm_no_applicable_method); } return SCM_UNSPECIFIED; diff --git a/libguile/goops.h b/libguile/goops.h index 47a6e4eca..b3071b039 100644 --- a/libguile/goops.h +++ b/libguile/goops.h @@ -79,7 +79,6 @@ "pw" /* default-slot-definition-class */ \ "pw" /* slots */ \ "pw" /* getters-n-setters */ \ - "pw" /* keyword access */ \ "pw" /* nfields */ #define scm_si_redefined (scm_vtable_offset_user + 0) @@ -99,11 +98,9 @@ #define scm_si_cpl (scm_vtable_offset_user + 13) /* (class ...) */ #define scm_si_slotdef_class (scm_vtable_offset_user + 14) #define scm_si_slots (scm_vtable_offset_user + 15) /* ((name . options) ...) */ -#define scm_si_name_access (scm_vtable_offset_user + 16) -#define scm_si_getters_n_setters scm_si_name_access -#define scm_si_keyword_access (scm_vtable_offset_user + 17) -#define scm_si_nfields (scm_vtable_offset_user + 18) /* an integer */ -#define SCM_N_CLASS_SLOTS (scm_vtable_offset_user + 19) +#define scm_si_getters_n_setters (scm_vtable_offset_user + 16) +#define scm_si_nfields (scm_vtable_offset_user + 17) /* an integer */ +#define SCM_N_CLASS_SLOTS (scm_vtable_offset_user + 18) typedef struct scm_t_method { SCM generic_function; @@ -299,13 +296,14 @@ SCM_API SCM scm_make (SCM args); SCM_API SCM scm_find_method (SCM args); SCM_API SCM scm_sys_method_more_specific_p (SCM m1, SCM m2, SCM targs); SCM_API void scm_change_object_class (SCM, SCM, SCM); -/* The following are declared in __scm.h -SCM_API SCM scm_call_generic_0 (SCM gf); -SCM_API SCM scm_call_generic_1 (SCM gf, SCM a1); -SCM_API SCM scm_call_generic_2 (SCM gf, SCM a1, SCM a2); -SCM_API SCM scm_apply_generic (SCM gf, SCM args); -*/ -SCM_API SCM scm_call_generic_3 (SCM gf, SCM a1, SCM a2, SCM a3); + +/* These procedures are for dispatching to a generic when a primitive + fails to apply. They raise a wrong-type-arg error if the primitive's + generic has not been initialized yet. */ +SCM_API SCM scm_wta_dispatch_0 (SCM gf, const char *subr); +SCM_API SCM scm_wta_dispatch_1 (SCM gf, SCM a1, int pos, const char *subr); +SCM_API SCM scm_wta_dispatch_2 (SCM gf, SCM a1, SCM a2, int pos, const char *subr); +SCM_API SCM scm_wta_dispatch_n (SCM gf, SCM args, int pos, const char *subr); SCM_INTERNAL SCM scm_i_define_class_for_vtable (SCM vtable); diff --git a/libguile/gsubr.c b/libguile/gsubr.c index b6f261faf..84846cf35 100644 --- a/libguile/gsubr.c +++ b/libguile/gsubr.c @@ -791,7 +791,7 @@ create_gsubr (int define, const char *name, scm_t_bits flags; /* make objtable */ - sname = scm_from_locale_symbol (name); + sname = scm_from_utf8_symbol (name); table = scm_c_make_vector (generic_loc ? 3 : 2, SCM_UNDEFINED); SCM_SIMPLE_VECTOR_SET (table, 0, scm_from_pointer (fcn, NULL)); SCM_SIMPLE_VECTOR_SET (table, 1, sname); @@ -858,13 +858,13 @@ scm_c_define_gsubr_with_generic (const char *name, SCM gsubr_21l(SCM req1, SCM req2, SCM opt, SCM rst) { - scm_puts ("gsubr-2-1-l:\n req1: ", scm_cur_outp); + scm_puts_unlocked ("gsubr-2-1-l:\n req1: ", scm_cur_outp); scm_display(req1, scm_cur_outp); - scm_puts ("\n req2: ", scm_cur_outp); + scm_puts_unlocked ("\n req2: ", scm_cur_outp); scm_display(req2, scm_cur_outp); - scm_puts ("\n opt: ", scm_cur_outp); + scm_puts_unlocked ("\n opt: ", scm_cur_outp); scm_display(opt, scm_cur_outp); - scm_puts ("\n rest: ", scm_cur_outp); + scm_puts_unlocked ("\n rest: ", scm_cur_outp); scm_display(rst, scm_cur_outp); scm_newline(scm_cur_outp); return SCM_UNSPECIFIED; diff --git a/libguile/guardians.c b/libguile/guardians.c index 81313df31..532137857 100644 --- a/libguile/guardians.c +++ b/libguile/guardians.c @@ -57,7 +57,6 @@ #include "libguile/validate.h" #include "libguile/root.h" #include "libguile/hashtab.h" -#include "libguile/weaks.h" #include "libguile/deprecation.h" #include "libguile/eval.h" @@ -87,16 +86,16 @@ guardian_print (SCM guardian, SCM port, scm_print_state *pstate SCM_UNUSED) { t_guardian *g = GUARDIAN_DATA (guardian); - scm_puts ("#<guardian ", port); + scm_puts_unlocked ("#<guardian ", port); scm_uintprint ((scm_t_bits) g, 16, port); - scm_puts (" (reachable: ", port); + scm_puts_unlocked (" (reachable: ", port); scm_display (scm_from_uint (g->live), port); - scm_puts (" unreachable: ", port); + scm_puts_unlocked (" unreachable: ", port); scm_display (scm_length (g->zombies), port); - scm_puts (")", port); + scm_puts_unlocked (")", port); - scm_puts (">", port); + scm_puts_unlocked (">", port); return 1; } @@ -109,9 +108,9 @@ finalize_guarded (GC_PTR ptr, GC_PTR finalizer_data) SCM cell_pool; SCM obj, guardian_list, proxied_finalizer; - obj = PTR2SCM (ptr); - guardian_list = SCM_CDR (PTR2SCM (finalizer_data)); - proxied_finalizer = SCM_CAR (PTR2SCM (finalizer_data)); + obj = SCM_PACK_POINTER (ptr); + guardian_list = SCM_CDR (SCM_PACK_POINTER (finalizer_data)); + proxied_finalizer = SCM_CAR (SCM_PACK_POINTER (finalizer_data)); #ifdef DEBUG_GUARDIANS printf ("finalizing guarded %p (%u guardians)\n", @@ -131,9 +130,12 @@ finalize_guarded (GC_PTR ptr, GC_PTR finalizer_data) guardian_list = SCM_CDR (guardian_list)) { SCM zombies; + SCM guardian; t_guardian *g; - if (SCM_WEAK_PAIR_CAR_DELETED_P (guardian_list)) + guardian = scm_c_weak_vector_ref (scm_car (guardian_list), 0); + + if (scm_is_false (guardian)) { /* The guardian itself vanished in the meantime. */ #ifdef DEBUG_GUARDIANS @@ -142,7 +144,7 @@ finalize_guarded (GC_PTR ptr, GC_PTR finalizer_data) continue; } - g = GUARDIAN_DATA (SCM_CAR (guardian_list)); + g = GUARDIAN_DATA (guardian); if (g->live == 0) abort (); @@ -166,8 +168,8 @@ finalize_guarded (GC_PTR ptr, GC_PTR finalizer_data) GC_finalization_proc finalizer, prev_finalizer; GC_PTR finalizer_data, prev_finalizer_data; - finalizer = (GC_finalization_proc) SCM2PTR (SCM_CAR (proxied_finalizer)); - finalizer_data = SCM2PTR (SCM_CDR (proxied_finalizer)); + finalizer = (GC_finalization_proc) SCM_UNPACK_POINTER (SCM_CAR (proxied_finalizer)); + finalizer_data = SCM_UNPACK_POINTER (SCM_CDR (proxied_finalizer)); if (finalizer == NULL) abort (); @@ -191,7 +193,7 @@ scm_i_guard (SCM guardian, SCM obj) { t_guardian *g = GUARDIAN_DATA (guardian); - if (SCM_NIMP (obj)) + if (SCM_HEAP_OBJECT_P (obj)) { /* Register a finalizer and pass a pair as the ``client data'' argument. The pair contains in its car `#f' or a pair describing a @@ -209,13 +211,17 @@ scm_i_guard (SCM guardian, SCM obj) g->live++; - /* Note: GUARDIANS_FOR_OBJ is a weak list so that a guardian can be - collected before the objects it guards (see `guardians.test'). */ - guardians_for_obj = scm_weak_car_pair (guardian, SCM_EOL); + /* Note: GUARDIANS_FOR_OBJ holds weak references to guardians so + that a guardian can be collected before the objects it guards + (see `guardians.test'). */ + guardians_for_obj = scm_cons (scm_make_weak_vector (SCM_INUM1, guardian), + SCM_EOL); finalizer_data = scm_cons (SCM_BOOL_F, guardians_for_obj); - GC_REGISTER_FINALIZER_NO_ORDER (SCM2PTR (obj), finalize_guarded, - SCM2PTR (finalizer_data), + /* FIXME: should be SCM_HEAP_OBJECT_BASE, but will the finalizer + strip the tag bits of pairs or structs? */ + GC_REGISTER_FINALIZER_NO_ORDER (SCM_UNPACK_POINTER (obj), finalize_guarded, + SCM_UNPACK_POINTER (finalizer_data), &prev_finalizer, &prev_data); if (prev_finalizer == finalize_guarded) @@ -227,7 +233,7 @@ scm_i_guard (SCM guardian, SCM obj) if (prev_data == NULL) abort (); - prev_finalizer_data = PTR2SCM (prev_data); + prev_finalizer_data = SCM_PACK_POINTER (prev_data); if (!scm_is_pair (prev_finalizer_data)) abort (); @@ -244,8 +250,8 @@ scm_i_guard (SCM guardian, SCM obj) `finalize_guarded ()' has finished. */ SCM proxied_finalizer; - proxied_finalizer = scm_cons (PTR2SCM (prev_finalizer), - PTR2SCM (prev_data)); + proxied_finalizer = scm_cons (SCM_PACK_POINTER (prev_finalizer), + SCM_PACK_POINTER (prev_data)); SCM_SETCAR (finalizer_data, proxied_finalizer); } } diff --git a/libguile/guile.c b/libguile/guile.c index ac22b83df..133afc43e 100644 --- a/libguile/guile.c +++ b/libguile/guile.c @@ -1,5 +1,6 @@ -/* Copyright (C) 1996,1997,2000,2001, 2006, 2008, 2011 Free Software Foundation, Inc. - * +/* Copyright (C) 1996, 1997, 2000, 2001, 2006, 2008, + * 2011 Free Software Foundation, Inc. + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 3 of @@ -36,6 +37,7 @@ #include <libguile/scmconfig.h> #endif #include <ltdl.h> +#include <locale.h> #ifdef HAVE_WINSOCK2_H #include <winsock2.h> @@ -67,6 +69,14 @@ inner_main (void *closure SCM_UNUSED, int argc, char **argv) int main (int argc, char **argv) { + /* Install the locale right at the beginning so that string conversion + for command-line arguments, along with possible error messages, use + the right locale. See + <https://lists.gnu.org/archive/html/guile-devel/2011-11/msg00041.html> + for the rationale. */ + if (setlocale (LC_ALL, "") == NULL) + fprintf (stderr, "guile: warning: failed to install locale\n"); + scm_install_gmp_memory_functions = 1; scm_boot_guile (argc, argv, inner_main, 0); return 0; /* never reached */ diff --git a/libguile/hash.c b/libguile/hash.c index a79f03d95..d47c7e054 100644 --- a/libguile/hash.c +++ b/libguile/hash.c @@ -45,232 +45,271 @@ extern double floor(); #endif +/* This hash function is originally from + http://burtleburtle.net/bob/c/lookup3.c by Bob Jenkins, May 2006, + Public Domain. No warranty. */ + +#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k)))) +#define mix(a,b,c) \ +{ \ + a -= c; a ^= rot(c, 4); c += b; \ + b -= a; b ^= rot(a, 6); a += c; \ + c -= b; c ^= rot(b, 8); b += a; \ + a -= c; a ^= rot(c,16); c += b; \ + b -= a; b ^= rot(a,19); a += c; \ + c -= b; c ^= rot(b, 4); b += a; \ +} + +#define final(a,b,c) \ +{ \ + c ^= b; c -= rot(b,14); \ + a ^= c; a -= rot(c,11); \ + b ^= a; b -= rot(a,25); \ + c ^= b; c -= rot(b,16); \ + a ^= c; a -= rot(c,4); \ + b ^= a; b -= rot(a,14); \ + c ^= b; c -= rot(b,24); \ +} + +#define JENKINS_LOOKUP3_HASHWORD2(k, length, ret) \ + do { \ + scm_t_uint32 a, b, c; \ + \ + /* Set up the internal state. */ \ + a = b = c = 0xdeadbeef + ((scm_t_uint32)(length<<2)) + 47; \ + \ + /* Handle most of the key. */ \ + while (length > 3) \ + { \ + a += k[0]; \ + b += k[1]; \ + c += k[2]; \ + mix (a, b, c); \ + length -= 3; \ + k += 3; \ + } \ + \ + /* Handle the last 3 elements. */ \ + switch(length) /* All the case statements fall through. */ \ + { \ + case 3 : c += k[2]; \ + case 2 : b += k[1]; \ + case 1 : a += k[0]; \ + final (a, b, c); \ + case 0: /* case 0: nothing left to add */ \ + break; \ + } \ + \ + if (sizeof (ret) == 8) \ + ret = (((unsigned long) c) << 32) | b; \ + else \ + ret = c; \ + } while (0) + + +static unsigned long +narrow_string_hash (const scm_t_uint8 *str, size_t len) +{ + unsigned long ret; + JENKINS_LOOKUP3_HASHWORD2 (str, len, ret); + ret >>= 2; /* Ensure that it fits in a fixnum. */ + return ret; +} + +static unsigned long +wide_string_hash (const scm_t_wchar *str, size_t len) +{ + unsigned long ret; + JENKINS_LOOKUP3_HASHWORD2 (str, len, ret); + ret >>= 2; /* Ensure that it fits in a fixnum. */ + return ret; +} + unsigned long scm_string_hash (const unsigned char *str, size_t len) { - /* from suggestion at: */ - /* http://srfi.schemers.org/srfi-13/mail-archive/msg00112.html */ - - unsigned long h = 0; - while (len-- > 0) - h = *str++ + h*37; - return h; + return narrow_string_hash (str, len); } unsigned long scm_i_string_hash (SCM str) { size_t len = scm_i_string_length (str); - size_t i = 0; - unsigned long h = 0; - while (len-- > 0) - h = (unsigned long) scm_i_string_ref (str, i++) + h * 37; - - scm_remember_upto_here_1 (str); - return h; + if (scm_i_is_narrow_string (str)) + return narrow_string_hash ((const scm_t_uint8 *) scm_i_string_chars (str), + len); + else + return wide_string_hash (scm_i_string_wide_chars (str), len); } unsigned long scm_i_locale_string_hash (const char *str, size_t len) { -#ifdef HAVE_WCHAR_H - mbstate_t state; - wchar_t c; - size_t byte_idx = 0, nbytes; - unsigned long h = 0; - - if (len == (size_t) -1) - len = strlen (str); - - while ((nbytes = mbrtowc (&c, str + byte_idx, len - byte_idx, &state)) > 0) - { - if (nbytes >= (size_t) -2) - /* Invalid input string; punt. */ - return scm_i_string_hash (scm_from_locale_stringn (str, len)); - - h = (unsigned long) c + h * 37; - byte_idx += nbytes; - } - - return h; -#else return scm_i_string_hash (scm_from_locale_stringn (str, len)); -#endif } unsigned long scm_i_latin1_string_hash (const char *str, size_t len) { - const scm_t_uint8 *ustr = (const scm_t_uint8 *) str; - size_t i = 0; - unsigned long h = 0; - if (len == (size_t) -1) len = strlen (str); - for (; i < len; i++) - h = (unsigned long) ustr[i] + h * 37; - - return h; + return narrow_string_hash ((const scm_t_uint8 *) str, len); } +/* A tricky optimization, but probably worth it. */ unsigned long scm_i_utf8_string_hash (const char *str, size_t len) { - const scm_t_uint8 *ustr = (const scm_t_uint8 *) str; - size_t byte_idx = 0; - unsigned long h = 0; - + const scm_t_uint8 *end, *ustr = (const scm_t_uint8 *) str; + unsigned long ret; + + /* The length of the string in characters. This name corresponds to + Jenkins' original name. */ + size_t length; + + scm_t_uint32 a, b, c, u32; + if (len == (size_t) -1) len = strlen (str); - while (byte_idx < len) + end = ustr + len; + + if (u8_check (ustr, len) != NULL) + /* Invalid UTF-8; punt. */ + return scm_i_string_hash (scm_from_utf8_stringn (str, len)); + + length = u8_strnlen (ustr, len); + + /* Set up the internal state. */ + a = b = c = 0xdeadbeef + ((scm_t_uint32)(length<<2)) + 47; + + /* Handle most of the key. */ + while (length > 3) { - ucs4_t c; - int nbytes; - - nbytes = u8_mbtouc (&c, ustr + byte_idx, len - byte_idx); - if (nbytes == 0) - break; - else if (nbytes < 0) - /* Bad UTF-8; punt. */ - return scm_i_string_hash (scm_from_utf8_stringn (str, len)); - - h = (unsigned long) c + h * 37; - byte_idx += nbytes; + ustr += u8_mbtouc_unsafe (&u32, ustr, end - ustr); + a += u32; + ustr += u8_mbtouc_unsafe (&u32, ustr, end - ustr); + b += u32; + ustr += u8_mbtouc_unsafe (&u32, ustr, end - ustr); + c += u32; + mix (a, b, c); + length -= 3; } - return h; -} + /* Handle the last 3 elements's. */ + ustr += u8_mbtouc_unsafe (&u32, ustr, end - ustr); + a += u32; + if (--length) + { + ustr += u8_mbtouc_unsafe (&u32, ustr, end - ustr); + b += u32; + if (--length) + { + ustr += u8_mbtouc_unsafe (&u32, ustr, end - ustr); + c += u32; + } + } + final (a, b, c); -/* Dirk:FIXME:: why downcase for characters? (2x: scm_hasher, scm_ihashv) */ -/* Dirk:FIXME:: scm_hasher could be made static. */ + if (sizeof (unsigned long) == 8) + ret = (((unsigned long) c) << 32) | b; + else + ret = c; + + ret >>= 2; /* Ensure that it fits in a fixnum. */ + return ret; +} -unsigned long -scm_hasher(SCM obj, unsigned long n, size_t d) +/* Thomas Wang's integer hasher, from + http://www.cris.com/~Ttwang/tech/inthash.htm. */ +static unsigned long +scm_raw_ihashq (scm_t_bits key) { - switch (SCM_ITAG3 (obj)) { - case scm_tc3_int_1: - case scm_tc3_int_2: - return SCM_I_INUM(obj) % n; /* SCM_INUMP(obj) */ - case scm_tc3_imm24: - if (SCM_CHARP(obj)) - return (unsigned)(scm_c_downcase(SCM_CHAR(obj))) % n; - switch (SCM_UNPACK (obj)) { - case SCM_EOL_BITS: - d = 256; - break; - case SCM_BOOL_T_BITS: - d = 257; - break; - case SCM_BOOL_F_BITS: - d = 258; - break; - case SCM_EOF_VAL_BITS: - d = 259; - break; - default: - d = 263; /* perhaps should be error */ + if (sizeof (key) < 8) + { + key = (key ^ 61) ^ (key >> 16); + key = key + (key << 3); + key = key ^ (key >> 4); + key = key * 0x27d4eb2d; + key = key ^ (key >> 15); } - return d % n; - default: - return 263 % n; /* perhaps should be error */ - case scm_tc3_cons: - switch SCM_TYP7(obj) { - default: - return 263 % n; + else + { + key = (~key) + (key << 21); // key = (key << 21) - key - 1; + key = key ^ (key >> 24); + key = (key + (key << 3)) + (key << 8); // key * 265 + key = key ^ (key >> 14); + key = (key + (key << 2)) + (key << 4); // key * 21 + key = key ^ (key >> 28); + key = key + (key << 31); + } + key >>= 2; /* Ensure that it fits in a fixnum. */ + return key; +} + +/* `depth' is used to limit recursion. */ +static unsigned long +scm_raw_ihash (SCM obj, size_t depth) +{ + if (SCM_IMP (obj)) + return scm_raw_ihashq (SCM_UNPACK (obj)); + + switch (SCM_TYP7(obj)) + { + /* FIXME: do better for structs, variables, ... Also the hashes + are currently associative, which ain't the right thing. */ case scm_tc7_smob: - return 263 % n; + return scm_raw_ihashq (SCM_TYP16 (obj)); case scm_tc7_number: - switch SCM_TYP16 (obj) { - case scm_tc16_big: - return scm_to_ulong (scm_modulo (obj, scm_from_ulong (n))); - case scm_tc16_real: - { - double r = SCM_REAL_VALUE (obj); - if (floor (r) == r && !isinf (r) && !isnan (r)) - { - obj = scm_inexact_to_exact (obj); - return scm_to_ulong (scm_modulo (obj, scm_from_ulong (n))); - } - } - /* Fall through */ - case scm_tc16_complex: - case scm_tc16_fraction: - obj = scm_number_to_string (obj, scm_from_int (10)); - /* Fall through */ - } - /* Fall through */ + if (scm_is_integer (obj)) + { + SCM n = SCM_I_MAKINUM (SCM_MOST_POSITIVE_FIXNUM); + if (scm_is_inexact (obj)) + obj = scm_inexact_to_exact (obj); + return scm_raw_ihashq (scm_to_ulong (scm_modulo (obj, n))); + } + else + return scm_i_string_hash (scm_number_to_string (obj, scm_from_int (10))); case scm_tc7_string: - { - unsigned long hash = - scm_i_string_hash (obj) % n; - return hash; - } + return scm_i_string_hash (obj); case scm_tc7_symbol: - return scm_i_symbol_hash (obj) % n; + return scm_i_symbol_hash (obj); case scm_tc7_pointer: - { - /* Pointer objects are typically used to store addresses of heap - objects. On most platforms, these are at least 3-byte - aligned (on x86_64-*-gnu, `malloc' returns 4-byte aligned - addresses), so get rid of the least significant bits. */ - scm_t_uintptr significant_bits; - - significant_bits = (scm_t_uintptr) SCM_POINTER_VALUE (obj) >> 4UL; - return (size_t) significant_bits % n; - } + return scm_raw_ihashq ((scm_t_uintptr) SCM_POINTER_VALUE (obj)); case scm_tc7_wvect: case scm_tc7_vector: { size_t len = SCM_SIMPLE_VECTOR_LENGTH (obj); - if (len > 5) - { - size_t i = d/2; - unsigned long h = 1; - while (i--) - { - SCM elt = SCM_SIMPLE_VECTOR_REF (obj, h % len); - h = ((h << 8) + (scm_hasher (elt, n, 2))) % n; - } - return h; - } - else - { - size_t i = len; - unsigned long h = (n)-1; - while (i--) - { - SCM elt = SCM_SIMPLE_VECTOR_REF (obj, h % len); - h = ((h << 8) + (scm_hasher (elt, n, d/len))) % n; - } - return h; - } + size_t i = depth / 2; + unsigned long h = scm_raw_ihashq (SCM_CELL_WORD_0 (obj)); + if (len) + while (i--) + h ^= scm_raw_ihash (scm_c_vector_ref (obj, h % len), i); + return h; } case scm_tcs_cons_imcar: case scm_tcs_cons_nimcar: - if (d) return (scm_hasher (SCM_CAR (obj), n, d/2) - + scm_hasher (SCM_CDR (obj), n, d/2)) % n; - else return 1; - case scm_tc7_port: - return ((SCM_RDNG & SCM_CELL_WORD_0 (obj)) ? 260 : 261) % n; - case scm_tc7_program: - return 262 % n; + if (depth) + return (scm_raw_ihash (SCM_CAR (obj), depth / 2) + ^ scm_raw_ihash (SCM_CDR (obj), depth / 2)); + else + return scm_raw_ihashq (scm_tc3_cons); + default: + return scm_raw_ihashq (SCM_CELL_WORD_0 (obj)); } - } } - unsigned long scm_ihashq (SCM obj, unsigned long n) { - return (SCM_UNPACK (obj) >> 1) % n; + return scm_raw_ihashq (SCM_UNPACK (obj)) % n; } @@ -300,13 +339,10 @@ SCM_DEFINE (scm_hashq, "hashq", 2, 0, 0, unsigned long scm_ihashv (SCM obj, unsigned long n) { - if (SCM_CHARP(obj)) - return ((unsigned long) (scm_c_downcase (SCM_CHAR (obj)))) % n; /* downcase!?!! */ - if (SCM_NUMP(obj)) - return (unsigned long) scm_hasher(obj, n, 10); + return scm_raw_ihash (obj, 10) % n; else - return SCM_UNPACK (obj) % n; + return scm_raw_ihashq (SCM_UNPACK (obj)) % n; } @@ -336,7 +372,7 @@ SCM_DEFINE (scm_hashv, "hashv", 2, 0, 0, unsigned long scm_ihash (SCM obj, unsigned long n) { - return (unsigned long) scm_hasher (obj, n, 10); + return (unsigned long) scm_raw_ihash (obj, 10) % n; } SCM_DEFINE (scm_hash, "hash", 2, 0, 0, diff --git a/libguile/hash.h b/libguile/hash.h index 307748617..d3e42f1c1 100644 --- a/libguile/hash.h +++ b/libguile/hash.h @@ -36,7 +36,6 @@ SCM_INTERNAL unsigned long scm_i_utf8_string_hash (const char *str, size_t len); SCM_INTERNAL unsigned long scm_i_string_hash (SCM str); -SCM_API unsigned long scm_hasher (SCM obj, unsigned long n, size_t d); SCM_API unsigned long scm_ihashq (SCM obj, unsigned long n); SCM_API SCM scm_hashq (SCM obj, SCM n); SCM_API unsigned long scm_ihashv (SCM obj, unsigned long n); diff --git a/libguile/hashtab.c b/libguile/hashtab.c index c4f2b5eb0..4091afeb9 100644 --- a/libguile/hashtab.c +++ b/libguile/hashtab.c @@ -53,9 +53,6 @@ * The implementation stores the upper and lower number of items which * trigger a resize in the hashtable object. * - * Weak hash tables use weak pairs in the bucket lists rather than - * normal pairs. - * * Possible hash table sizes (primes) are stored in the array * hashtable_size. */ @@ -75,201 +72,8 @@ static unsigned long hashtable_size[] = { static char *s_hashtable = "hashtable"; - - -/* Helper functions and macros to deal with weak pairs. - - Weak pairs need to be accessed very carefully since their components can - be nullified by the GC when the object they refer to becomes unreachable. - Hence the macros and functions below that detect such weak pairs within - buckets and remove them. */ - - -/* Remove nullified weak pairs from ALIST such that the result contains only - valid pairs. Set REMOVED_ITEMS to the number of pairs that have been - deleted. */ static SCM -scm_fixup_weak_alist (SCM alist, size_t *removed_items) -{ - SCM result; - SCM prev = SCM_EOL; - - *removed_items = 0; - for (result = alist; - scm_is_pair (alist); - alist = SCM_CDR (alist)) - { - SCM pair = SCM_CAR (alist); - - if (SCM_WEAK_PAIR_DELETED_P (pair)) - { - /* Remove from ALIST weak pair PAIR whose car/cdr has been - nullified by the GC. */ - if (scm_is_null (prev)) - result = SCM_CDR (alist); - else - SCM_SETCDR (prev, SCM_CDR (alist)); - - (*removed_items)++; - - /* Leave PREV unchanged. */ - } - else - prev = alist; - } - - return result; -} - -static void -vacuum_weak_hash_table (SCM table) -{ - SCM buckets = SCM_HASHTABLE_VECTOR (table); - unsigned long k = SCM_SIMPLE_VECTOR_LENGTH (buckets); - size_t len = SCM_HASHTABLE_N_ITEMS (table); - - while (k--) - { - size_t removed; - SCM alist = SCM_SIMPLE_VECTOR_REF (buckets, k); - alist = scm_fixup_weak_alist (alist, &removed); - assert (removed <= len); - len -= removed; - SCM_SIMPLE_VECTOR_SET (buckets, k, alist); - } - - SCM_SET_HASHTABLE_N_ITEMS (table, len); -} - - -/* Packed arguments for `do_weak_bucket_fixup'. */ -struct t_fixup_args -{ - SCM bucket; - SCM *bucket_copy; - size_t removed_items; -}; - -static void * -do_weak_bucket_fixup (void *data) -{ - struct t_fixup_args *args; - SCM pair, *copy; - - args = (struct t_fixup_args *) data; - - args->bucket = scm_fixup_weak_alist (args->bucket, &args->removed_items); - - for (pair = args->bucket, copy = args->bucket_copy; - scm_is_pair (pair); - pair = SCM_CDR (pair), copy += 2) - { - /* At this point, all weak pairs have been removed. */ - assert (!SCM_WEAK_PAIR_DELETED_P (SCM_CAR (pair))); - - /* Copy the key and value. */ - copy[0] = SCM_CAAR (pair); - copy[1] = SCM_CDAR (pair); - } - - return args; -} - -/* Lookup OBJECT in weak hash table TABLE using ASSOC. OBJECT is searched - for in the alist that is the BUCKET_INDEXth element of BUCKETS. - Optionally update TABLE and rehash it. */ -static SCM -weak_bucket_assoc (SCM table, SCM buckets, size_t bucket_index, - scm_t_hash_fn hash_fn, - scm_t_assoc_fn assoc, SCM object, void *closure) -{ - SCM result; - SCM bucket, *strong_refs; - struct t_fixup_args args; - - bucket = SCM_SIMPLE_VECTOR_REF (buckets, bucket_index); - - /* Prepare STRONG_REFS as an array large enough to hold all the keys - and values in BUCKET. */ - strong_refs = alloca (scm_ilength (bucket) * 2 * sizeof (SCM)); - - args.bucket = bucket; - args.bucket_copy = strong_refs; - - /* Fixup BUCKET. Do that with the allocation lock held to avoid - seeing disappearing links pointing to objects that have already - been reclaimed (this happens when the disappearing links that point - to it haven't yet been cleared.) - - The `do_weak_bucket_fixup' call populates STRONG_REFS with a copy - of BUCKET's entries after it's been fixed up. Thus, all the - entries kept in BUCKET are still reachable when ASSOC sees - them. */ - GC_call_with_alloc_lock (do_weak_bucket_fixup, &args); - - bucket = args.bucket; - SCM_SIMPLE_VECTOR_SET (buckets, bucket_index, bucket); - - result = assoc (object, bucket, closure); - - /* If we got a result, it should not have NULL fields. */ - if (scm_is_pair (result) && SCM_WEAK_PAIR_DELETED_P (result)) - abort (); - - scm_remember_upto_here_1 (strong_refs); - - if (args.removed_items > 0) - { - /* Update TABLE's item count and optionally trigger a rehash. */ - size_t remaining; - - assert (SCM_HASHTABLE_N_ITEMS (table) >= args.removed_items); - - remaining = SCM_HASHTABLE_N_ITEMS (table) - args.removed_items; - SCM_SET_HASHTABLE_N_ITEMS (table, remaining); - - if (remaining < SCM_HASHTABLE_LOWER (table)) - scm_i_rehash (table, hash_fn, closure, "weak_bucket_assoc"); - } - - return result; -} - - -/* Packed arguments for `weak_bucket_assoc_by_hash'. */ -struct assoc_by_hash_data -{ - SCM alist; - SCM ret; - scm_t_hash_predicate_fn predicate; - void *closure; -}; - -/* See scm_hash_fn_get_handle_by_hash below. */ -static void* -weak_bucket_assoc_by_hash (void *args) -{ - struct assoc_by_hash_data *data = args; - SCM alist = data->alist; - - for (; scm_is_pair (alist); alist = SCM_CDR (alist)) - { - SCM pair = SCM_CAR (alist); - - if (!SCM_WEAK_PAIR_DELETED_P (pair) - && data->predicate (SCM_CAR (pair), data->closure)) - { - data->ret = pair; - break; - } - } - return args; -} - - - -static SCM -make_hash_table (int flags, unsigned long k, const char *func_name) +make_hash_table (unsigned long k, const char *func_name) { SCM vector; scm_t_hashtable *t; @@ -278,9 +82,6 @@ make_hash_table (int flags, unsigned long k, const char *func_name) ++i; n = hashtable_size[i]; - /* In both cases, i.e., regardless of whether we are creating a weak hash - table, we return a non-weak vector. This is because the vector itself - is not weak in the case of a weak hash table: the alist pairs are. */ vector = scm_c_make_vector (n, SCM_EOL); t = scm_gc_malloc_pointerless (sizeof (*t), s_hashtable); @@ -288,8 +89,6 @@ make_hash_table (int flags, unsigned long k, const char *func_name) t->n_items = 0; t->lower = 0; t->upper = 9 * n / 10; - t->flags = flags; - t->hash_fn = NULL; /* FIXME: we just need two words of storage, not three */ return scm_double_cell (scm_tc7_hashtable, SCM_UNPACK (vector), @@ -322,13 +121,6 @@ scm_i_rehash (SCM table, if (i >= HASHTABLE_SIZE_N) /* don't rehash */ return; - - /* Remember HASH_FN for rehash_after_gc, but only when CLOSURE - is not needed since CLOSURE can not be guaranteed to be valid - after this function returns. - */ - if (closure == NULL) - SCM_HASHTABLE (table)->hash_fn = hash_fn; } SCM_HASHTABLE (table)->size_index = i; @@ -342,13 +134,6 @@ scm_i_rehash (SCM table, new_buckets = scm_c_make_vector (new_size, SCM_EOL); - /* When this is a weak hashtable, running the GC might change it. - We need to cope with this while rehashing its elements. We do - this by first installing the new, empty bucket vector. Then we - remove the elements from the old bucket vector and insert them - into the new one. - */ - SCM_SET_HASHTABLE_VECTOR (table, new_buckets); SCM_SET_HASHTABLE_N_ITEMS (table, 0); @@ -368,10 +153,6 @@ scm_i_rehash (SCM table, handle = SCM_CAR (cell); ls = SCM_CDR (ls); - if (SCM_WEAK_PAIR_DELETED_P (handle)) - /* HANDLE is a nullified weak pair: skip it. */ - continue; - h = hash_fn (SCM_CAR (handle), new_size, closure); if (h >= new_size) scm_out_of_range (func_name, scm_from_ulong (h)); @@ -386,26 +167,19 @@ scm_i_rehash (SCM table, void scm_i_hashtable_print (SCM exp, SCM port, scm_print_state *pstate) { - scm_puts ("#<", port); - if (SCM_HASHTABLE_WEAK_KEY_P (exp)) - scm_puts ("weak-key-", port); - else if (SCM_HASHTABLE_WEAK_VALUE_P (exp)) - scm_puts ("weak-value-", port); - else if (SCM_HASHTABLE_DOUBLY_WEAK_P (exp)) - scm_puts ("doubly-weak-", port); - scm_puts ("hash-table ", port); + scm_puts_unlocked ("#<hash-table ", port); scm_uintprint (SCM_HASHTABLE_N_ITEMS (exp), 10, port); - scm_putc ('/', port); + scm_putc_unlocked ('/', port); scm_uintprint (SCM_SIMPLE_VECTOR_LENGTH (SCM_HASHTABLE_VECTOR (exp)), 10, port); - scm_puts (">", port); + scm_puts_unlocked (">", port); } SCM scm_c_make_hash_table (unsigned long k) { - return make_hash_table (0, k, "scm_c_make_hash_table"); + return make_hash_table (k, "scm_c_make_hash_table"); } SCM_DEFINE (scm_make_hash_table, "make-hash-table", 0, 1, 0, @@ -413,171 +187,18 @@ SCM_DEFINE (scm_make_hash_table, "make-hash-table", 0, 1, 0, "Make a new abstract hash table object with minimum number of buckets @var{n}\n") #define FUNC_NAME s_scm_make_hash_table { - if (SCM_UNBNDP (n)) - return make_hash_table (0, 0, FUNC_NAME); - else - return make_hash_table (0, scm_to_ulong (n), FUNC_NAME); -} -#undef FUNC_NAME - -/* The before-gc C hook only runs if GC_set_start_callback is available, - so if not, fall back on a finalizer-based implementation. */ -static int -weak_gc_callback (void **weak) -{ - void *val = weak[0]; - void (*callback) (SCM) = weak[1]; - - if (!val) - return 0; - - callback (PTR2SCM (val)); - - return 1; -} - -#ifdef HAVE_GC_SET_START_CALLBACK -static void* -weak_gc_hook (void *hook_data, void *fn_data, void *data) -{ - if (!weak_gc_callback (fn_data)) - scm_c_hook_remove (&scm_before_gc_c_hook, weak_gc_hook, fn_data); - - return NULL; -} -#else -static void -weak_gc_finalizer (void *ptr, void *data) -{ - if (weak_gc_callback (ptr)) - GC_REGISTER_FINALIZER_NO_ORDER (ptr, weak_gc_finalizer, data, NULL, NULL); -} -#endif - -static void -scm_c_register_weak_gc_callback (SCM obj, void (*callback) (SCM)) -{ - void **weak = GC_MALLOC_ATOMIC (sizeof (void*) * 2); - - weak[0] = SCM2PTR (obj); - weak[1] = (void*)callback; - GC_GENERAL_REGISTER_DISAPPEARING_LINK (weak, SCM2PTR (obj)); - -#ifdef HAVE_GC_SET_START_CALLBACK - scm_c_hook_add (&scm_before_gc_c_hook, weak_gc_hook, weak, 0); -#else - GC_REGISTER_FINALIZER_NO_ORDER (weak, weak_gc_finalizer, NULL, NULL, NULL); -#endif -} - -SCM_DEFINE (scm_make_weak_key_hash_table, "make-weak-key-hash-table", 0, 1, 0, - (SCM n), - "@deffnx {Scheme Procedure} make-weak-value-hash-table size\n" - "@deffnx {Scheme Procedure} make-doubly-weak-hash-table size\n" - "Return a weak hash table with @var{size} buckets.\n" - "\n" - "You can modify weak hash tables in exactly the same way you\n" - "would modify regular hash tables. (@pxref{Hash Tables})") -#define FUNC_NAME s_scm_make_weak_key_hash_table -{ - SCM ret; - - if (SCM_UNBNDP (n)) - ret = make_hash_table (SCM_HASHTABLEF_WEAK_CAR, 0, FUNC_NAME); - else - ret = make_hash_table (SCM_HASHTABLEF_WEAK_CAR, - scm_to_ulong (n), FUNC_NAME); - - scm_c_register_weak_gc_callback (ret, vacuum_weak_hash_table); - - return ret; -} -#undef FUNC_NAME - - -SCM_DEFINE (scm_make_weak_value_hash_table, "make-weak-value-hash-table", 0, 1, 0, - (SCM n), - "Return a hash table with weak values with @var{size} buckets.\n" - "(@pxref{Hash Tables})") -#define FUNC_NAME s_scm_make_weak_value_hash_table -{ - SCM ret; - - if (SCM_UNBNDP (n)) - ret = make_hash_table (SCM_HASHTABLEF_WEAK_CDR, 0, FUNC_NAME); - else - ret = make_hash_table (SCM_HASHTABLEF_WEAK_CDR, - scm_to_ulong (n), FUNC_NAME); - - scm_c_register_weak_gc_callback (ret, vacuum_weak_hash_table); - - return ret; -} -#undef FUNC_NAME - - -SCM_DEFINE (scm_make_doubly_weak_hash_table, "make-doubly-weak-hash-table", 1, 0, 0, - (SCM n), - "Return a hash table with weak keys and values with @var{size}\n" - "buckets. (@pxref{Hash Tables})") -#define FUNC_NAME s_scm_make_doubly_weak_hash_table -{ - SCM ret; - - if (SCM_UNBNDP (n)) - ret = make_hash_table (SCM_HASHTABLEF_WEAK_CAR | SCM_HASHTABLEF_WEAK_CDR, - 0, FUNC_NAME); - else - ret = make_hash_table (SCM_HASHTABLEF_WEAK_CAR | SCM_HASHTABLEF_WEAK_CDR, - scm_to_ulong (n), FUNC_NAME); - - scm_c_register_weak_gc_callback (ret, vacuum_weak_hash_table); - - return ret; + return make_hash_table (SCM_UNBNDP (n) ? 0 : scm_to_ulong (n), FUNC_NAME); } #undef FUNC_NAME +#define SCM_WEAK_TABLE_P(x) (scm_is_true (scm_weak_table_p (x))) SCM_DEFINE (scm_hash_table_p, "hash-table?", 1, 0, 0, (SCM obj), "Return @code{#t} if @var{obj} is an abstract hash table object.") #define FUNC_NAME s_scm_hash_table_p { - return scm_from_bool (SCM_HASHTABLE_P (obj)); -} -#undef FUNC_NAME - - -SCM_DEFINE (scm_weak_key_hash_table_p, "weak-key-hash-table?", 1, 0, 0, - (SCM obj), - "@deffnx {Scheme Procedure} weak-value-hash-table? obj\n" - "@deffnx {Scheme Procedure} doubly-weak-hash-table? obj\n" - "Return @code{#t} if @var{obj} is the specified weak hash\n" - "table. Note that a doubly weak hash table is neither a weak key\n" - "nor a weak value hash table.") -#define FUNC_NAME s_scm_weak_key_hash_table_p -{ - return scm_from_bool (SCM_HASHTABLE_P (obj) && SCM_HASHTABLE_WEAK_KEY_P (obj)); -} -#undef FUNC_NAME - - -SCM_DEFINE (scm_weak_value_hash_table_p, "weak-value-hash-table?", 1, 0, 0, - (SCM obj), - "Return @code{#t} if @var{obj} is a weak value hash table.") -#define FUNC_NAME s_scm_weak_value_hash_table_p -{ - return scm_from_bool (SCM_HASHTABLE_P (obj) && SCM_HASHTABLE_WEAK_VALUE_P (obj)); -} -#undef FUNC_NAME - - -SCM_DEFINE (scm_doubly_weak_hash_table_p, "doubly-weak-hash-table?", 1, 0, 0, - (SCM obj), - "Return @code{#t} if @var{obj} is a doubly weak hash table.") -#define FUNC_NAME s_scm_doubly_weak_hash_table_p -{ - return scm_from_bool (SCM_HASHTABLE_P (obj) && SCM_HASHTABLE_DOUBLY_WEAK_P (obj)); + return scm_from_bool (SCM_HASHTABLE_P (obj) || SCM_WEAK_TABLE_P (obj)); } #undef FUNC_NAME @@ -602,69 +223,7 @@ scm_hash_fn_get_handle (SCM table, SCM obj, if (k >= SCM_SIMPLE_VECTOR_LENGTH (buckets)) scm_out_of_range (FUNC_NAME, scm_from_ulong (k)); - if (SCM_HASHTABLE_WEAK_P (table)) - h = weak_bucket_assoc (table, buckets, k, hash_fn, - assoc_fn, obj, closure); - else - h = assoc_fn (obj, SCM_SIMPLE_VECTOR_REF (buckets, k), closure); - - return h; -} -#undef FUNC_NAME - - -/* This procedure implements three optimizations, with respect to the - raw get_handle(): - - 1. For weak tables, it's assumed that calling the predicate in the - allocation lock is safe. In practice this means that the predicate - cannot call arbitrary scheme functions. - - 2. We don't check for overflow / underflow and rehash. - - 3. We don't actually have to allocate a key -- instead we get the - hash value directly. This is useful for, for example, looking up - strings in the symbol table. - */ -SCM -scm_hash_fn_get_handle_by_hash (SCM table, unsigned long raw_hash, - scm_t_hash_predicate_fn predicate_fn, - void *closure) -#define FUNC_NAME "scm_hash_fn_ref_by_hash" -{ - unsigned long k; - SCM buckets, alist, h = SCM_BOOL_F; - - SCM_VALIDATE_HASHTABLE (SCM_ARG1, table); - buckets = SCM_HASHTABLE_VECTOR (table); - - if (SCM_SIMPLE_VECTOR_LENGTH (buckets) == 0) - return SCM_BOOL_F; - - k = raw_hash % SCM_SIMPLE_VECTOR_LENGTH (buckets); - alist = SCM_SIMPLE_VECTOR_REF (buckets, k); - - if (SCM_HASHTABLE_WEAK_P (table)) - { - struct assoc_by_hash_data args; - - args.alist = alist; - args.ret = SCM_BOOL_F; - args.predicate = predicate_fn; - args.closure = closure; - GC_call_with_alloc_lock (weak_bucket_assoc_by_hash, &args); - h = args.ret; - } - else - for (; scm_is_pair (alist); alist = SCM_CDR (alist)) - { - SCM pair = SCM_CAR (alist); - if (predicate_fn (SCM_CAR (pair), closure)) - { - h = pair; - break; - } - } + h = assoc_fn (obj, SCM_SIMPLE_VECTOR_REF (buckets, k), closure); return h; } @@ -690,11 +249,7 @@ scm_hash_fn_create_handle_x (SCM table, SCM obj, SCM init, if (k >= SCM_SIMPLE_VECTOR_LENGTH (buckets)) scm_out_of_range ("hash_fn_create_handle_x", scm_from_ulong (k)); - if (SCM_HASHTABLE_WEAK_P (table)) - it = weak_bucket_assoc (table, buckets, k, hash_fn, - assoc_fn, obj, closure); - else - it = assoc_fn (obj, SCM_SIMPLE_VECTOR_REF (buckets, k), closure); + it = assoc_fn (obj, SCM_SIMPLE_VECTOR_REF (buckets, k), closure); if (scm_is_pair (it)) return it; @@ -702,29 +257,9 @@ scm_hash_fn_create_handle_x (SCM table, SCM obj, SCM init, scm_wrong_type_arg_msg (NULL, 0, it, "a pair"); else { - /* When this is a weak hashtable, running the GC can change it. - Thus, we must allocate the new cells first and can only then - access BUCKETS. Also, we need to fetch the bucket vector - again since the hashtable might have been rehashed. This - necessitates a new hash value as well. - */ SCM handle, new_bucket; - if (SCM_HASHTABLE_WEAK_P (table)) - { - /* FIXME: We don't support weak alist vectors. */ - /* Use a weak cell. */ - if (SCM_HASHTABLE_DOUBLY_WEAK_P (table)) - handle = scm_doubly_weak_pair (obj, init); - else if (SCM_HASHTABLE_WEAK_KEY_P (table)) - handle = scm_weak_car_pair (obj, init); - else - handle = scm_weak_cdr_pair (obj, init); - } - else - /* Use a regular, non-weak cell. */ - handle = scm_cons (obj, init); - + handle = scm_cons (obj, init); new_bucket = scm_cons (handle, SCM_EOL); if (!scm_is_eq (SCM_HASHTABLE_VECTOR (table), buckets)) @@ -760,36 +295,6 @@ scm_hash_fn_ref (SCM table, SCM obj, SCM dflt, return dflt; } -struct weak_cdr_data -{ - SCM pair; - SCM cdr; -}; - -static void* -get_weak_cdr (void *data) -{ - struct weak_cdr_data *d = data; - - if (SCM_WEAK_PAIR_CDR_DELETED_P (d->pair)) - d->cdr = SCM_BOOL_F; - else - d->cdr = SCM_CDR (d->pair); - - return NULL; -} - -static SCM -weak_pair_cdr (SCM x) -{ - struct weak_cdr_data data; - - data.pair = x; - GC_call_with_alloc_lock (get_weak_cdr, &data); - - return data.cdr; -} - SCM scm_hash_fn_set_x (SCM table, SCM obj, SCM val, scm_t_hash_fn hash_fn, scm_t_assoc_fn assoc_fn, @@ -801,24 +306,7 @@ scm_hash_fn_set_x (SCM table, SCM obj, SCM val, hash_fn, assoc_fn, closure); if (!scm_is_eq (SCM_CDR (pair), val)) - { - if (SCM_UNLIKELY (SCM_HASHTABLE_WEAK_VALUE_P (table))) - { - /* If the former value was on the heap, we need to unregister - the weak link. */ - SCM prev = weak_pair_cdr (pair); - - SCM_SETCDR (pair, val); - - if (SCM_NIMP (prev) && !SCM_NIMP (val)) - GC_unregister_disappearing_link ((GC_PTR) SCM_CDRLOC (pair)); - else - SCM_I_REGISTER_DISAPPEARING_LINK ((GC_PTR) SCM_CDRLOC (pair), - (GC_PTR) SCM2PTR (val)); - } - else - SCM_SETCDR (pair, val); - } + SCM_SETCDR (pair, val); return val; } @@ -845,11 +333,7 @@ scm_hash_fn_remove_x (SCM table, SCM obj, if (k >= SCM_SIMPLE_VECTOR_LENGTH (buckets)) scm_out_of_range (FUNC_NAME, scm_from_ulong (k)); - if (SCM_HASHTABLE_WEAK_P (table)) - h = weak_bucket_assoc (table, buckets, k, hash_fn, - assoc_fn, obj, closure); - else - h = assoc_fn (obj, SCM_SIMPLE_VECTOR_REF (buckets, k), closure); + h = assoc_fn (obj, SCM_SIMPLE_VECTOR_REF (buckets, k), closure); if (scm_is_true (h)) { @@ -868,6 +352,9 @@ SCM_DEFINE (scm_hash_clear_x, "hash-clear!", 1, 0, 0, "Remove all items from @var{table} (without triggering a resize).") #define FUNC_NAME s_scm_hash_clear_x { + if (SCM_WEAK_TABLE_P (table)) + return scm_weak_table_clear_x (table); + SCM_VALIDATE_HASHTABLE (SCM_ARG1, table); scm_vector_fill_x (SCM_HASHTABLE_VECTOR (table), SCM_EOL); @@ -887,9 +374,6 @@ SCM_DEFINE (scm_hashq_get_handle, "hashq-get-handle", 2, 0, 0, "Uses @code{eq?} for equality testing.") #define FUNC_NAME s_scm_hashq_get_handle { - if (SCM_UNLIKELY (SCM_HASHTABLE_P (table) && SCM_HASHTABLE_WEAK_P (table))) - SCM_MISC_ERROR ("Handle access not permitted on weak table", SCM_EOL); - return scm_hash_fn_get_handle (table, key, (scm_t_hash_fn) scm_ihashq, (scm_t_assoc_fn) scm_sloppy_assq, @@ -905,9 +389,6 @@ SCM_DEFINE (scm_hashq_create_handle_x, "hashq-create-handle!", 3, 0, 0, "associates @var{key} with @var{init}.") #define FUNC_NAME s_scm_hashq_create_handle_x { - if (SCM_UNLIKELY (SCM_HASHTABLE_P (table) && SCM_HASHTABLE_WEAK_P (table))) - SCM_MISC_ERROR ("Handle access not permitted on weak table", SCM_EOL); - return scm_hash_fn_create_handle_x (table, key, init, (scm_t_hash_fn) scm_ihashq, (scm_t_assoc_fn) scm_sloppy_assq, @@ -926,6 +407,10 @@ SCM_DEFINE (scm_hashq_ref, "hashq-ref", 2, 1, 0, { if (SCM_UNBNDP (dflt)) dflt = SCM_BOOL_F; + + if (SCM_WEAK_TABLE_P (table)) + return scm_weak_table_refq (table, key, dflt); + return scm_hash_fn_ref (table, key, dflt, (scm_t_hash_fn) scm_ihashq, (scm_t_assoc_fn) scm_sloppy_assq, @@ -941,6 +426,9 @@ SCM_DEFINE (scm_hashq_set_x, "hashq-set!", 3, 0, 0, "store @var{value} there. Uses @code{eq?} for equality testing.") #define FUNC_NAME s_scm_hashq_set_x { + if (SCM_WEAK_TABLE_P (table)) + return scm_weak_table_putq_x (table, key, val); + return scm_hash_fn_set_x (table, key, val, (scm_t_hash_fn) scm_ihashq, (scm_t_assoc_fn) scm_sloppy_assq, @@ -956,6 +444,9 @@ SCM_DEFINE (scm_hashq_remove_x, "hashq-remove!", 2, 0, 0, "@var{table}. Uses @code{eq?} for equality tests.") #define FUNC_NAME s_scm_hashq_remove_x { + if (SCM_WEAK_TABLE_P (table)) + return scm_weak_table_remq_x (table, key); + return scm_hash_fn_remove_x (table, key, (scm_t_hash_fn) scm_ihashq, (scm_t_assoc_fn) scm_sloppy_assq, @@ -974,9 +465,6 @@ SCM_DEFINE (scm_hashv_get_handle, "hashv-get-handle", 2, 0, 0, "Uses @code{eqv?} for equality testing.") #define FUNC_NAME s_scm_hashv_get_handle { - if (SCM_UNLIKELY (SCM_HASHTABLE_P (table) && SCM_HASHTABLE_WEAK_P (table))) - SCM_MISC_ERROR ("Handle access not permitted on weak table", SCM_EOL); - return scm_hash_fn_get_handle (table, key, (scm_t_hash_fn) scm_ihashv, (scm_t_assoc_fn) scm_sloppy_assv, @@ -992,9 +480,6 @@ SCM_DEFINE (scm_hashv_create_handle_x, "hashv-create-handle!", 3, 0, 0, "associates @var{key} with @var{init}.") #define FUNC_NAME s_scm_hashv_create_handle_x { - if (SCM_UNLIKELY (SCM_HASHTABLE_P (table) && SCM_HASHTABLE_WEAK_P (table))) - SCM_MISC_ERROR ("Handle access not permitted on weak table", SCM_EOL); - return scm_hash_fn_create_handle_x (table, key, init, (scm_t_hash_fn) scm_ihashv, (scm_t_assoc_fn) scm_sloppy_assv, @@ -1003,6 +488,12 @@ SCM_DEFINE (scm_hashv_create_handle_x, "hashv-create-handle!", 3, 0, 0, #undef FUNC_NAME +static int +assv_predicate (SCM k, SCM v, void *closure) +{ + return scm_is_true (scm_eqv_p (k, SCM_PACK_POINTER (closure))); +} + SCM_DEFINE (scm_hashv_ref, "hashv-ref", 2, 1, 0, (SCM table, SCM key, SCM dflt), "Look up @var{key} in the hash table @var{table}, and return the\n" @@ -1013,6 +504,11 @@ SCM_DEFINE (scm_hashv_ref, "hashv-ref", 2, 1, 0, { if (SCM_UNBNDP (dflt)) dflt = SCM_BOOL_F; + + if (SCM_WEAK_TABLE_P (table)) + return scm_c_weak_table_ref (table, scm_ihashv (key, -1), + assv_predicate, SCM_PACK (key), dflt); + return scm_hash_fn_ref (table, key, dflt, (scm_t_hash_fn) scm_ihashv, (scm_t_assoc_fn) scm_sloppy_assv, @@ -1028,6 +524,14 @@ SCM_DEFINE (scm_hashv_set_x, "hashv-set!", 3, 0, 0, "store @var{value} there. Uses @code{eqv?} for equality testing.") #define FUNC_NAME s_scm_hashv_set_x { + if (SCM_WEAK_TABLE_P (table)) + { + scm_c_weak_table_put_x (table, scm_ihashv (key, -1), + assv_predicate, SCM_PACK (key), + key, val); + return SCM_UNSPECIFIED; + } + return scm_hash_fn_set_x (table, key, val, (scm_t_hash_fn) scm_ihashv, (scm_t_assoc_fn) scm_sloppy_assv, @@ -1042,6 +546,13 @@ SCM_DEFINE (scm_hashv_remove_x, "hashv-remove!", 2, 0, 0, "@var{table}. Uses @code{eqv?} for equality tests.") #define FUNC_NAME s_scm_hashv_remove_x { + if (SCM_WEAK_TABLE_P (table)) + { + scm_c_weak_table_remove_x (table, scm_ihashv (key, -1), + assv_predicate, SCM_PACK (key)); + return SCM_UNSPECIFIED; + } + return scm_hash_fn_remove_x (table, key, (scm_t_hash_fn) scm_ihashv, (scm_t_assoc_fn) scm_sloppy_assv, @@ -1059,9 +570,6 @@ SCM_DEFINE (scm_hash_get_handle, "hash-get-handle", 2, 0, 0, "Uses @code{equal?} for equality testing.") #define FUNC_NAME s_scm_hash_get_handle { - if (SCM_UNLIKELY (SCM_HASHTABLE_P (table) && SCM_HASHTABLE_WEAK_P (table))) - SCM_MISC_ERROR ("Handle access not permitted on weak table", SCM_EOL); - return scm_hash_fn_get_handle (table, key, (scm_t_hash_fn) scm_ihash, (scm_t_assoc_fn) scm_sloppy_assoc, @@ -1077,9 +585,6 @@ SCM_DEFINE (scm_hash_create_handle_x, "hash-create-handle!", 3, 0, 0, "associates @var{key} with @var{init}.") #define FUNC_NAME s_scm_hash_create_handle_x { - if (SCM_UNLIKELY (SCM_HASHTABLE_P (table) && SCM_HASHTABLE_WEAK_P (table))) - SCM_MISC_ERROR ("Handle access not permitted on weak table", SCM_EOL); - return scm_hash_fn_create_handle_x (table, key, init, (scm_t_hash_fn) scm_ihash, (scm_t_assoc_fn) scm_sloppy_assoc, @@ -1088,6 +593,12 @@ SCM_DEFINE (scm_hash_create_handle_x, "hash-create-handle!", 3, 0, 0, #undef FUNC_NAME +static int +assoc_predicate (SCM k, SCM v, void *closure) +{ + return scm_is_true (scm_equal_p (k, SCM_PACK_POINTER (closure))); +} + SCM_DEFINE (scm_hash_ref, "hash-ref", 2, 1, 0, (SCM table, SCM key, SCM dflt), "Look up @var{key} in the hash table @var{table}, and return the\n" @@ -1098,6 +609,11 @@ SCM_DEFINE (scm_hash_ref, "hash-ref", 2, 1, 0, { if (SCM_UNBNDP (dflt)) dflt = SCM_BOOL_F; + + if (SCM_WEAK_TABLE_P (table)) + return scm_c_weak_table_ref (table, scm_ihash (key, -1), + assoc_predicate, SCM_PACK (key), dflt); + return scm_hash_fn_ref (table, key, dflt, (scm_t_hash_fn) scm_ihash, (scm_t_assoc_fn) scm_sloppy_assoc, @@ -1114,6 +630,14 @@ SCM_DEFINE (scm_hash_set_x, "hash-set!", 3, 0, 0, "testing.") #define FUNC_NAME s_scm_hash_set_x { + if (SCM_WEAK_TABLE_P (table)) + { + scm_c_weak_table_put_x (table, scm_ihash (key, -1), + assoc_predicate, SCM_PACK (key), + key, val); + return SCM_UNSPECIFIED; + } + return scm_hash_fn_set_x (table, key, val, (scm_t_hash_fn) scm_ihash, (scm_t_assoc_fn) scm_sloppy_assoc, @@ -1129,6 +653,13 @@ SCM_DEFINE (scm_hash_remove_x, "hash-remove!", 2, 0, 0, "@var{table}. Uses @code{equal?} for equality tests.") #define FUNC_NAME s_scm_hash_remove_x { + if (SCM_WEAK_TABLE_P (table)) + { + scm_c_weak_table_remove_x (table, scm_ihash (key, -1), + assoc_predicate, SCM_PACK (key)); + return SCM_UNSPECIFIED; + } + return scm_hash_fn_remove_x (table, key, (scm_t_hash_fn) scm_ihash, (scm_t_assoc_fn) scm_sloppy_assoc, @@ -1143,10 +674,9 @@ typedef struct scm_t_ihashx_closure { SCM hash; SCM assoc; + SCM key; } scm_t_ihashx_closure; - - static unsigned long scm_ihashx (SCM obj, unsigned long n, void *arg) { @@ -1156,8 +686,6 @@ scm_ihashx (SCM obj, unsigned long n, void *arg) return scm_to_ulong (answer); } - - static SCM scm_sloppy_assx (SCM obj, SCM alist, void *arg) { @@ -1165,6 +693,20 @@ scm_sloppy_assx (SCM obj, SCM alist, void *arg) return scm_call_2 (closure->assoc, obj, alist); } +static int +assx_predicate (SCM k, SCM v, void *closure) +{ + scm_t_ihashx_closure *c = (scm_t_ihashx_closure *) closure; + + /* FIXME: The hashx interface is crazy. Hash tables have nothing to + do with alists in principle. Instead of getting an assoc proc, + hashx functions should use an equality predicate. Perhaps we can + change this before 2.2, but until then, add a terrible, terrible + hack. */ + + return scm_is_true (scm_call_2 (c->assoc, c->key, scm_acons (k, v, SCM_EOL))); +} + SCM_DEFINE (scm_hashx_get_handle, "hashx-get-handle", 4, 0, 0, (SCM hash, SCM assoc, SCM table, SCM key), @@ -1179,9 +721,7 @@ SCM_DEFINE (scm_hashx_get_handle, "hashx-get-handle", 4, 0, 0, scm_t_ihashx_closure closure; closure.hash = hash; closure.assoc = assoc; - - if (SCM_UNLIKELY (SCM_HASHTABLE_P (table) && SCM_HASHTABLE_WEAK_P (table))) - SCM_MISC_ERROR ("Handle access not permitted on weak table", SCM_EOL); + closure.key = key; return scm_hash_fn_get_handle (table, key, scm_ihashx, scm_sloppy_assx, (void *) &closure); @@ -1202,9 +742,7 @@ SCM_DEFINE (scm_hashx_create_handle_x, "hashx-create-handle!", 5, 0, 0, scm_t_ihashx_closure closure; closure.hash = hash; closure.assoc = assoc; - - if (SCM_UNLIKELY (SCM_HASHTABLE_P (table) && SCM_HASHTABLE_WEAK_P (table))) - SCM_MISC_ERROR ("Handle access not permitted on weak table", SCM_EOL); + closure.key = key; return scm_hash_fn_create_handle_x (table, key, init, scm_ihashx, scm_sloppy_assx, (void *)&closure); @@ -1231,6 +769,15 @@ SCM_DEFINE (scm_hashx_ref, "hashx-ref", 4, 1, 0, dflt = SCM_BOOL_F; closure.hash = hash; closure.assoc = assoc; + closure.key = key; + + if (SCM_WEAK_TABLE_P (table)) + { + unsigned long h = scm_to_ulong (scm_call_2 (hash, key, + scm_from_ulong (-1))); + return scm_c_weak_table_ref (table, h, assx_predicate, &closure, dflt); + } + return scm_hash_fn_ref (table, key, dflt, scm_ihashx, scm_sloppy_assx, (void *)&closure); } @@ -1255,6 +802,16 @@ SCM_DEFINE (scm_hashx_set_x, "hashx-set!", 5, 0, 0, scm_t_ihashx_closure closure; closure.hash = hash; closure.assoc = assoc; + closure.key = key; + + if (SCM_WEAK_TABLE_P (table)) + { + unsigned long h = scm_to_ulong (scm_call_2 (hash, key, + scm_from_ulong (-1))); + scm_c_weak_table_put_x (table, h, assx_predicate, &closure, key, val); + return SCM_UNSPECIFIED; + } + return scm_hash_fn_set_x (table, key, val, scm_ihashx, scm_sloppy_assx, (void *)&closure); } @@ -1276,6 +833,16 @@ SCM_DEFINE (scm_hashx_remove_x, "hashx-remove!", 4, 0, 0, scm_t_ihashx_closure closure; closure.hash = hash; closure.assoc = assoc; + closure.key = obj; + + if (SCM_WEAK_TABLE_P (table)) + { + unsigned long h = scm_to_ulong (scm_call_2 (hash, obj, + scm_from_ulong (-1))); + scm_c_weak_table_remove_x (table, h, assx_predicate, &closure); + return SCM_UNSPECIFIED; + } + return scm_hash_fn_remove_x (table, obj, scm_ihashx, scm_sloppy_assx, (void *) &closure); } @@ -1296,6 +863,10 @@ SCM_DEFINE (scm_hash_fold, "hash-fold", 3, 0, 0, #define FUNC_NAME s_scm_hash_fold { SCM_VALIDATE_PROC (1, proc); + + if (SCM_WEAK_TABLE_P (table)) + return scm_weak_table_fold (proc, init, table); + SCM_VALIDATE_HASHTABLE (3, table); return scm_internal_hash_fold ((scm_t_hash_fold_fn) scm_call_3, (void *) SCM_UNPACK (proc), init, table); @@ -1317,6 +888,10 @@ SCM_DEFINE (scm_hash_for_each, "hash-for-each", 2, 0, 0, #define FUNC_NAME s_scm_hash_for_each { SCM_VALIDATE_PROC (1, proc); + + if (SCM_WEAK_TABLE_P (table)) + return scm_weak_table_for_each (proc, table); + SCM_VALIDATE_HASHTABLE (2, table); scm_internal_hash_for_each_handle (for_each_proc, @@ -1335,9 +910,6 @@ SCM_DEFINE (scm_hash_for_each_handle, "hash-for-each-handle", 2, 0, 0, SCM_ASSERT (scm_is_true (scm_procedure_p (proc)), proc, 1, FUNC_NAME); SCM_VALIDATE_HASHTABLE (2, table); - if (SCM_UNLIKELY (SCM_HASHTABLE_WEAK_P (table))) - SCM_MISC_ERROR ("Handle access not permitted on weak table", SCM_EOL); - scm_internal_hash_for_each_handle ((scm_t_hash_handle_fn) scm_call_1, (void *) SCM_UNPACK (proc), table); @@ -1360,6 +932,10 @@ SCM_DEFINE (scm_hash_map_to_list, "hash-map->list", 2, 0, 0, #define FUNC_NAME s_scm_hash_map_to_list { SCM_VALIDATE_PROC (1, proc); + + if (SCM_WEAK_TABLE_P (table)) + return scm_weak_table_map_to_list (proc, table); + SCM_VALIDATE_HASHTABLE (2, table); return scm_internal_hash_fold (map_proc, (void *) SCM_UNPACK (proc), @@ -1378,6 +954,9 @@ scm_internal_hash_fold (scm_t_hash_fold_fn fn, void *closure, long i, n; SCM buckets, result = init; + if (SCM_WEAK_TABLE_P (table)) + return scm_c_weak_table_fold (fn, closure, init, table); + SCM_VALIDATE_HASHTABLE (0, table); buckets = SCM_HASHTABLE_VECTOR (table); @@ -1390,14 +969,7 @@ scm_internal_hash_fold (scm_t_hash_fold_fn fn, void *closure, ls = SCM_CDR (ls)) { handle = SCM_CAR (ls); - - if (SCM_HASHTABLE_WEAK_P (table) && SCM_WEAK_PAIR_DELETED_P (handle)) - /* Don't try to unlink this weak pair, as we're not within - the allocation lock. Instead rely on - vacuum_weak_hash_table to do its job. */ - continue; - else - result = fn (closure, SCM_CAR (handle), SCM_CDR (handle), result); + result = fn (closure, SCM_CAR (handle), SCM_CDR (handle), result); } } diff --git a/libguile/hashtab.h b/libguile/hashtab.h index 314994630..8eb685a0e 100644 --- a/libguile/hashtab.h +++ b/libguile/hashtab.h @@ -3,7 +3,7 @@ #ifndef SCM_HASHTAB_H #define SCM_HASHTAB_H -/* Copyright (C) 1995,1996,1999,2000,2001, 2003, 2004, 2006, 2008, 2009 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996,1999,2000,2001, 2003, 2004, 2006, 2008, 2009, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -25,29 +25,14 @@ #include "libguile/__scm.h" -#include "weaks.h" - -#define SCM_HASHTABLEF_WEAK_CAR SCM_WVECTF_WEAK_KEY -#define SCM_HASHTABLEF_WEAK_CDR SCM_WVECTF_WEAK_VALUE - -#define SCM_HASHTABLE_P(x) (!SCM_IMP (x) && SCM_TYP7(x) == scm_tc7_hashtable) +#define SCM_HASHTABLE_P(x) (SCM_HAS_TYP7 (x, scm_tc7_hashtable)) #define SCM_VALIDATE_HASHTABLE(pos, arg) \ SCM_MAKE_VALIDATE_MSG (pos, arg, HASHTABLE_P, "hash-table") #define SCM_HASHTABLE_VECTOR(h) SCM_CELL_OBJECT_1 (h) #define SCM_SET_HASHTABLE_VECTOR(x, v) SCM_SET_CELL_OBJECT_1 ((x), (v)) #define SCM_HASHTABLE(x) ((scm_t_hashtable *) SCM_CELL_WORD_2 (x)) -#define SCM_HASHTABLE_FLAGS(x) (SCM_HASHTABLE (x)->flags) -#define SCM_HASHTABLE_WEAK_KEY_P(x) \ - (SCM_HASHTABLE_FLAGS (x) & SCM_HASHTABLEF_WEAK_CAR) -#define SCM_HASHTABLE_WEAK_VALUE_P(x) \ - (SCM_HASHTABLE_FLAGS (x) & SCM_HASHTABLEF_WEAK_CDR) -#define SCM_HASHTABLE_DOUBLY_WEAK_P(x) \ - ((SCM_HASHTABLE_FLAGS (x) \ - & (SCM_HASHTABLEF_WEAK_CAR | SCM_HASHTABLEF_WEAK_CDR)) \ - == (SCM_HASHTABLEF_WEAK_CAR | SCM_HASHTABLEF_WEAK_CDR)) -#define SCM_HASHTABLE_WEAK_P(x) SCM_HASHTABLE_FLAGS (x) #define SCM_HASHTABLE_N_ITEMS(x) (SCM_HASHTABLE (x)->n_items) #define SCM_SET_HASHTABLE_N_ITEMS(x, n) (SCM_HASHTABLE (x)->n_items = n) #define SCM_HASHTABLE_INCREMENT(x) (SCM_HASHTABLE_N_ITEMS(x)++) @@ -70,10 +55,6 @@ typedef unsigned long (*scm_t_hash_fn) (SCM obj, unsigned long max, some equality predicate. */ typedef SCM (*scm_t_assoc_fn) (SCM obj, SCM alist, void *closure); -/* Function that returns true if the given object is the one we are - looking for, for scm_hash_fn_ref_by_hash. */ -typedef int (*scm_t_hash_predicate_fn) (SCM obj, void *closure); - /* Function to fold over the entries of a hash table. */ typedef SCM (*scm_t_hash_fold_fn) (void *closure, SCM key, SCM value, SCM result); @@ -83,7 +64,6 @@ typedef SCM (*scm_t_hash_fold_fn) (void *closure, SCM key, SCM value, typedef SCM (*scm_t_hash_handle_fn) (void *closure, SCM handle); typedef struct scm_t_hashtable { - int flags; /* properties of table */ unsigned long n_items; /* number of items in table */ unsigned long lower; /* when to shrink */ unsigned long upper; /* when to grow */ @@ -97,14 +77,8 @@ typedef struct scm_t_hashtable { SCM_API SCM scm_vector_to_hash_table (SCM vector); SCM_API SCM scm_c_make_hash_table (unsigned long k); SCM_API SCM scm_make_hash_table (SCM n); -SCM_API SCM scm_make_weak_key_hash_table (SCM k); -SCM_API SCM scm_make_weak_value_hash_table (SCM k); -SCM_API SCM scm_make_doubly_weak_hash_table (SCM k); SCM_API SCM scm_hash_table_p (SCM h); -SCM_API SCM scm_weak_key_hash_table_p (SCM h); -SCM_API SCM scm_weak_value_hash_table_p (SCM h); -SCM_API SCM scm_doubly_weak_hash_table_p (SCM h); SCM_INTERNAL void scm_i_rehash (SCM table, scm_t_hash_fn hash_fn, void *closure, const char *func_name); @@ -114,10 +88,6 @@ SCM_API SCM scm_hash_fn_get_handle (SCM table, SCM obj, scm_t_hash_fn hash_fn, scm_t_assoc_fn assoc_fn, void *closure); -SCM_INTERNAL -SCM scm_hash_fn_get_handle_by_hash (SCM table, unsigned long raw_hash, - scm_t_hash_predicate_fn predicate_fn, - void *closure); SCM_API SCM scm_hash_fn_create_handle_x (SCM table, SCM obj, SCM init, scm_t_hash_fn hash_fn, scm_t_assoc_fn assoc_fn, diff --git a/libguile/hooks.c b/libguile/hooks.c index abba606f7..782636e4e 100644 --- a/libguile/hooks.c +++ b/libguile/hooks.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995,1996,1998,1999,2000,2001, 2003, 2006, 2008, 2009 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996,1998,1999,2000,2001, 2003, 2006, 2008, 2009, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -134,22 +134,22 @@ static int hook_print (SCM hook, SCM port, scm_print_state *pstate) { SCM ls, name; - scm_puts ("#<hook ", port); + scm_puts_unlocked ("#<hook ", port); scm_intprint (SCM_HOOK_ARITY (hook), 10, port); - scm_putc (' ', port); + scm_putc_unlocked (' ', port); scm_uintprint (SCM_UNPACK (hook), 16, port); ls = SCM_HOOK_PROCEDURES (hook); - while (SCM_NIMP (ls)) + while (scm_is_pair (ls)) { - scm_putc (' ', port); + scm_putc_unlocked (' ', port); name = scm_procedure_name (SCM_CAR (ls)); if (scm_is_true (name)) scm_iprin1 (name, port, pstate); else - scm_putc ('?', port); + scm_putc_unlocked ('?', port); ls = SCM_CDR (ls); } - scm_putc ('>', port); + scm_putc_unlocked ('>', port); return 1; } @@ -269,7 +269,7 @@ void scm_c_run_hook (SCM hook, SCM args) { SCM procs = SCM_HOOK_PROCEDURES (hook); - while (SCM_NIMP (procs)) + while (scm_is_pair (procs)) { scm_apply_0 (SCM_CAR (procs), args); procs = SCM_CDR (procs); @@ -280,7 +280,7 @@ void scm_c_run_hookn (SCM hook, SCM *argv, size_t nargs) { SCM procs = SCM_HOOK_PROCEDURES (hook); - while (SCM_NIMP (procs)) + while (scm_is_pair (procs)) { scm_call_n (SCM_CAR (procs), argv, nargs); procs = SCM_CDR (procs); diff --git a/libguile/init.c b/libguile/init.c index 8e3888d3e..02dbb99ec 100644 --- a/libguile/init.c +++ b/libguile/init.c @@ -133,7 +133,6 @@ #include "libguile/version.h" #include "libguile/vm.h" #include "libguile/vports.h" -#include "libguile/weaks.h" #include "libguile/guardians.h" #include "libguile/extensions.h" #include "libguile/uniform.h" @@ -383,11 +382,11 @@ scm_i_init_guile (void *base) scm_storage_prehistory (); scm_threads_prehistory (base); /* requires storage_prehistory */ - scm_weaks_prehistory (); /* requires storage_prehistory */ + scm_weak_table_prehistory (); /* requires storage_prehistory */ #ifdef GUILE_DEBUG_MALLOC scm_debug_malloc_prehistory (); #endif - scm_symbols_prehistory (); /* requires weaks_prehistory */ + scm_symbols_prehistory (); /* requires weak_table_prehistory */ scm_modules_prehistory (); scm_init_array_handle (); scm_bootstrap_bytevectors (); /* Requires array-handle */ @@ -488,7 +487,9 @@ scm_i_init_guile (void *base) scm_init_throw (); /* Requires smob_prehistory */ scm_init_trees (); scm_init_version (); - scm_init_weaks (); + scm_init_weak_set (); + scm_init_weak_table (); + scm_init_weak_vectors (); scm_init_guardians (); /* requires smob_prehistory */ scm_init_vports (); scm_init_standard_ports (); /* Requires fports */ @@ -515,9 +516,7 @@ scm_i_init_guile (void *base) scm_initialized_p = 1; -#ifdef STACK_CHECKING scm_stack_checking_enabled_p = SCM_STACK_CHECKING_P; -#endif scm_init_rdelim (); scm_init_rw (); diff --git a/libguile/inline.c b/libguile/inline.c index 79728ff13..7b900f71a 100644 --- a/libguile/inline.c +++ b/libguile/inline.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2001, 2006, 2008 Free Software Foundation, Inc. +/* Copyright (C) 2001, 2006, 2008, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -20,5 +20,9 @@ # include <config.h> #endif -#define SCM_INLINE_C_INCLUDING_INLINE_H 1 +#define SCM_IMPLEMENT_INLINES 1 +#define SCM_INLINE_C_IMPLEMENTING_INLINES 1 #include "libguile/inline.h" +#include "libguile/gc.h" +#include "libguile/smob.h" +#include "libguile/ports.h" diff --git a/libguile/inline.h b/libguile/inline.h index a78cac515..fe9cac70f 100644 --- a/libguile/inline.h +++ b/libguile/inline.h @@ -23,12 +23,9 @@ */ /* This file is for inline functions. On platforms that don't support - inlining functions, they are turned into ordinary functions. See - "inline.c". -*/ - -#include <stdio.h> -#include <string.h> + inlining functions, they are turned into ordinary functions. On + platforms that do support inline functions, the definitions are still + compiled into the library, once, in inline.c. */ #include "libguile/__scm.h" @@ -41,174 +38,21 @@ #include "libguile/error.h" -#ifndef SCM_INLINE_C_INCLUDING_INLINE_H - -/* GCC has `__inline__' in all modes, including strict ansi. GCC 4.3 and - above with `-std=c99' or `-std=gnu99' implements ISO C99 inline semantics, - unless `-fgnu89-inline' is used. Here we want GNU "extern inline" - semantics, hence the `__gnu_inline__' attribute, in accordance with: - http://gcc.gnu.org/gcc-4.3/porting_to.html . - - With GCC 4.2, `__GNUC_STDC_INLINE__' is never defined (because C99 inline - semantics are not supported), but a warning is issued in C99 mode if - `__gnu_inline__' is not used. - - Apple's GCC build >5400 (since Xcode 3.0) doesn't support GNU inline in - C99 mode and doesn't define `__GNUC_STDC_INLINE__'. Fall back to "static - inline" in that case. */ - -# if (defined __GNUC__) && (!(((defined __APPLE_CC__) && (__APPLE_CC__ > 5400)) && __STDC_VERSION__ >= 199901L)) -# define SCM_C_USE_EXTERN_INLINE 1 -# if (defined __GNUC_STDC_INLINE__) || (__GNUC__ == 4 && __GNUC_MINOR__ == 2) -# define SCM_C_EXTERN_INLINE \ - extern __inline__ __attribute__ ((__gnu_inline__)) -# else -# define SCM_C_EXTERN_INLINE extern __inline__ -# endif -# elif (defined SCM_C_INLINE) -# define SCM_C_EXTERN_INLINE static SCM_C_INLINE -# endif - -#endif /* SCM_INLINE_C_INCLUDING_INLINE_H */ - - -#if (!defined SCM_C_INLINE) || (defined SCM_INLINE_C_INCLUDING_INLINE_H) \ - || (defined SCM_C_USE_EXTERN_INLINE) - -/* The `extern' declarations. They should only appear when used from - "inline.c", when `inline' is not supported at all or when "extern inline" - is used. */ +SCM_INLINE SCM scm_array_handle_ref (scm_t_array_handle *h, ssize_t pos); +SCM_INLINE void scm_array_handle_set (scm_t_array_handle *h, ssize_t pos, SCM val); -#include "libguile/bdw-gc.h" +SCM_INLINE int scm_is_pair (SCM x); +SCM_INLINE int scm_is_string (SCM x); - -SCM_API SCM scm_cell (scm_t_bits car, scm_t_bits cdr); -SCM_API SCM scm_double_cell (scm_t_bits car, scm_t_bits cbr, +SCM_INLINE SCM scm_cell (scm_t_bits car, scm_t_bits cdr); +SCM_INLINE SCM scm_double_cell (scm_t_bits car, scm_t_bits cbr, scm_t_bits ccr, scm_t_bits cdr); -SCM_API SCM scm_words (scm_t_bits car, scm_t_uint16 n_words); - -SCM_API SCM scm_array_handle_ref (scm_t_array_handle *h, ssize_t pos); -SCM_API void scm_array_handle_set (scm_t_array_handle *h, ssize_t pos, SCM val); - -SCM_API int scm_is_pair (SCM x); -SCM_API int scm_is_string (SCM x); - -SCM_API int scm_get_byte_or_eof (SCM port); -SCM_API int scm_peek_byte_or_eof (SCM port); -SCM_API void scm_putc (char c, SCM port); -SCM_API void scm_puts (const char *str_data, SCM port); - -#endif - - -#if defined SCM_C_EXTERN_INLINE || defined SCM_INLINE_C_INCLUDING_INLINE_H -/* either inlining, or being included from inline.c. We use (and - repeat) this long #if test here and below so that we don't have to - introduce any extraneous symbols into the public namespace. We - only need SCM_C_INLINE to be seen publically . */ - -#ifndef SCM_INLINE_C_INCLUDING_INLINE_H -SCM_C_EXTERN_INLINE -#endif - -SCM -scm_cell (scm_t_bits car, scm_t_bits cdr) -{ - SCM cell = PTR2SCM (GC_MALLOC (sizeof (scm_t_cell))); - - /* Initialize the type slot last so that the cell is ignored by the GC - until it is completely initialized. This is only relevant when the GC - can actually run during this code, which it can't since the GC only runs - when all other threads are stopped. */ - SCM_GC_SET_CELL_WORD (cell, 1, cdr); - SCM_GC_SET_CELL_WORD (cell, 0, car); - - return cell; -} - -#ifndef SCM_INLINE_C_INCLUDING_INLINE_H -SCM_C_EXTERN_INLINE -#endif -SCM -scm_double_cell (scm_t_bits car, scm_t_bits cbr, - scm_t_bits ccr, scm_t_bits cdr) -{ - SCM z; - - z = PTR2SCM (GC_MALLOC (2 * sizeof (scm_t_cell))); - /* Initialize the type slot last so that the cell is ignored by the - GC until it is completely initialized. This is only relevant - when the GC can actually run during this code, which it can't - since the GC only runs when all other threads are stopped. - */ - SCM_GC_SET_CELL_WORD (z, 1, cbr); - SCM_GC_SET_CELL_WORD (z, 2, ccr); - SCM_GC_SET_CELL_WORD (z, 3, cdr); - SCM_GC_SET_CELL_WORD (z, 0, car); - - /* When this function is inlined, it's possible that the last - SCM_GC_SET_CELL_WORD above will be adjacent to a following - initialization of z. E.g., it occurred in scm_make_real. GCC - from around version 3 (e.g., certainly 3.2) began taking - advantage of strict C aliasing rules which say that it's OK to - interchange the initialization above and the one below when the - pointer types appear to differ sufficiently. We don't want that, - of course. GCC allows this behaviour to be disabled with the - -fno-strict-aliasing option, but would also need to be supplied - by Guile users. Instead, the following statements prevent the - reordering. - */ -#ifdef __GNUC__ - __asm__ volatile ("" : : : "memory"); -#else - /* portable version, just in case any other compiler does the same - thing. */ - scm_remember_upto_here_1 (z); -#endif - - return z; -} - -#ifndef SCM_INLINE_C_INCLUDING_INLINE_H -SCM_C_EXTERN_INLINE -#endif -SCM -scm_words (scm_t_bits car, scm_t_uint16 n_words) -{ - SCM z; - - z = PTR2SCM (GC_MALLOC (sizeof (scm_t_bits) * n_words)); - SCM_GC_SET_CELL_WORD (z, 0, car); +SCM_INLINE SCM scm_words (scm_t_bits car, scm_t_uint16 n_words); - /* FIXME: is the following concern even relevant with BDW-GC? */ +#if SCM_CAN_INLINE || defined SCM_INLINE_C_IMPLEMENTING_INLINES +/* Either inlining, or being included from inline.c. */ - /* When this function is inlined, it's possible that the last - SCM_GC_SET_CELL_WORD above will be adjacent to a following - initialization of z. E.g., it occurred in scm_make_real. GCC - from around version 3 (e.g., certainly 3.2) began taking - advantage of strict C aliasing rules which say that it's OK to - interchange the initialization above and the one below when the - pointer types appear to differ sufficiently. We don't want that, - of course. GCC allows this behaviour to be disabled with the - -fno-strict-aliasing option, but would also need to be supplied - by Guile users. Instead, the following statements prevent the - reordering. - */ -#ifdef __GNUC__ - __asm__ volatile ("" : : : "memory"); -#else - /* portable version, just in case any other compiler does the same - thing. */ - scm_remember_upto_here_1 (z); -#endif - - return z; -} - -#ifndef SCM_INLINE_C_INCLUDING_INLINE_H -SCM_C_EXTERN_INLINE -#endif -SCM +SCM_INLINE_IMPLEMENTATION SCM scm_array_handle_ref (scm_t_array_handle *h, ssize_t p) { if (SCM_UNLIKELY (p < 0 && ((size_t)-p) > h->base)) @@ -218,10 +62,7 @@ scm_array_handle_ref (scm_t_array_handle *h, ssize_t p) return h->impl->vref (h, h->base + p); } -#ifndef SCM_INLINE_C_INCLUDING_INLINE_H -SCM_C_EXTERN_INLINE -#endif -void +SCM_INLINE_IMPLEMENTATION void scm_array_handle_set (scm_t_array_handle *h, ssize_t p, SCM v) { if (SCM_UNLIKELY (p < 0 && ((size_t)-p) > h->base)) @@ -231,10 +72,7 @@ scm_array_handle_set (scm_t_array_handle *h, ssize_t p, SCM v) h->impl->vset (h, h->base + p, v); } -#ifndef SCM_INLINE_C_INCLUDING_INLINE_H -SCM_C_EXTERN_INLINE -#endif -int +SCM_INLINE_IMPLEMENTATION int scm_is_pair (SCM x) { /* The following "workaround_for_gcc_295" avoids bad code generated by @@ -261,92 +99,11 @@ scm_is_pair (SCM x) return SCM_I_CONSP (x); } -#ifndef SCM_INLINE_C_INCLUDING_INLINE_H -SCM_C_EXTERN_INLINE -#endif -int +SCM_INLINE_IMPLEMENTATION int scm_is_string (SCM x) { - return SCM_NIMP (x) && (SCM_TYP7 (x) == scm_tc7_string); -} - -/* Port I/O. */ - -#ifndef SCM_INLINE_C_INCLUDING_INLINE_H -SCM_C_EXTERN_INLINE -#endif -int -scm_get_byte_or_eof (SCM port) -{ - int c; - scm_t_port *pt = SCM_PTAB_ENTRY (port); - - if (pt->rw_active == SCM_PORT_WRITE) - /* may be marginally faster than calling scm_flush. */ - scm_ptobs[SCM_PTOBNUM (port)].flush (port); - - if (pt->rw_random) - pt->rw_active = SCM_PORT_READ; - - if (pt->read_pos >= pt->read_end) - { - if (SCM_UNLIKELY (scm_fill_input (port) == EOF)) - return EOF; - } - - c = *(pt->read_pos++); - - return c; -} - -/* Like `scm_get_byte_or_eof' but does not change PORT's `read_pos'. */ -#ifndef SCM_INLINE_C_INCLUDING_INLINE_H -SCM_C_EXTERN_INLINE -#endif -int -scm_peek_byte_or_eof (SCM port) -{ - int c; - scm_t_port *pt = SCM_PTAB_ENTRY (port); - - if (pt->rw_active == SCM_PORT_WRITE) - /* may be marginally faster than calling scm_flush. */ - scm_ptobs[SCM_PTOBNUM (port)].flush (port); - - if (pt->rw_random) - pt->rw_active = SCM_PORT_READ; - - if (pt->read_pos >= pt->read_end) - { - if (SCM_UNLIKELY (scm_fill_input (port) == EOF)) - return EOF; - } - - c = *pt->read_pos; - - return c; -} - -#ifndef SCM_INLINE_C_INCLUDING_INLINE_H -SCM_C_EXTERN_INLINE -#endif -void -scm_putc (char c, SCM port) -{ - SCM_ASSERT_TYPE (SCM_OPOUTPORTP (port), port, 0, NULL, "output port"); - scm_lfwrite (&c, 1, port); + return SCM_HAS_TYP7 (x, scm_tc7_string); } -#ifndef SCM_INLINE_C_INCLUDING_INLINE_H -SCM_C_EXTERN_INLINE -#endif -void -scm_puts (const char *s, SCM port) -{ - SCM_ASSERT_TYPE (SCM_OPOUTPORTP (port), port, 0, NULL, "output port"); - scm_lfwrite (s, strlen (s), port); -} - - #endif #endif diff --git a/libguile/instructions.c b/libguile/instructions.c index ef4a9ce17..f3b8963d2 100644 --- a/libguile/instructions.c +++ b/libguile/instructions.c @@ -72,7 +72,7 @@ fetch_instruction_table () { table[i].opcode = i; if (table[i].name) - table[i].symname = scm_from_locale_symbol (table[i].name); + table[i].symname = scm_from_utf8_symbol (table[i].name); else table[i].symname = SCM_BOOL_F; } diff --git a/libguile/ioext.c b/libguile/ioext.c index 6b0c9b88c..b1addf4c1 100644 --- a/libguile/ioext.c +++ b/libguile/ioext.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2006 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2006, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -89,13 +89,13 @@ SCM_DEFINE (scm_redirect_port, "redirect-port", 2, 0, 0, { scm_t_port *pt = SCM_PTAB_ENTRY (new); scm_t_port *old_pt = SCM_PTAB_ENTRY (old); - scm_t_ptob_descriptor *ptob = &scm_ptobs[SCM_PTOBNUM (new)]; + scm_t_ptob_descriptor *ptob = SCM_PORT_DESCRIPTOR (new); /* must flush to old fdes. */ if (pt->rw_active == SCM_PORT_WRITE) ptob->flush (new); else if (pt->rw_active == SCM_PORT_READ) - scm_end_input (new); + scm_end_input_unlocked (new); ans = dup2 (oldfd, newfd); if (ans == -1) SCM_SYSERROR; @@ -269,7 +269,7 @@ SCM_DEFINE (scm_primitive_move_to_fdes, "primitive-move->fdes", 2, 0, 0, #undef FUNC_NAME static SCM -get_matching_port (void *closure, SCM port, SCM val, SCM result) +get_matching_port (void *closure, SCM port, SCM result) { int fd = * (int *) closure; scm_t_port *entry = SCM_PTAB_ENTRY (port); @@ -292,11 +292,9 @@ SCM_DEFINE (scm_fdes_to_ports, "fdes->ports", 1, 0, 0, SCM result = SCM_EOL; int int_fd = scm_to_int (fd); - scm_i_scm_pthread_mutex_lock (&scm_i_port_table_mutex); - result = scm_internal_hash_fold (get_matching_port, - (void*) &int_fd, result, - scm_i_port_weak_hash); - scm_i_pthread_mutex_unlock (&scm_i_port_table_mutex); + result = scm_c_weak_set_fold (get_matching_port, + (void*) &int_fd, result, + scm_i_port_weak_set); return result; } #undef FUNC_NAME diff --git a/libguile/keywords.c b/libguile/keywords.c index 3b9a9228c..e4a79ac4d 100644 --- a/libguile/keywords.c +++ b/libguile/keywords.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995,1996,1997,1998,1999,2000,2001, 2003, 2004, 2006, 2008, 2009 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996,1997,1998,1999,2000,2001, 2003, 2004, 2006, 2008, 2009, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -47,7 +47,7 @@ scm_t_bits scm_tc16_keyword; static int keyword_print (SCM exp, SCM port, scm_print_state *pstate SCM_UNUSED) { - scm_puts ("#:", port); + scm_puts_unlocked ("#:", port); scm_display (KEYWORDSYM (exp), port); return 1; } diff --git a/libguile/list.c b/libguile/list.c index 221ee79d0..8297b17c5 100644 --- a/libguile/list.c +++ b/libguile/list.c @@ -90,7 +90,7 @@ scm_list_n (SCM elt, ...) while (! SCM_UNBNDP (elt)) { #if (SCM_DEBUG_CELL_ACCESSES == 1) - if (SCM_NIMP (elt)) + if (SCM_HEAP_OBJECT_P (elt)) SCM_VALIDATE_CELL(elt, 0); #endif *pos = scm_cons (elt, SCM_EOL); diff --git a/libguile/load.c b/libguile/load.c index 66e3cc40a..14f411aa7 100644 --- a/libguile/load.c +++ b/libguile/load.c @@ -663,11 +663,11 @@ compiled_is_fresh (SCM full_filename, SCM compiled_filename, else { compiled_is_newer = 0; - scm_puts (";;; note: source file ", scm_current_error_port ()); + scm_puts_unlocked (";;; note: source file ", scm_current_error_port ()); scm_display (full_filename, scm_current_error_port ()); - scm_puts ("\n;;; newer than compiled ", scm_current_error_port ()); + scm_puts_unlocked ("\n;;; newer than compiled ", scm_current_error_port ()); scm_display (compiled_filename, scm_current_error_port ()); - scm_puts ("\n", scm_current_error_port ()); + scm_puts_unlocked ("\n", scm_current_error_port ()); } return compiled_is_newer; @@ -682,10 +682,10 @@ SCM_SYMBOL (sym_auto_compilation_options, "%auto-compilation-options"); static SCM do_try_auto_compile (void *data) { - SCM source = PTR2SCM (data); + SCM source = SCM_PACK_POINTER (data); SCM comp_mod, compile_file; - scm_puts (";;; compiling ", scm_current_error_port ()); + scm_puts_unlocked (";;; compiling ", scm_current_error_port ()); scm_display (source, scm_current_error_port ()); scm_newline (scm_current_error_port ()); @@ -714,16 +714,16 @@ do_try_auto_compile (void *data) /* Assume `*current-warning-prefix*' has an appropriate value. */ res = scm_call_n (scm_variable_ref (compile_file), args, 5); - scm_puts (";;; compiled ", scm_current_error_port ()); + scm_puts_unlocked (";;; compiled ", scm_current_error_port ()); scm_display (res, scm_current_error_port ()); scm_newline (scm_current_error_port ()); return res; } else { - scm_puts (";;; it seems ", scm_current_error_port ()); + scm_puts_unlocked (";;; it seems ", scm_current_error_port ()); scm_display (source, scm_current_error_port ()); - scm_puts ("\n;;; is part of the compiler; skipping auto-compilation\n", + scm_puts_unlocked ("\n;;; is part of the compiler; skipping auto-compilation\n", scm_current_error_port ()); return SCM_BOOL_F; } @@ -732,22 +732,22 @@ do_try_auto_compile (void *data) static SCM auto_compile_catch_handler (void *data, SCM tag, SCM throw_args) { - SCM source = PTR2SCM (data); + SCM source = SCM_PACK_POINTER (data); SCM oport, lines; oport = scm_open_output_string (); scm_print_exception (oport, SCM_BOOL_F, tag, throw_args); - scm_puts (";;; WARNING: compilation of ", scm_current_error_port ()); + scm_puts_unlocked (";;; WARNING: compilation of ", scm_current_error_port ()); scm_display (source, scm_current_error_port ()); - scm_puts (" failed:\n", scm_current_error_port ()); + scm_puts_unlocked (" failed:\n", scm_current_error_port ()); lines = scm_string_split (scm_get_output_string (oport), SCM_MAKE_CHAR ('\n')); for (; scm_is_pair (lines); lines = scm_cdr (lines)) if (scm_c_string_length (scm_car (lines))) { - scm_puts (";;; ", scm_current_error_port ()); + scm_puts_unlocked (";;; ", scm_current_error_port ()); scm_display (scm_car (lines), scm_current_error_port ()); scm_newline (scm_current_error_port ()); } @@ -765,7 +765,7 @@ SCM_DEFINE (scm_sys_warn_auto_compilation_enabled, "%warn-auto-compilation-enabl if (!message_shown) { - scm_puts (";;; note: auto-compilation is enabled, set GUILE_AUTO_COMPILE=0\n" + scm_puts_unlocked (";;; note: auto-compilation is enabled, set GUILE_AUTO_COMPILE=0\n" ";;; or pass the --no-auto-compile argument to disable.\n", scm_current_error_port ()); message_shown = 1; @@ -784,9 +784,9 @@ scm_try_auto_compile (SCM source) scm_sys_warn_auto_compilation_enabled (); return scm_c_catch (SCM_BOOL_T, do_try_auto_compile, - SCM2PTR (source), + SCM_UNPACK_POINTER (source), auto_compile_catch_handler, - SCM2PTR (source), + SCM_UNPACK_POINTER (source), NULL, NULL); } @@ -933,7 +933,7 @@ SCM_DEFINE (scm_primitive_load_path, "primitive-load-path", 0, 0, 1, if (stat_ret == 0 && compiled_is_fresh (full_filename, fallback, &stat_source, &stat_compiled)) { - scm_puts (";;; found fresh local cache at ", scm_current_error_port ()); + scm_puts_unlocked (";;; found fresh local cache at ", scm_current_error_port ()); scm_display (fallback, scm_current_error_port ()); scm_newline (scm_current_error_port ()); return scm_load_compiled_with_vm (fallback); @@ -998,7 +998,7 @@ init_build_info () for (i = 0; i < (sizeof (info) / sizeof (info[0])); i++) { - SCM key = scm_from_locale_symbol (info[i].name); + SCM key = scm_from_utf8_symbol (info[i].name); SCM val = scm_from_locale_string (info[i].value); *loc = scm_acons (key, val, *loc); } diff --git a/libguile/macros.c b/libguile/macros.c index 556e60f57..7423e9758 100644 --- a/libguile/macros.c +++ b/libguile/macros.c @@ -49,11 +49,11 @@ static int macro_print (SCM macro, SCM port, scm_print_state *pstate) { if (scm_is_false (SCM_MACRO_TYPE (macro))) - scm_puts ("#<primitive-syntax-transformer ", port); + scm_puts_unlocked ("#<primitive-syntax-transformer ", port); else - scm_puts ("#<syntax-transformer ", port); + scm_puts_unlocked ("#<syntax-transformer ", port); scm_iprin1 (scm_macro_name (macro), port, pstate); - scm_putc ('>', port); + scm_putc_unlocked ('>', port); return 1; } @@ -64,7 +64,7 @@ scm_i_make_primitive_macro (const char *name, scm_t_macro_primitive fn) { SCM z = scm_words (scm_tc16_macro, 5); SCM_SET_SMOB_DATA_N (z, 1, (scm_t_bits)fn); - SCM_SET_SMOB_OBJECT_N (z, 2, scm_from_locale_symbol (name)); + SCM_SET_SMOB_OBJECT_N (z, 2, scm_from_utf8_symbol (name)); SCM_SET_SMOB_OBJECT_N (z, 3, SCM_BOOL_F); SCM_SET_SMOB_OBJECT_N (z, 4, SCM_BOOL_F); return z; @@ -103,7 +103,7 @@ SCM_DEFINE (scm_make_syntax_transformer, "make-syntax-transformer", 3, 0, 0, SCM_VALIDATE_SYMBOL (2, type); z = scm_words (scm_tc16_macro, 5); - SCM_SET_SMOB_DATA_N (z, 1, prim); + SCM_SET_SMOB_DATA_N (z, 1, (scm_t_bits)prim); SCM_SET_SMOB_OBJECT_N (z, 2, name); SCM_SET_SMOB_OBJECT_N (z, 3, type); SCM_SET_SMOB_OBJECT_N (z, 4, binding); diff --git a/libguile/mallocs.c b/libguile/mallocs.c index 6a366aeea..bd8aee8ea 100644 --- a/libguile/mallocs.c +++ b/libguile/mallocs.c @@ -1,5 +1,5 @@ /* classes: src_files - * Copyright (C) 1995,1997,1998,2000,2001, 2006 Free Software Foundation, Inc. + * Copyright (C) 1995,1997,1998,2000,2001, 2006, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -46,9 +46,9 @@ scm_t_bits scm_tc16_malloc; static int malloc_print (SCM exp, SCM port, scm_print_state *pstate SCM_UNUSED) { - scm_puts("#<malloc ", port); + scm_puts_unlocked("#<malloc ", port); scm_uintprint (SCM_SMOB_DATA (exp), 16, port); - scm_putc('>', port); + scm_putc_unlocked('>', port); return 1; } diff --git a/libguile/memoize.c b/libguile/memoize.c index 911d97294..1be276b36 100644 --- a/libguile/memoize.c +++ b/libguile/memoize.c @@ -67,8 +67,8 @@ scm_t_bits scm_tc16_memoized; #define MAKMEMO(n, args) \ (scm_cell (scm_tc16_memoized | ((n) << 16), SCM_UNPACK (args))) -#define MAKMEMO_BEGIN(exps) \ - MAKMEMO (SCM_M_BEGIN, exps) +#define MAKMEMO_SEQ(head,tail) \ + MAKMEMO (SCM_M_SEQ, scm_cons (head, tail)) #define MAKMEMO_IF(test, then, else_) \ MAKMEMO (SCM_M_IF, scm_cons (test, scm_cons (then, else_))) #define FIXED_ARITY(nreq) \ @@ -124,7 +124,7 @@ scm_t_bits scm_tc16_memoizer; /* This table must agree with the list of M_ constants in memoize.h */ static const char *const memoized_tags[] = { - "begin", + "seq", "if", "lambda", "let", @@ -148,9 +148,9 @@ static const char *const memoized_tags[] = static int scm_print_memoized (SCM memoized, SCM port, scm_print_state *pstate) { - scm_puts ("#<memoized ", port); + scm_puts_unlocked ("#<memoized ", port); scm_write (scm_unmemoize_expression (memoized), port); - scm_puts (">", port); + scm_puts_unlocked (">", port); return 1; } @@ -241,12 +241,12 @@ memoize (SCM exp, SCM env) memoize (REF (exp, CONDITIONAL, CONSEQUENT), env), memoize (REF (exp, CONDITIONAL, ALTERNATE), env)); - case SCM_EXPANDED_APPLICATION: + case SCM_EXPANDED_CALL: { SCM proc, args; - proc = REF (exp, APPLICATION, PROC); - args = memoize_exps (REF (exp, APPLICATION, ARGS), env); + proc = REF (exp, CALL, PROC); + args = memoize_exps (REF (exp, CALL, ARGS), env); if (SCM_EXPANDED_TYPE (proc) == SCM_EXPANDED_TOPLEVEL_REF) { @@ -263,8 +263,23 @@ memoize (SCM exp, SCM env) return MAKMEMO_CALL (memoize (proc, env), scm_ilength (args), args); } - case SCM_EXPANDED_SEQUENCE: - return MAKMEMO_BEGIN (memoize_exps (REF (exp, SEQUENCE, EXPS), env)); + case SCM_EXPANDED_PRIMCALL: + { + SCM proc, args; + + if (scm_is_eq (scm_current_module (), scm_the_root_module ())) + proc = MAKMEMO_TOP_REF (REF (exp, PRIMCALL, NAME)); + else + proc = MAKMEMO_MOD_REF (list_of_guile, REF (exp, PRIMCALL, NAME), + SCM_BOOL_F); + args = memoize_exps (REF (exp, PRIMCALL, ARGS), env); + + return MAKMEMO_CALL (proc, scm_ilength (args), args); + } + + case SCM_EXPANDED_SEQ: + return MAKMEMO_SEQ (memoize (REF (exp, SEQ, HEAD), env), + memoize (REF (exp, SEQ, TAIL), env)); case SCM_EXPANDED_LAMBDA: /* The body will be a lambda-case. */ @@ -394,18 +409,21 @@ memoize (SCM exp, SCM env) if (in_order_p) { - SCM body_exps = SCM_EOL; + SCM body_exps = SCM_EOL, seq; for (; scm_is_pair (exps); exps = CDR (exps), i--) body_exps = scm_cons (MAKMEMO_LEX_SET (i-1, memoize (CAR (exps), new_env)), body_exps); - body_exps = scm_cons (memoize (body, new_env), body_exps); - body_exps = scm_reverse_x (body_exps, SCM_UNDEFINED); - return MAKMEMO_LET (undefs, MAKMEMO_BEGIN (body_exps)); + + seq = memoize (body, new_env); + for (; scm_is_pair (body_exps); body_exps = CDR (body_exps)) + seq = MAKMEMO_SEQ (CAR (body_exps), seq); + + return MAKMEMO_LET (undefs, seq); } else { - SCM sets = SCM_EOL, inits = SCM_EOL; + SCM sets = SCM_EOL, inits = SCM_EOL, set_seq; for (; scm_is_pair (exps); exps = CDR (exps), i--) { sets = scm_cons (MAKMEMO_LEX_SET ((i-1) + nvars, @@ -414,10 +432,18 @@ memoize (SCM exp, SCM env) inits = scm_cons (memoize (CAR (exps), new_env), inits); } inits = scm_reverse_x (inits, SCM_UNDEFINED); - return MAKMEMO_LET - (undefs, - MAKMEMO_BEGIN (scm_list_2 (MAKMEMO_LET (inits, MAKMEMO_BEGIN (sets)), - memoize (body, new_env)))); + + sets = scm_reverse_x (sets, SCM_UNDEFINED); + if (scm_is_null (sets)) + return memoize (body, env); + + for (set_seq = CAR (sets), sets = CDR (sets); scm_is_pair (sets); + sets = CDR (sets)) + set_seq = MAKMEMO_SEQ (CAR (sets), set_seq); + + return MAKMEMO_LET (undefs, + MAKMEMO_SEQ (MAKMEMO_LET (inits, set_seq), + memoize (body, new_env))); } } @@ -592,7 +618,7 @@ unmemoize_lexical (SCM n) char buf[16]; buf[15] = 0; snprintf (buf, 15, "<%u>", scm_to_uint32 (n)); - return scm_from_locale_symbol (buf); + return scm_from_utf8_symbol (buf); } static SCM @@ -608,8 +634,9 @@ unmemoize (const SCM expr) { case SCM_M_APPLY: return scm_cons (scm_sym_atapply, unmemoize_exprs (args)); - case SCM_M_BEGIN: - return scm_cons (scm_sym_begin, unmemoize_exprs (args)); + case SCM_M_SEQ: + return scm_list_3 (scm_sym_begin, unmemoize (CAR (args)), + unmemoize (CDR (args))); case SCM_M_CALL: return scm_cons (unmemoize (CAR (args)), unmemoize_exprs (CDDR (args))); case SCM_M_CONT: diff --git a/libguile/memoize.h b/libguile/memoize.h index 26bd5b1c1..da78b06fa 100644 --- a/libguile/memoize.h +++ b/libguile/memoize.h @@ -3,7 +3,7 @@ #ifndef SCM_MEMOIZE_H #define SCM_MEMOIZE_H -/* Copyright (C) 1995,1996,1998,1999,2000,2001,2002,2004,2008,2009,2010 +/* Copyright (C) 1995,1996,1998,1999,2000,2001,2002,2004,2008,2009,2010,2011 * Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or @@ -72,7 +72,7 @@ SCM_INTERNAL scm_t_bits scm_tc16_memoized; enum { - SCM_M_BEGIN, + SCM_M_SEQ, SCM_M_IF, SCM_M_LAMBDA, SCM_M_LET, diff --git a/libguile/modules.c b/libguile/modules.c index 6c3f2629e..7498549ee 100644 --- a/libguile/modules.c +++ b/libguile/modules.c @@ -153,7 +153,7 @@ convert_module_name (const char *name) ptr++; if (ptr > name) { - SCM sym = scm_from_locale_symboln (name, ptr-name); + SCM sym = scm_from_utf8_symboln (name, ptr-name); *tail = scm_cons (sym, SCM_EOL); tail = SCM_CDRLOC (*tail); } @@ -218,7 +218,7 @@ scm_c_export (const char *name, ...) if (name) { va_list ap; - SCM names = scm_cons (scm_from_locale_symbol (name), SCM_EOL); + SCM names = scm_cons (scm_from_utf8_symbol (name), SCM_EOL); SCM *tail = SCM_CDRLOC (names); va_start (ap, name); while (1) @@ -226,7 +226,7 @@ scm_c_export (const char *name, ...) const char *n = va_arg (ap, const char *); if (n == NULL) break; - *tail = scm_cons (scm_from_locale_symbol (n), SCM_EOL); + *tail = scm_cons (scm_from_utf8_symbol (n), SCM_EOL); tail = SCM_CDRLOC (*tail); } va_end (ap); @@ -695,7 +695,7 @@ scm_sym2var (SCM sym, SCM proc, SCM definep) { SCM var; - if (SCM_NIMP (proc)) + if (SCM_HEAP_OBJECT_P (proc)) { if (SCM_EVAL_CLOSURE_P (proc)) { @@ -734,7 +734,7 @@ scm_sym2var (SCM sym, SCM proc, SCM definep) SCM scm_c_module_lookup (SCM module, const char *name) { - return scm_module_lookup (module, scm_from_locale_symbol (name)); + return scm_module_lookup (module, scm_from_utf8_symbol (name)); } SCM @@ -754,7 +754,7 @@ scm_module_lookup (SCM module, SCM sym) SCM scm_c_lookup (const char *name) { - return scm_lookup (scm_from_locale_symbol (name)); + return scm_lookup (scm_from_utf8_symbol (name)); } SCM @@ -807,14 +807,14 @@ SCM scm_c_public_variable (const char *module_name, const char *name) { return scm_public_variable (convert_module_name (module_name), - scm_from_locale_symbol (name)); + scm_from_utf8_symbol (name)); } SCM scm_c_private_variable (const char *module_name, const char *name) { return scm_private_variable (convert_module_name (module_name), - scm_from_locale_symbol (name)); + scm_from_utf8_symbol (name)); } SCM @@ -849,14 +849,14 @@ SCM scm_c_public_lookup (const char *module_name, const char *name) { return scm_public_lookup (convert_module_name (module_name), - scm_from_locale_symbol (name)); + scm_from_utf8_symbol (name)); } SCM scm_c_private_lookup (const char *module_name, const char *name) { return scm_private_lookup (convert_module_name (module_name), - scm_from_locale_symbol (name)); + scm_from_utf8_symbol (name)); } SCM @@ -875,20 +875,20 @@ SCM scm_c_public_ref (const char *module_name, const char *name) { return scm_public_ref (convert_module_name (module_name), - scm_from_locale_symbol (name)); + scm_from_utf8_symbol (name)); } SCM scm_c_private_ref (const char *module_name, const char *name) { return scm_private_ref (convert_module_name (module_name), - scm_from_locale_symbol (name)); + scm_from_utf8_symbol (name)); } SCM scm_c_module_define (SCM module, const char *name, SCM value) { - return scm_module_define (module, scm_from_locale_symbol (name), value); + return scm_module_define (module, scm_from_utf8_symbol (name), value); } SCM @@ -907,7 +907,7 @@ scm_module_define (SCM module, SCM sym, SCM value) SCM scm_c_define (const char *name, SCM value) { - return scm_define (scm_from_locale_symbol (name), value); + return scm_define (scm_from_utf8_symbol (name), value); } SCM_DEFINE (scm_define, "define!", 2, 0, 0, @@ -960,16 +960,8 @@ SCM_DEFINE (scm_module_reverse_lookup, "module-reverse-lookup", 2, 0, 0, { handle = SCM_CAR (ls); - if (SCM_UNPACK (SCM_CAR (handle)) == 0) - { - /* FIXME: We hit a weak pair whose car has become unreachable. - We should remove the pair in question or something. */ - } - else - { - if (scm_is_eq (SCM_CDR (handle), variable)) - return SCM_CAR (handle); - } + if (scm_is_eq (SCM_CDR (handle), variable)) + return SCM_CAR (handle); ls = SCM_CDR (ls); } diff --git a/libguile/numbers.c b/libguile/numbers.c index e5b4ed938..f15c724de 100644 --- a/libguile/numbers.c +++ b/libguile/numbers.c @@ -183,7 +183,7 @@ finalize_bignum (GC_PTR ptr, GC_PTR data) { SCM bignum; - bignum = PTR2SCM (ptr); + bignum = SCM_PACK_POINTER (ptr); mpz_clear (SCM_I_BIG_MPZ (bignum)); } @@ -562,7 +562,7 @@ SCM_PRIMITIVE_GENERIC (scm_exact_p, "exact?", 1, 0, 0, else if (SCM_NUMBERP (x)) return SCM_BOOL_T; else - SCM_WTA_DISPATCH_1 (g_scm_exact_p, x, 1, s_scm_exact_p); + return scm_wta_dispatch_1 (g_scm_exact_p, x, 1, s_scm_exact_p); } #undef FUNC_NAME @@ -583,7 +583,7 @@ SCM_PRIMITIVE_GENERIC (scm_inexact_p, "inexact?", 1, 0, 0, else if (SCM_NUMBERP (x)) return SCM_BOOL_F; else - SCM_WTA_DISPATCH_1 (g_scm_inexact_p, x, 1, s_scm_inexact_p); + return scm_wta_dispatch_1 (g_scm_inexact_p, x, 1, s_scm_inexact_p); } #undef FUNC_NAME @@ -622,7 +622,7 @@ SCM_PRIMITIVE_GENERIC (scm_odd_p, "odd?", 1, 0, 0, return SCM_BOOL_F; } } - SCM_WTA_DISPATCH_1 (g_scm_odd_p, n, 1, s_scm_odd_p); + return scm_wta_dispatch_1 (g_scm_odd_p, n, 1, s_scm_odd_p); } #undef FUNC_NAME @@ -656,7 +656,7 @@ SCM_PRIMITIVE_GENERIC (scm_even_p, "even?", 1, 0, 0, return SCM_BOOL_T; } } - SCM_WTA_DISPATCH_1 (g_scm_even_p, n, 1, s_scm_even_p); + return scm_wta_dispatch_1 (g_scm_even_p, n, 1, s_scm_even_p); } #undef FUNC_NAME @@ -671,7 +671,7 @@ SCM_PRIMITIVE_GENERIC (scm_finite_p, "finite?", 1, 0, 0, else if (scm_is_real (x)) return SCM_BOOL_T; else - SCM_WTA_DISPATCH_1 (g_scm_finite_p, x, 1, s_scm_finite_p); + return scm_wta_dispatch_1 (g_scm_finite_p, x, 1, s_scm_finite_p); } #undef FUNC_NAME @@ -686,7 +686,7 @@ SCM_PRIMITIVE_GENERIC (scm_inf_p, "inf?", 1, 0, 0, else if (scm_is_real (x)) return SCM_BOOL_F; else - SCM_WTA_DISPATCH_1 (g_scm_inf_p, x, 1, s_scm_inf_p); + return scm_wta_dispatch_1 (g_scm_inf_p, x, 1, s_scm_inf_p); } #undef FUNC_NAME @@ -701,7 +701,7 @@ SCM_PRIMITIVE_GENERIC (scm_nan_p, "nan?", 1, 0, 0, else if (scm_is_real (x)) return SCM_BOOL_F; else - SCM_WTA_DISPATCH_1 (g_scm_nan_p, x, 1, s_scm_nan_p); + return scm_wta_dispatch_1 (g_scm_nan_p, x, 1, s_scm_nan_p); } #undef FUNC_NAME @@ -828,7 +828,7 @@ SCM_PRIMITIVE_GENERIC (scm_abs, "abs", 1, 0, 0, SCM_FRACTION_DENOMINATOR (x)); } else - SCM_WTA_DISPATCH_1 (g_scm_abs, x, 1, s_scm_abs); + return scm_wta_dispatch_1 (g_scm_abs, x, 1, s_scm_abs); } #undef FUNC_NAME @@ -843,10 +843,10 @@ SCM_PRIMITIVE_GENERIC (scm_quotient, "quotient", 2, 0, 0, if (SCM_LIKELY (scm_is_integer (y))) return scm_truncate_quotient (x, y); else - SCM_WTA_DISPATCH_2 (g_scm_quotient, x, y, SCM_ARG2, s_scm_quotient); + return scm_wta_dispatch_2 (g_scm_quotient, x, y, SCM_ARG2, s_scm_quotient); } else - SCM_WTA_DISPATCH_2 (g_scm_quotient, x, y, SCM_ARG1, s_scm_quotient); + return scm_wta_dispatch_2 (g_scm_quotient, x, y, SCM_ARG1, s_scm_quotient); } #undef FUNC_NAME @@ -864,10 +864,10 @@ SCM_PRIMITIVE_GENERIC (scm_remainder, "remainder", 2, 0, 0, if (SCM_LIKELY (scm_is_integer (y))) return scm_truncate_remainder (x, y); else - SCM_WTA_DISPATCH_2 (g_scm_remainder, x, y, SCM_ARG2, s_scm_remainder); + return scm_wta_dispatch_2 (g_scm_remainder, x, y, SCM_ARG2, s_scm_remainder); } else - SCM_WTA_DISPATCH_2 (g_scm_remainder, x, y, SCM_ARG1, s_scm_remainder); + return scm_wta_dispatch_2 (g_scm_remainder, x, y, SCM_ARG1, s_scm_remainder); } #undef FUNC_NAME @@ -886,10 +886,10 @@ SCM_PRIMITIVE_GENERIC (scm_modulo, "modulo", 2, 0, 0, if (SCM_LIKELY (scm_is_integer (y))) return scm_floor_remainder (x, y); else - SCM_WTA_DISPATCH_2 (g_scm_modulo, x, y, SCM_ARG2, s_scm_modulo); + return scm_wta_dispatch_2 (g_scm_modulo, x, y, SCM_ARG2, s_scm_modulo); } else - SCM_WTA_DISPATCH_2 (g_scm_modulo, x, y, SCM_ARG1, s_scm_modulo); + return scm_wta_dispatch_2 (g_scm_modulo, x, y, SCM_ARG1, s_scm_modulo); } #undef FUNC_NAME @@ -910,10 +910,9 @@ static void two_valued_wta_dispatch_2 (SCM gf, SCM a1, SCM a2, int pos, const char *subr, SCM *rp1, SCM *rp2) { - if (SCM_UNPACK (gf)) - scm_i_extract_values_2 (scm_call_generic_2 (gf, a1, a2), rp1, rp2); - else - scm_wrong_type_arg (subr, pos, (pos == SCM_ARG1) ? a1 : a2); + SCM vals = scm_wta_dispatch_2 (gf, a1, a2, pos, subr); + + scm_i_extract_values_2 (vals, rp1, rp2); } SCM_DEFINE (scm_euclidean_quotient, "euclidean-quotient", 2, 0, 0, @@ -1045,8 +1044,8 @@ SCM_PRIMITIVE_GENERIC (scm_floor_quotient, "floor-quotient", 2, 0, 0, else if (SCM_FRACTIONP (y)) return scm_i_exact_rational_floor_quotient (x, y); else - SCM_WTA_DISPATCH_2 (g_scm_floor_quotient, x, y, SCM_ARG2, - s_scm_floor_quotient); + return scm_wta_dispatch_2 (g_scm_floor_quotient, x, y, SCM_ARG2, + s_scm_floor_quotient); } else if (SCM_BIGP (x)) { @@ -1086,8 +1085,8 @@ SCM_PRIMITIVE_GENERIC (scm_floor_quotient, "floor-quotient", 2, 0, 0, else if (SCM_FRACTIONP (y)) return scm_i_exact_rational_floor_quotient (x, y); else - SCM_WTA_DISPATCH_2 (g_scm_floor_quotient, x, y, SCM_ARG2, - s_scm_floor_quotient); + return scm_wta_dispatch_2 (g_scm_floor_quotient, x, y, SCM_ARG2, + s_scm_floor_quotient); } else if (SCM_REALP (x)) { @@ -1096,8 +1095,8 @@ SCM_PRIMITIVE_GENERIC (scm_floor_quotient, "floor-quotient", 2, 0, 0, return scm_i_inexact_floor_quotient (SCM_REAL_VALUE (x), scm_to_double (y)); else - SCM_WTA_DISPATCH_2 (g_scm_floor_quotient, x, y, SCM_ARG2, - s_scm_floor_quotient); + return scm_wta_dispatch_2 (g_scm_floor_quotient, x, y, SCM_ARG2, + s_scm_floor_quotient); } else if (SCM_FRACTIONP (x)) { @@ -1107,12 +1106,12 @@ SCM_PRIMITIVE_GENERIC (scm_floor_quotient, "floor-quotient", 2, 0, 0, else if (SCM_I_INUMP (y) || SCM_BIGP (y) || SCM_FRACTIONP (y)) return scm_i_exact_rational_floor_quotient (x, y); else - SCM_WTA_DISPATCH_2 (g_scm_floor_quotient, x, y, SCM_ARG2, - s_scm_floor_quotient); + return scm_wta_dispatch_2 (g_scm_floor_quotient, x, y, SCM_ARG2, + s_scm_floor_quotient); } else - SCM_WTA_DISPATCH_2 (g_scm_floor_quotient, x, y, SCM_ARG1, - s_scm_floor_quotient); + return scm_wta_dispatch_2 (g_scm_floor_quotient, x, y, SCM_ARG1, + s_scm_floor_quotient); } #undef FUNC_NAME @@ -1205,8 +1204,8 @@ SCM_PRIMITIVE_GENERIC (scm_floor_remainder, "floor-remainder", 2, 0, 0, else if (SCM_FRACTIONP (y)) return scm_i_exact_rational_floor_remainder (x, y); else - SCM_WTA_DISPATCH_2 (g_scm_floor_remainder, x, y, SCM_ARG2, - s_scm_floor_remainder); + return scm_wta_dispatch_2 (g_scm_floor_remainder, x, y, SCM_ARG2, + s_scm_floor_remainder); } else if (SCM_BIGP (x)) { @@ -1241,8 +1240,8 @@ SCM_PRIMITIVE_GENERIC (scm_floor_remainder, "floor-remainder", 2, 0, 0, else if (SCM_FRACTIONP (y)) return scm_i_exact_rational_floor_remainder (x, y); else - SCM_WTA_DISPATCH_2 (g_scm_floor_remainder, x, y, SCM_ARG2, - s_scm_floor_remainder); + return scm_wta_dispatch_2 (g_scm_floor_remainder, x, y, SCM_ARG2, + s_scm_floor_remainder); } else if (SCM_REALP (x)) { @@ -1251,8 +1250,8 @@ SCM_PRIMITIVE_GENERIC (scm_floor_remainder, "floor-remainder", 2, 0, 0, return scm_i_inexact_floor_remainder (SCM_REAL_VALUE (x), scm_to_double (y)); else - SCM_WTA_DISPATCH_2 (g_scm_floor_remainder, x, y, SCM_ARG2, - s_scm_floor_remainder); + return scm_wta_dispatch_2 (g_scm_floor_remainder, x, y, SCM_ARG2, + s_scm_floor_remainder); } else if (SCM_FRACTIONP (x)) { @@ -1262,12 +1261,12 @@ SCM_PRIMITIVE_GENERIC (scm_floor_remainder, "floor-remainder", 2, 0, 0, else if (SCM_I_INUMP (y) || SCM_BIGP (y) || SCM_FRACTIONP (y)) return scm_i_exact_rational_floor_remainder (x, y); else - SCM_WTA_DISPATCH_2 (g_scm_floor_remainder, x, y, SCM_ARG2, - s_scm_floor_remainder); + return scm_wta_dispatch_2 (g_scm_floor_remainder, x, y, SCM_ARG2, + s_scm_floor_remainder); } else - SCM_WTA_DISPATCH_2 (g_scm_floor_remainder, x, y, SCM_ARG1, - s_scm_floor_remainder); + return scm_wta_dispatch_2 (g_scm_floor_remainder, x, y, SCM_ARG1, + s_scm_floor_remainder); } #undef FUNC_NAME @@ -1578,8 +1577,8 @@ SCM_PRIMITIVE_GENERIC (scm_ceiling_quotient, "ceiling-quotient", 2, 0, 0, else if (SCM_FRACTIONP (y)) return scm_i_exact_rational_ceiling_quotient (x, y); else - SCM_WTA_DISPATCH_2 (g_scm_ceiling_quotient, x, y, SCM_ARG2, - s_scm_ceiling_quotient); + return scm_wta_dispatch_2 (g_scm_ceiling_quotient, x, y, SCM_ARG2, + s_scm_ceiling_quotient); } else if (SCM_BIGP (x)) { @@ -1619,8 +1618,8 @@ SCM_PRIMITIVE_GENERIC (scm_ceiling_quotient, "ceiling-quotient", 2, 0, 0, else if (SCM_FRACTIONP (y)) return scm_i_exact_rational_ceiling_quotient (x, y); else - SCM_WTA_DISPATCH_2 (g_scm_ceiling_quotient, x, y, SCM_ARG2, - s_scm_ceiling_quotient); + return scm_wta_dispatch_2 (g_scm_ceiling_quotient, x, y, SCM_ARG2, + s_scm_ceiling_quotient); } else if (SCM_REALP (x)) { @@ -1629,8 +1628,8 @@ SCM_PRIMITIVE_GENERIC (scm_ceiling_quotient, "ceiling-quotient", 2, 0, 0, return scm_i_inexact_ceiling_quotient (SCM_REAL_VALUE (x), scm_to_double (y)); else - SCM_WTA_DISPATCH_2 (g_scm_ceiling_quotient, x, y, SCM_ARG2, - s_scm_ceiling_quotient); + return scm_wta_dispatch_2 (g_scm_ceiling_quotient, x, y, SCM_ARG2, + s_scm_ceiling_quotient); } else if (SCM_FRACTIONP (x)) { @@ -1640,12 +1639,12 @@ SCM_PRIMITIVE_GENERIC (scm_ceiling_quotient, "ceiling-quotient", 2, 0, 0, else if (SCM_I_INUMP (y) || SCM_BIGP (y) || SCM_FRACTIONP (y)) return scm_i_exact_rational_ceiling_quotient (x, y); else - SCM_WTA_DISPATCH_2 (g_scm_ceiling_quotient, x, y, SCM_ARG2, - s_scm_ceiling_quotient); + return scm_wta_dispatch_2 (g_scm_ceiling_quotient, x, y, SCM_ARG2, + s_scm_ceiling_quotient); } else - SCM_WTA_DISPATCH_2 (g_scm_ceiling_quotient, x, y, SCM_ARG1, - s_scm_ceiling_quotient); + return scm_wta_dispatch_2 (g_scm_ceiling_quotient, x, y, SCM_ARG1, + s_scm_ceiling_quotient); } #undef FUNC_NAME @@ -1748,8 +1747,8 @@ SCM_PRIMITIVE_GENERIC (scm_ceiling_remainder, "ceiling-remainder", 2, 0, 0, else if (SCM_FRACTIONP (y)) return scm_i_exact_rational_ceiling_remainder (x, y); else - SCM_WTA_DISPATCH_2 (g_scm_ceiling_remainder, x, y, SCM_ARG2, - s_scm_ceiling_remainder); + return scm_wta_dispatch_2 (g_scm_ceiling_remainder, x, y, SCM_ARG2, + s_scm_ceiling_remainder); } else if (SCM_BIGP (x)) { @@ -1784,8 +1783,8 @@ SCM_PRIMITIVE_GENERIC (scm_ceiling_remainder, "ceiling-remainder", 2, 0, 0, else if (SCM_FRACTIONP (y)) return scm_i_exact_rational_ceiling_remainder (x, y); else - SCM_WTA_DISPATCH_2 (g_scm_ceiling_remainder, x, y, SCM_ARG2, - s_scm_ceiling_remainder); + return scm_wta_dispatch_2 (g_scm_ceiling_remainder, x, y, SCM_ARG2, + s_scm_ceiling_remainder); } else if (SCM_REALP (x)) { @@ -1794,8 +1793,8 @@ SCM_PRIMITIVE_GENERIC (scm_ceiling_remainder, "ceiling-remainder", 2, 0, 0, return scm_i_inexact_ceiling_remainder (SCM_REAL_VALUE (x), scm_to_double (y)); else - SCM_WTA_DISPATCH_2 (g_scm_ceiling_remainder, x, y, SCM_ARG2, - s_scm_ceiling_remainder); + return scm_wta_dispatch_2 (g_scm_ceiling_remainder, x, y, SCM_ARG2, + s_scm_ceiling_remainder); } else if (SCM_FRACTIONP (x)) { @@ -1805,12 +1804,12 @@ SCM_PRIMITIVE_GENERIC (scm_ceiling_remainder, "ceiling-remainder", 2, 0, 0, else if (SCM_I_INUMP (y) || SCM_BIGP (y) || SCM_FRACTIONP (y)) return scm_i_exact_rational_ceiling_remainder (x, y); else - SCM_WTA_DISPATCH_2 (g_scm_ceiling_remainder, x, y, SCM_ARG2, - s_scm_ceiling_remainder); + return scm_wta_dispatch_2 (g_scm_ceiling_remainder, x, y, SCM_ARG2, + s_scm_ceiling_remainder); } else - SCM_WTA_DISPATCH_2 (g_scm_ceiling_remainder, x, y, SCM_ARG1, - s_scm_ceiling_remainder); + return scm_wta_dispatch_2 (g_scm_ceiling_remainder, x, y, SCM_ARG1, + s_scm_ceiling_remainder); } #undef FUNC_NAME @@ -2110,8 +2109,8 @@ SCM_PRIMITIVE_GENERIC (scm_truncate_quotient, "truncate-quotient", 2, 0, 0, else if (SCM_FRACTIONP (y)) return scm_i_exact_rational_truncate_quotient (x, y); else - SCM_WTA_DISPATCH_2 (g_scm_truncate_quotient, x, y, SCM_ARG2, - s_scm_truncate_quotient); + return scm_wta_dispatch_2 (g_scm_truncate_quotient, x, y, SCM_ARG2, + s_scm_truncate_quotient); } else if (SCM_BIGP (x)) { @@ -2151,8 +2150,8 @@ SCM_PRIMITIVE_GENERIC (scm_truncate_quotient, "truncate-quotient", 2, 0, 0, else if (SCM_FRACTIONP (y)) return scm_i_exact_rational_truncate_quotient (x, y); else - SCM_WTA_DISPATCH_2 (g_scm_truncate_quotient, x, y, SCM_ARG2, - s_scm_truncate_quotient); + return scm_wta_dispatch_2 (g_scm_truncate_quotient, x, y, SCM_ARG2, + s_scm_truncate_quotient); } else if (SCM_REALP (x)) { @@ -2161,8 +2160,8 @@ SCM_PRIMITIVE_GENERIC (scm_truncate_quotient, "truncate-quotient", 2, 0, 0, return scm_i_inexact_truncate_quotient (SCM_REAL_VALUE (x), scm_to_double (y)); else - SCM_WTA_DISPATCH_2 (g_scm_truncate_quotient, x, y, SCM_ARG2, - s_scm_truncate_quotient); + return scm_wta_dispatch_2 (g_scm_truncate_quotient, x, y, SCM_ARG2, + s_scm_truncate_quotient); } else if (SCM_FRACTIONP (x)) { @@ -2172,12 +2171,12 @@ SCM_PRIMITIVE_GENERIC (scm_truncate_quotient, "truncate-quotient", 2, 0, 0, else if (SCM_I_INUMP (y) || SCM_BIGP (y) || SCM_FRACTIONP (y)) return scm_i_exact_rational_truncate_quotient (x, y); else - SCM_WTA_DISPATCH_2 (g_scm_truncate_quotient, x, y, SCM_ARG2, - s_scm_truncate_quotient); + return scm_wta_dispatch_2 (g_scm_truncate_quotient, x, y, SCM_ARG2, + s_scm_truncate_quotient); } else - SCM_WTA_DISPATCH_2 (g_scm_truncate_quotient, x, y, SCM_ARG1, - s_scm_truncate_quotient); + return scm_wta_dispatch_2 (g_scm_truncate_quotient, x, y, SCM_ARG1, + s_scm_truncate_quotient); } #undef FUNC_NAME @@ -2245,8 +2244,8 @@ SCM_PRIMITIVE_GENERIC (scm_truncate_remainder, "truncate-remainder", 2, 0, 0, else if (SCM_FRACTIONP (y)) return scm_i_exact_rational_truncate_remainder (x, y); else - SCM_WTA_DISPATCH_2 (g_scm_truncate_remainder, x, y, SCM_ARG2, - s_scm_truncate_remainder); + return scm_wta_dispatch_2 (g_scm_truncate_remainder, x, y, SCM_ARG2, + s_scm_truncate_remainder); } else if (SCM_BIGP (x)) { @@ -2279,8 +2278,8 @@ SCM_PRIMITIVE_GENERIC (scm_truncate_remainder, "truncate-remainder", 2, 0, 0, else if (SCM_FRACTIONP (y)) return scm_i_exact_rational_truncate_remainder (x, y); else - SCM_WTA_DISPATCH_2 (g_scm_truncate_remainder, x, y, SCM_ARG2, - s_scm_truncate_remainder); + return scm_wta_dispatch_2 (g_scm_truncate_remainder, x, y, SCM_ARG2, + s_scm_truncate_remainder); } else if (SCM_REALP (x)) { @@ -2289,8 +2288,8 @@ SCM_PRIMITIVE_GENERIC (scm_truncate_remainder, "truncate-remainder", 2, 0, 0, return scm_i_inexact_truncate_remainder (SCM_REAL_VALUE (x), scm_to_double (y)); else - SCM_WTA_DISPATCH_2 (g_scm_truncate_remainder, x, y, SCM_ARG2, - s_scm_truncate_remainder); + return scm_wta_dispatch_2 (g_scm_truncate_remainder, x, y, SCM_ARG2, + s_scm_truncate_remainder); } else if (SCM_FRACTIONP (x)) { @@ -2300,12 +2299,12 @@ SCM_PRIMITIVE_GENERIC (scm_truncate_remainder, "truncate-remainder", 2, 0, 0, else if (SCM_I_INUMP (y) || SCM_BIGP (y) || SCM_FRACTIONP (y)) return scm_i_exact_rational_truncate_remainder (x, y); else - SCM_WTA_DISPATCH_2 (g_scm_truncate_remainder, x, y, SCM_ARG2, - s_scm_truncate_remainder); + return scm_wta_dispatch_2 (g_scm_truncate_remainder, x, y, SCM_ARG2, + s_scm_truncate_remainder); } else - SCM_WTA_DISPATCH_2 (g_scm_truncate_remainder, x, y, SCM_ARG1, - s_scm_truncate_remainder); + return scm_wta_dispatch_2 (g_scm_truncate_remainder, x, y, SCM_ARG1, + s_scm_truncate_remainder); } #undef FUNC_NAME @@ -2592,8 +2591,8 @@ SCM_PRIMITIVE_GENERIC (scm_centered_quotient, "centered-quotient", 2, 0, 0, else if (SCM_FRACTIONP (y)) return scm_i_exact_rational_centered_quotient (x, y); else - SCM_WTA_DISPATCH_2 (g_scm_centered_quotient, x, y, SCM_ARG2, - s_scm_centered_quotient); + return scm_wta_dispatch_2 (g_scm_centered_quotient, x, y, SCM_ARG2, + s_scm_centered_quotient); } else if (SCM_BIGP (x)) { @@ -2641,8 +2640,8 @@ SCM_PRIMITIVE_GENERIC (scm_centered_quotient, "centered-quotient", 2, 0, 0, else if (SCM_FRACTIONP (y)) return scm_i_exact_rational_centered_quotient (x, y); else - SCM_WTA_DISPATCH_2 (g_scm_centered_quotient, x, y, SCM_ARG2, - s_scm_centered_quotient); + return scm_wta_dispatch_2 (g_scm_centered_quotient, x, y, SCM_ARG2, + s_scm_centered_quotient); } else if (SCM_REALP (x)) { @@ -2651,8 +2650,8 @@ SCM_PRIMITIVE_GENERIC (scm_centered_quotient, "centered-quotient", 2, 0, 0, return scm_i_inexact_centered_quotient (SCM_REAL_VALUE (x), scm_to_double (y)); else - SCM_WTA_DISPATCH_2 (g_scm_centered_quotient, x, y, SCM_ARG2, - s_scm_centered_quotient); + return scm_wta_dispatch_2 (g_scm_centered_quotient, x, y, SCM_ARG2, + s_scm_centered_quotient); } else if (SCM_FRACTIONP (x)) { @@ -2662,12 +2661,12 @@ SCM_PRIMITIVE_GENERIC (scm_centered_quotient, "centered-quotient", 2, 0, 0, else if (SCM_I_INUMP (y) || SCM_BIGP (y) || SCM_FRACTIONP (y)) return scm_i_exact_rational_centered_quotient (x, y); else - SCM_WTA_DISPATCH_2 (g_scm_centered_quotient, x, y, SCM_ARG2, - s_scm_centered_quotient); + return scm_wta_dispatch_2 (g_scm_centered_quotient, x, y, SCM_ARG2, + s_scm_centered_quotient); } else - SCM_WTA_DISPATCH_2 (g_scm_centered_quotient, x, y, SCM_ARG1, - s_scm_centered_quotient); + return scm_wta_dispatch_2 (g_scm_centered_quotient, x, y, SCM_ARG1, + s_scm_centered_quotient); } #undef FUNC_NAME @@ -2806,8 +2805,8 @@ SCM_PRIMITIVE_GENERIC (scm_centered_remainder, "centered-remainder", 2, 0, 0, else if (SCM_FRACTIONP (y)) return scm_i_exact_rational_centered_remainder (x, y); else - SCM_WTA_DISPATCH_2 (g_scm_centered_remainder, x, y, SCM_ARG2, - s_scm_centered_remainder); + return scm_wta_dispatch_2 (g_scm_centered_remainder, x, y, SCM_ARG2, + s_scm_centered_remainder); } else if (SCM_BIGP (x)) { @@ -2847,8 +2846,8 @@ SCM_PRIMITIVE_GENERIC (scm_centered_remainder, "centered-remainder", 2, 0, 0, else if (SCM_FRACTIONP (y)) return scm_i_exact_rational_centered_remainder (x, y); else - SCM_WTA_DISPATCH_2 (g_scm_centered_remainder, x, y, SCM_ARG2, - s_scm_centered_remainder); + return scm_wta_dispatch_2 (g_scm_centered_remainder, x, y, SCM_ARG2, + s_scm_centered_remainder); } else if (SCM_REALP (x)) { @@ -2857,8 +2856,8 @@ SCM_PRIMITIVE_GENERIC (scm_centered_remainder, "centered-remainder", 2, 0, 0, return scm_i_inexact_centered_remainder (SCM_REAL_VALUE (x), scm_to_double (y)); else - SCM_WTA_DISPATCH_2 (g_scm_centered_remainder, x, y, SCM_ARG2, - s_scm_centered_remainder); + return scm_wta_dispatch_2 (g_scm_centered_remainder, x, y, SCM_ARG2, + s_scm_centered_remainder); } else if (SCM_FRACTIONP (x)) { @@ -2868,12 +2867,12 @@ SCM_PRIMITIVE_GENERIC (scm_centered_remainder, "centered-remainder", 2, 0, 0, else if (SCM_I_INUMP (y) || SCM_BIGP (y) || SCM_FRACTIONP (y)) return scm_i_exact_rational_centered_remainder (x, y); else - SCM_WTA_DISPATCH_2 (g_scm_centered_remainder, x, y, SCM_ARG2, - s_scm_centered_remainder); + return scm_wta_dispatch_2 (g_scm_centered_remainder, x, y, SCM_ARG2, + s_scm_centered_remainder); } else - SCM_WTA_DISPATCH_2 (g_scm_centered_remainder, x, y, SCM_ARG1, - s_scm_centered_remainder); + return scm_wta_dispatch_2 (g_scm_centered_remainder, x, y, SCM_ARG1, + s_scm_centered_remainder); } #undef FUNC_NAME @@ -3288,8 +3287,8 @@ SCM_PRIMITIVE_GENERIC (scm_round_quotient, "round-quotient", 2, 0, 0, else if (SCM_FRACTIONP (y)) return scm_i_exact_rational_round_quotient (x, y); else - SCM_WTA_DISPATCH_2 (g_scm_round_quotient, x, y, SCM_ARG2, - s_scm_round_quotient); + return scm_wta_dispatch_2 (g_scm_round_quotient, x, y, SCM_ARG2, + s_scm_round_quotient); } else if (SCM_BIGP (x)) { @@ -3339,8 +3338,8 @@ SCM_PRIMITIVE_GENERIC (scm_round_quotient, "round-quotient", 2, 0, 0, else if (SCM_FRACTIONP (y)) return scm_i_exact_rational_round_quotient (x, y); else - SCM_WTA_DISPATCH_2 (g_scm_round_quotient, x, y, SCM_ARG2, - s_scm_round_quotient); + return scm_wta_dispatch_2 (g_scm_round_quotient, x, y, SCM_ARG2, + s_scm_round_quotient); } else if (SCM_REALP (x)) { @@ -3349,8 +3348,8 @@ SCM_PRIMITIVE_GENERIC (scm_round_quotient, "round-quotient", 2, 0, 0, return scm_i_inexact_round_quotient (SCM_REAL_VALUE (x), scm_to_double (y)); else - SCM_WTA_DISPATCH_2 (g_scm_round_quotient, x, y, SCM_ARG2, - s_scm_round_quotient); + return scm_wta_dispatch_2 (g_scm_round_quotient, x, y, SCM_ARG2, + s_scm_round_quotient); } else if (SCM_FRACTIONP (x)) { @@ -3360,12 +3359,12 @@ SCM_PRIMITIVE_GENERIC (scm_round_quotient, "round-quotient", 2, 0, 0, else if (SCM_I_INUMP (y) || SCM_BIGP (y) || SCM_FRACTIONP (y)) return scm_i_exact_rational_round_quotient (x, y); else - SCM_WTA_DISPATCH_2 (g_scm_round_quotient, x, y, SCM_ARG2, - s_scm_round_quotient); + return scm_wta_dispatch_2 (g_scm_round_quotient, x, y, SCM_ARG2, + s_scm_round_quotient); } else - SCM_WTA_DISPATCH_2 (g_scm_round_quotient, x, y, SCM_ARG1, - s_scm_round_quotient); + return scm_wta_dispatch_2 (g_scm_round_quotient, x, y, SCM_ARG1, + s_scm_round_quotient); } #undef FUNC_NAME @@ -3492,8 +3491,8 @@ SCM_PRIMITIVE_GENERIC (scm_round_remainder, "round-remainder", 2, 0, 0, else if (SCM_FRACTIONP (y)) return scm_i_exact_rational_round_remainder (x, y); else - SCM_WTA_DISPATCH_2 (g_scm_round_remainder, x, y, SCM_ARG2, - s_scm_round_remainder); + return scm_wta_dispatch_2 (g_scm_round_remainder, x, y, SCM_ARG2, + s_scm_round_remainder); } else if (SCM_BIGP (x)) { @@ -3540,8 +3539,8 @@ SCM_PRIMITIVE_GENERIC (scm_round_remainder, "round-remainder", 2, 0, 0, else if (SCM_FRACTIONP (y)) return scm_i_exact_rational_round_remainder (x, y); else - SCM_WTA_DISPATCH_2 (g_scm_round_remainder, x, y, SCM_ARG2, - s_scm_round_remainder); + return scm_wta_dispatch_2 (g_scm_round_remainder, x, y, SCM_ARG2, + s_scm_round_remainder); } else if (SCM_REALP (x)) { @@ -3550,8 +3549,8 @@ SCM_PRIMITIVE_GENERIC (scm_round_remainder, "round-remainder", 2, 0, 0, return scm_i_inexact_round_remainder (SCM_REAL_VALUE (x), scm_to_double (y)); else - SCM_WTA_DISPATCH_2 (g_scm_round_remainder, x, y, SCM_ARG2, - s_scm_round_remainder); + return scm_wta_dispatch_2 (g_scm_round_remainder, x, y, SCM_ARG2, + s_scm_round_remainder); } else if (SCM_FRACTIONP (x)) { @@ -3561,12 +3560,12 @@ SCM_PRIMITIVE_GENERIC (scm_round_remainder, "round-remainder", 2, 0, 0, else if (SCM_I_INUMP (y) || SCM_BIGP (y) || SCM_FRACTIONP (y)) return scm_i_exact_rational_round_remainder (x, y); else - SCM_WTA_DISPATCH_2 (g_scm_round_remainder, x, y, SCM_ARG2, - s_scm_round_remainder); + return scm_wta_dispatch_2 (g_scm_round_remainder, x, y, SCM_ARG2, + s_scm_round_remainder); } else - SCM_WTA_DISPATCH_2 (g_scm_round_remainder, x, y, SCM_ARG1, - s_scm_round_remainder); + return scm_wta_dispatch_2 (g_scm_round_remainder, x, y, SCM_ARG1, + s_scm_round_remainder); } #undef FUNC_NAME @@ -3950,7 +3949,7 @@ scm_gcd (SCM x, SCM y) goto big_inum; } else - SCM_WTA_DISPATCH_2 (g_gcd, x, y, SCM_ARG2, s_gcd); + return scm_wta_dispatch_2 (g_gcd, x, y, SCM_ARG2, s_gcd); } else if (SCM_BIGP (x)) { @@ -3980,10 +3979,10 @@ scm_gcd (SCM x, SCM y) return scm_i_normbig (result); } else - SCM_WTA_DISPATCH_2 (g_gcd, x, y, SCM_ARG2, s_gcd); + return scm_wta_dispatch_2 (g_gcd, x, y, SCM_ARG2, s_gcd); } else - SCM_WTA_DISPATCH_2 (g_gcd, x, y, SCM_ARG1, s_gcd); + return scm_wta_dispatch_2 (g_gcd, x, y, SCM_ARG1, s_gcd); } SCM_PRIMITIVE_GENERIC (scm_i_lcm, "lcm", 0, 2, 1, @@ -4014,10 +4013,11 @@ scm_lcm (SCM n1, SCM n2) n2 = SCM_I_MAKINUM (1L); } - SCM_GASSERT2 (SCM_I_INUMP (n1) || SCM_BIGP (n1), - g_lcm, n1, n2, SCM_ARG1, s_lcm); - SCM_GASSERT2 (SCM_I_INUMP (n2) || SCM_BIGP (n2), - g_lcm, n1, n2, SCM_ARGn, s_lcm); + if (SCM_UNLIKELY (!(SCM_I_INUMP (n1) || SCM_BIGP (n1)))) + return scm_wta_dispatch_2 (g_lcm, n1, n2, SCM_ARG1, s_lcm); + + if (SCM_UNLIKELY (!(SCM_I_INUMP (n2) || SCM_BIGP (n2)))) + return scm_wta_dispatch_2 (g_lcm, n1, n2, SCM_ARG2, s_lcm); if (SCM_I_INUMP (n1)) { @@ -5147,12 +5147,6 @@ idbl2str (double f, char *a, int radix) exp++; } zero: -#ifdef ENGNOT - /* adding 9999 makes this equivalent to abs(x) % 3 */ - dpt = (exp + 9999) % 3; - exp -= dpt++; - efmt = 1; -#else efmt = (exp < -3) || (exp > wp + 2); if (!efmt) { @@ -5169,7 +5163,6 @@ idbl2str (double f, char *a, int radix) } else dpt = 1; -#endif do { @@ -5191,7 +5184,6 @@ idbl2str (double f, char *a, int radix) if (dpt > 0) { -#ifndef ENGNOT if ((dpt > 4) && (exp > 6)) { d = (a[0] == '-' ? 2 : 1); @@ -5201,7 +5193,6 @@ idbl2str (double f, char *a, int radix) efmt = 1; } else -#endif { while (--dpt) a[ch++] = '0'; @@ -5357,7 +5348,7 @@ int scm_print_real (SCM sexp, SCM port, scm_print_state *pstate SCM_UNUSED) { char num_buf[FLOBUFLEN]; - scm_lfwrite (num_buf, iflo2str (sexp, num_buf, 10), port); + scm_lfwrite_unlocked (num_buf, iflo2str (sexp, num_buf, 10), port); return !0; } @@ -5365,7 +5356,7 @@ void scm_i_print_double (double val, SCM port) { char num_buf[FLOBUFLEN]; - scm_lfwrite (num_buf, idbl2str (val, num_buf, 10), port); + scm_lfwrite_unlocked (num_buf, idbl2str (val, num_buf, 10), port); } int @@ -5373,7 +5364,7 @@ scm_print_complex (SCM sexp, SCM port, scm_print_state *pstate SCM_UNUSED) { char num_buf[FLOBUFLEN]; - scm_lfwrite (num_buf, iflo2str (sexp, num_buf, 10), port); + scm_lfwrite_unlocked (num_buf, iflo2str (sexp, num_buf, 10), port); return !0; } @@ -5381,7 +5372,7 @@ void scm_i_print_complex (double real, double imag, SCM port) { char num_buf[FLOBUFLEN]; - scm_lfwrite (num_buf, icmplx2str (real, imag, num_buf, 10), port); + scm_lfwrite_unlocked (num_buf, icmplx2str (real, imag, num_buf, 10), port); } int @@ -5402,7 +5393,7 @@ scm_bigprint (SCM exp, SCM port, scm_print_state *pstate SCM_UNUSED) void (*freefunc) (void *, size_t); mp_get_memory_functions (NULL, NULL, &freefunc); scm_remember_upto_here_1 (exp); - scm_lfwrite (str, len, port); + scm_lfwrite_unlocked (str, len, port); freefunc (str, len + 1); return !0; } @@ -6239,7 +6230,8 @@ scm_num_eq_p (SCM x, SCM y) else if (SCM_FRACTIONP (y)) return SCM_BOOL_F; else - SCM_WTA_DISPATCH_2 (g_scm_i_num_eq_p, x, y, SCM_ARGn, s_scm_i_num_eq_p); + return scm_wta_dispatch_2 (g_scm_i_num_eq_p, x, y, SCM_ARGn, + s_scm_i_num_eq_p); } else if (SCM_BIGP (x)) { @@ -6274,7 +6266,8 @@ scm_num_eq_p (SCM x, SCM y) else if (SCM_FRACTIONP (y)) return SCM_BOOL_F; else - SCM_WTA_DISPATCH_2 (g_scm_i_num_eq_p, x, y, SCM_ARGn, s_scm_i_num_eq_p); + return scm_wta_dispatch_2 (g_scm_i_num_eq_p, x, y, SCM_ARGn, + s_scm_i_num_eq_p); } else if (SCM_REALP (x)) { @@ -6312,7 +6305,8 @@ scm_num_eq_p (SCM x, SCM y) goto again; } else - SCM_WTA_DISPATCH_2 (g_scm_i_num_eq_p, x, y, SCM_ARGn, s_scm_i_num_eq_p); + return scm_wta_dispatch_2 (g_scm_i_num_eq_p, x, y, SCM_ARGn, + s_scm_i_num_eq_p); } else if (SCM_COMPLEXP (x)) { @@ -6350,7 +6344,8 @@ scm_num_eq_p (SCM x, SCM y) goto again; } else - SCM_WTA_DISPATCH_2 (g_scm_i_num_eq_p, x, y, SCM_ARGn, s_scm_i_num_eq_p); + return scm_wta_dispatch_2 (g_scm_i_num_eq_p, x, y, SCM_ARGn, + s_scm_i_num_eq_p); } else if (SCM_FRACTIONP (x)) { @@ -6384,10 +6379,12 @@ scm_num_eq_p (SCM x, SCM y) else if (SCM_FRACTIONP (y)) return scm_i_fraction_equalp (x, y); else - SCM_WTA_DISPATCH_2 (g_scm_i_num_eq_p, x, y, SCM_ARGn, s_scm_i_num_eq_p); + return scm_wta_dispatch_2 (g_scm_i_num_eq_p, x, y, SCM_ARGn, + s_scm_i_num_eq_p); } else - SCM_WTA_DISPATCH_2 (g_scm_i_num_eq_p, x, y, SCM_ARG1, s_scm_i_num_eq_p); + return scm_wta_dispatch_2 (g_scm_i_num_eq_p, x, y, SCM_ARG1, + s_scm_i_num_eq_p); } @@ -6446,7 +6443,8 @@ scm_less_p (SCM x, SCM y) goto again; } else - SCM_WTA_DISPATCH_2 (g_scm_i_num_less_p, x, y, SCM_ARGn, s_scm_i_num_less_p); + return scm_wta_dispatch_2 (g_scm_i_num_less_p, x, y, SCM_ARGn, + s_scm_i_num_less_p); } else if (SCM_BIGP (x)) { @@ -6474,7 +6472,8 @@ scm_less_p (SCM x, SCM y) else if (SCM_FRACTIONP (y)) goto int_frac; else - SCM_WTA_DISPATCH_2 (g_scm_i_num_less_p, x, y, SCM_ARGn, s_scm_i_num_less_p); + return scm_wta_dispatch_2 (g_scm_i_num_less_p, x, y, SCM_ARGn, + s_scm_i_num_less_p); } else if (SCM_REALP (x)) { @@ -6502,7 +6501,8 @@ scm_less_p (SCM x, SCM y) goto again; } else - SCM_WTA_DISPATCH_2 (g_scm_i_num_less_p, x, y, SCM_ARGn, s_scm_i_num_less_p); + return scm_wta_dispatch_2 (g_scm_i_num_less_p, x, y, SCM_ARGn, + s_scm_i_num_less_p); } else if (SCM_FRACTIONP (x)) { @@ -6535,10 +6535,12 @@ scm_less_p (SCM x, SCM y) goto again; } else - SCM_WTA_DISPATCH_2 (g_scm_i_num_less_p, x, y, SCM_ARGn, s_scm_i_num_less_p); + return scm_wta_dispatch_2 (g_scm_i_num_less_p, x, y, SCM_ARGn, + s_scm_i_num_less_p); } else - SCM_WTA_DISPATCH_2 (g_scm_i_num_less_p, x, y, SCM_ARG1, s_scm_i_num_less_p); + return scm_wta_dispatch_2 (g_scm_i_num_less_p, x, y, SCM_ARG1, + s_scm_i_num_less_p); } @@ -6567,9 +6569,9 @@ SCM scm_gr_p (SCM x, SCM y) { if (!SCM_NUMBERP (x)) - SCM_WTA_DISPATCH_2 (g_scm_i_num_gr_p, x, y, SCM_ARG1, FUNC_NAME); + return scm_wta_dispatch_2 (g_scm_i_num_gr_p, x, y, SCM_ARG1, FUNC_NAME); else if (!SCM_NUMBERP (y)) - SCM_WTA_DISPATCH_2 (g_scm_i_num_gr_p, x, y, SCM_ARG2, FUNC_NAME); + return scm_wta_dispatch_2 (g_scm_i_num_gr_p, x, y, SCM_ARG2, FUNC_NAME); else return scm_less_p (y, x); } @@ -6601,9 +6603,9 @@ SCM scm_leq_p (SCM x, SCM y) { if (!SCM_NUMBERP (x)) - SCM_WTA_DISPATCH_2 (g_scm_i_num_leq_p, x, y, SCM_ARG1, FUNC_NAME); + return scm_wta_dispatch_2 (g_scm_i_num_leq_p, x, y, SCM_ARG1, FUNC_NAME); else if (!SCM_NUMBERP (y)) - SCM_WTA_DISPATCH_2 (g_scm_i_num_leq_p, x, y, SCM_ARG2, FUNC_NAME); + return scm_wta_dispatch_2 (g_scm_i_num_leq_p, x, y, SCM_ARG2, FUNC_NAME); else if (scm_is_true (scm_nan_p (x)) || scm_is_true (scm_nan_p (y))) return SCM_BOOL_F; else @@ -6637,9 +6639,9 @@ SCM scm_geq_p (SCM x, SCM y) { if (!SCM_NUMBERP (x)) - SCM_WTA_DISPATCH_2 (g_scm_i_num_geq_p, x, y, SCM_ARG1, FUNC_NAME); + return scm_wta_dispatch_2 (g_scm_i_num_geq_p, x, y, SCM_ARG1, FUNC_NAME); else if (!SCM_NUMBERP (y)) - SCM_WTA_DISPATCH_2 (g_scm_i_num_geq_p, x, y, SCM_ARG2, FUNC_NAME); + return scm_wta_dispatch_2 (g_scm_i_num_geq_p, x, y, SCM_ARG2, FUNC_NAME); else if (scm_is_true (scm_nan_p (x)) || scm_is_true (scm_nan_p (y))) return SCM_BOOL_F; else @@ -6666,7 +6668,7 @@ SCM_PRIMITIVE_GENERIC (scm_zero_p, "zero?", 1, 0, 0, else if (SCM_FRACTIONP (z)) return SCM_BOOL_F; else - SCM_WTA_DISPATCH_1 (g_scm_zero_p, z, SCM_ARG1, s_scm_zero_p); + return scm_wta_dispatch_1 (g_scm_zero_p, z, SCM_ARG1, s_scm_zero_p); } #undef FUNC_NAME @@ -6690,7 +6692,7 @@ SCM_PRIMITIVE_GENERIC (scm_positive_p, "positive?", 1, 0, 0, else if (SCM_FRACTIONP (x)) return scm_positive_p (SCM_FRACTION_NUMERATOR (x)); else - SCM_WTA_DISPATCH_1 (g_scm_positive_p, x, SCM_ARG1, s_scm_positive_p); + return scm_wta_dispatch_1 (g_scm_positive_p, x, SCM_ARG1, s_scm_positive_p); } #undef FUNC_NAME @@ -6714,7 +6716,7 @@ SCM_PRIMITIVE_GENERIC (scm_negative_p, "negative?", 1, 0, 0, else if (SCM_FRACTIONP (x)) return scm_negative_p (SCM_FRACTION_NUMERATOR (x)); else - SCM_WTA_DISPATCH_1 (g_scm_negative_p, x, SCM_ARG1, s_scm_negative_p); + return scm_wta_dispatch_1 (g_scm_negative_p, x, SCM_ARG1, s_scm_negative_p); } #undef FUNC_NAME @@ -6748,11 +6750,11 @@ scm_max (SCM x, SCM y) if (SCM_UNBNDP (y)) { if (SCM_UNBNDP (x)) - SCM_WTA_DISPATCH_0 (g_max, s_max); + return scm_wta_dispatch_0 (g_max, s_max); else if (SCM_I_INUMP(x) || SCM_BIGP(x) || SCM_REALP(x) || SCM_FRACTIONP(x)) return x; else - SCM_WTA_DISPATCH_1 (g_max, x, SCM_ARG1, s_max); + return scm_wta_dispatch_1 (g_max, x, SCM_ARG1, s_max); } if (SCM_I_INUMP (x)) @@ -6791,7 +6793,7 @@ scm_max (SCM x, SCM y) return (scm_is_false (scm_less_p (x, y)) ? x : y); } else - SCM_WTA_DISPATCH_2 (g_max, x, y, SCM_ARGn, s_max); + return scm_wta_dispatch_2 (g_max, x, y, SCM_ARGn, s_max); } else if (SCM_BIGP (x)) { @@ -6821,7 +6823,7 @@ scm_max (SCM x, SCM y) goto use_less; } else - SCM_WTA_DISPATCH_2 (g_max, x, y, SCM_ARGn, s_max); + return scm_wta_dispatch_2 (g_max, x, y, SCM_ARGn, s_max); } else if (SCM_REALP (x)) { @@ -6876,7 +6878,7 @@ scm_max (SCM x, SCM y) return (xx < yy) ? scm_from_double (yy) : x; } else - SCM_WTA_DISPATCH_2 (g_max, x, y, SCM_ARGn, s_max); + return scm_wta_dispatch_2 (g_max, x, y, SCM_ARGn, s_max); } else if (SCM_FRACTIONP (x)) { @@ -6899,10 +6901,10 @@ scm_max (SCM x, SCM y) goto use_less; } else - SCM_WTA_DISPATCH_2 (g_max, x, y, SCM_ARGn, s_max); + return scm_wta_dispatch_2 (g_max, x, y, SCM_ARGn, s_max); } else - SCM_WTA_DISPATCH_2 (g_max, x, y, SCM_ARG1, s_max); + return scm_wta_dispatch_2 (g_max, x, y, SCM_ARG1, s_max); } @@ -6929,11 +6931,11 @@ scm_min (SCM x, SCM y) if (SCM_UNBNDP (y)) { if (SCM_UNBNDP (x)) - SCM_WTA_DISPATCH_0 (g_min, s_min); + return scm_wta_dispatch_0 (g_min, s_min); else if (SCM_I_INUMP(x) || SCM_BIGP(x) || SCM_REALP(x) || SCM_FRACTIONP(x)) return x; else - SCM_WTA_DISPATCH_1 (g_min, x, SCM_ARG1, s_min); + return scm_wta_dispatch_1 (g_min, x, SCM_ARG1, s_min); } if (SCM_I_INUMP (x)) @@ -6962,7 +6964,7 @@ scm_min (SCM x, SCM y) return (scm_is_false (scm_less_p (x, y)) ? y : x); } else - SCM_WTA_DISPATCH_2 (g_min, x, y, SCM_ARGn, s_min); + return scm_wta_dispatch_2 (g_min, x, y, SCM_ARGn, s_min); } else if (SCM_BIGP (x)) { @@ -6992,7 +6994,7 @@ scm_min (SCM x, SCM y) goto use_less; } else - SCM_WTA_DISPATCH_2 (g_min, x, y, SCM_ARGn, s_min); + return scm_wta_dispatch_2 (g_min, x, y, SCM_ARGn, s_min); } else if (SCM_REALP (x)) { @@ -7036,7 +7038,7 @@ scm_min (SCM x, SCM y) return (yy < xx) ? scm_from_double (yy) : x; } else - SCM_WTA_DISPATCH_2 (g_min, x, y, SCM_ARGn, s_min); + return scm_wta_dispatch_2 (g_min, x, y, SCM_ARGn, s_min); } else if (SCM_FRACTIONP (x)) { @@ -7059,10 +7061,10 @@ scm_min (SCM x, SCM y) goto use_less; } else - SCM_WTA_DISPATCH_2 (g_min, x, y, SCM_ARGn, s_min); + return scm_wta_dispatch_2 (g_min, x, y, SCM_ARGn, s_min); } else - SCM_WTA_DISPATCH_2 (g_min, x, y, SCM_ARG1, s_min); + return scm_wta_dispatch_2 (g_min, x, y, SCM_ARG1, s_min); } @@ -7091,7 +7093,7 @@ scm_sum (SCM x, SCM y) { if (SCM_NUMBERP (x)) return x; if (SCM_UNBNDP (x)) return SCM_INUM0; - SCM_WTA_DISPATCH_1 (g_sum, x, SCM_ARG1, s_sum); + return scm_wta_dispatch_1 (g_sum, x, SCM_ARG1, s_sum); } if (SCM_LIKELY (SCM_I_INUMP (x))) @@ -7124,7 +7126,7 @@ scm_sum (SCM x, SCM y) scm_product (x, SCM_FRACTION_DENOMINATOR (y))), SCM_FRACTION_DENOMINATOR (y)); else - SCM_WTA_DISPATCH_2 (g_sum, x, y, SCM_ARGn, s_sum); + return scm_wta_dispatch_2 (g_sum, x, y, SCM_ARGn, s_sum); } else if (SCM_BIGP (x)) { if (SCM_I_INUMP (y)) @@ -7189,7 +7191,7 @@ scm_sum (SCM x, SCM y) scm_product (x, SCM_FRACTION_DENOMINATOR (y))), SCM_FRACTION_DENOMINATOR (y)); else - SCM_WTA_DISPATCH_2 (g_sum, x, y, SCM_ARGn, s_sum); + return scm_wta_dispatch_2 (g_sum, x, y, SCM_ARGn, s_sum); } else if (SCM_REALP (x)) { @@ -7209,7 +7211,7 @@ scm_sum (SCM x, SCM y) else if (SCM_FRACTIONP (y)) return scm_from_double (SCM_REAL_VALUE (x) + scm_i_fraction2double (y)); else - SCM_WTA_DISPATCH_2 (g_sum, x, y, SCM_ARGn, s_sum); + return scm_wta_dispatch_2 (g_sum, x, y, SCM_ARGn, s_sum); } else if (SCM_COMPLEXP (x)) { @@ -7233,7 +7235,7 @@ scm_sum (SCM x, SCM y) return scm_c_make_rectangular (SCM_COMPLEX_REAL (x) + scm_i_fraction2double (y), SCM_COMPLEX_IMAG (x)); else - SCM_WTA_DISPATCH_2 (g_sum, x, y, SCM_ARGn, s_sum); + return scm_wta_dispatch_2 (g_sum, x, y, SCM_ARGn, s_sum); } else if (SCM_FRACTIONP (x)) { @@ -7256,10 +7258,10 @@ scm_sum (SCM x, SCM y) scm_product (SCM_FRACTION_NUMERATOR (y), SCM_FRACTION_DENOMINATOR (x))), scm_product (SCM_FRACTION_DENOMINATOR (x), SCM_FRACTION_DENOMINATOR (y))); else - SCM_WTA_DISPATCH_2 (g_sum, x, y, SCM_ARGn, s_sum); + return scm_wta_dispatch_2 (g_sum, x, y, SCM_ARGn, s_sum); } else - SCM_WTA_DISPATCH_2 (g_sum, x, y, SCM_ARG1, s_sum); + return scm_wta_dispatch_2 (g_sum, x, y, SCM_ARG1, s_sum); } @@ -7299,7 +7301,7 @@ scm_difference (SCM x, SCM y) if (SCM_UNLIKELY (SCM_UNBNDP (y))) { if (SCM_UNBNDP (x)) - SCM_WTA_DISPATCH_0 (g_difference, s_difference); + return scm_wta_dispatch_0 (g_difference, s_difference); else if (SCM_I_INUMP (x)) { @@ -7322,7 +7324,7 @@ scm_difference (SCM x, SCM y) return scm_i_make_ratio (scm_difference (SCM_FRACTION_NUMERATOR (x), SCM_UNDEFINED), SCM_FRACTION_DENOMINATOR (x)); else - SCM_WTA_DISPATCH_1 (g_difference, x, SCM_ARG1, s_difference); + return scm_wta_dispatch_1 (g_difference, x, SCM_ARG1, s_difference); } if (SCM_LIKELY (SCM_I_INUMP (x))) @@ -7409,7 +7411,7 @@ scm_difference (SCM x, SCM y) SCM_FRACTION_NUMERATOR (y)), SCM_FRACTION_DENOMINATOR (y)); else - SCM_WTA_DISPATCH_2 (g_difference, x, y, SCM_ARGn, s_difference); + return scm_wta_dispatch_2 (g_difference, x, y, SCM_ARGn, s_difference); } else if (SCM_BIGP (x)) { @@ -7473,7 +7475,8 @@ scm_difference (SCM x, SCM y) return scm_i_make_ratio (scm_difference (scm_product (x, SCM_FRACTION_DENOMINATOR (y)), SCM_FRACTION_NUMERATOR (y)), SCM_FRACTION_DENOMINATOR (y)); - else SCM_WTA_DISPATCH_2 (g_difference, x, y, SCM_ARGn, s_difference); + else + return scm_wta_dispatch_2 (g_difference, x, y, SCM_ARGn, s_difference); } else if (SCM_REALP (x)) { @@ -7493,7 +7496,7 @@ scm_difference (SCM x, SCM y) else if (SCM_FRACTIONP (y)) return scm_from_double (SCM_REAL_VALUE (x) - scm_i_fraction2double (y)); else - SCM_WTA_DISPATCH_2 (g_difference, x, y, SCM_ARGn, s_difference); + return scm_wta_dispatch_2 (g_difference, x, y, SCM_ARGn, s_difference); } else if (SCM_COMPLEXP (x)) { @@ -7517,7 +7520,7 @@ scm_difference (SCM x, SCM y) return scm_c_make_rectangular (SCM_COMPLEX_REAL (x) - scm_i_fraction2double (y), SCM_COMPLEX_IMAG (x)); else - SCM_WTA_DISPATCH_2 (g_difference, x, y, SCM_ARGn, s_difference); + return scm_wta_dispatch_2 (g_difference, x, y, SCM_ARGn, s_difference); } else if (SCM_FRACTIONP (x)) { @@ -7541,10 +7544,10 @@ scm_difference (SCM x, SCM y) scm_product (SCM_FRACTION_NUMERATOR (y), SCM_FRACTION_DENOMINATOR (x))), scm_product (SCM_FRACTION_DENOMINATOR (x), SCM_FRACTION_DENOMINATOR (y))); else - SCM_WTA_DISPATCH_2 (g_difference, x, y, SCM_ARGn, s_difference); + return scm_wta_dispatch_2 (g_difference, x, y, SCM_ARGn, s_difference); } else - SCM_WTA_DISPATCH_2 (g_difference, x, y, SCM_ARG1, s_difference); + return scm_wta_dispatch_2 (g_difference, x, y, SCM_ARG1, s_difference); } #undef FUNC_NAME @@ -7587,7 +7590,7 @@ scm_product (SCM x, SCM y) else if (SCM_NUMBERP (x)) return x; else - SCM_WTA_DISPATCH_1 (g_product, x, SCM_ARG1, s_product); + return scm_wta_dispatch_1 (g_product, x, SCM_ARG1, s_product); } if (SCM_LIKELY (SCM_I_INUMP (x))) @@ -7620,7 +7623,7 @@ scm_product (SCM x, SCM y) else if (SCM_NUMP (y)) return SCM_INUM0; else - SCM_WTA_DISPATCH_2 (g_product, x, y, SCM_ARGn, s_product); + return scm_wta_dispatch_2 (g_product, x, y, SCM_ARGn, s_product); break; case -1: /* @@ -7665,7 +7668,7 @@ scm_product (SCM x, SCM y) return scm_i_make_ratio (scm_product (x, SCM_FRACTION_NUMERATOR (y)), SCM_FRACTION_DENOMINATOR (y)); else - SCM_WTA_DISPATCH_2 (g_product, x, y, SCM_ARGn, s_product); + return scm_wta_dispatch_2 (g_product, x, y, SCM_ARGn, s_product); } else if (SCM_BIGP (x)) { @@ -7700,7 +7703,7 @@ scm_product (SCM x, SCM y) return scm_i_make_ratio (scm_product (x, SCM_FRACTION_NUMERATOR (y)), SCM_FRACTION_DENOMINATOR (y)); else - SCM_WTA_DISPATCH_2 (g_product, x, y, SCM_ARGn, s_product); + return scm_wta_dispatch_2 (g_product, x, y, SCM_ARGn, s_product); } else if (SCM_REALP (x)) { @@ -7723,7 +7726,7 @@ scm_product (SCM x, SCM y) else if (SCM_FRACTIONP (y)) return scm_from_double (SCM_REAL_VALUE (x) * scm_i_fraction2double (y)); else - SCM_WTA_DISPATCH_2 (g_product, x, y, SCM_ARGn, s_product); + return scm_wta_dispatch_2 (g_product, x, y, SCM_ARGn, s_product); } else if (SCM_COMPLEXP (x)) { @@ -7756,7 +7759,7 @@ scm_product (SCM x, SCM y) yy * SCM_COMPLEX_IMAG (x)); } else - SCM_WTA_DISPATCH_2 (g_product, x, y, SCM_ARGn, s_product); + return scm_wta_dispatch_2 (g_product, x, y, SCM_ARGn, s_product); } else if (SCM_FRACTIONP (x)) { @@ -7781,10 +7784,10 @@ scm_product (SCM x, SCM y) scm_product (SCM_FRACTION_DENOMINATOR (x), SCM_FRACTION_DENOMINATOR (y))); else - SCM_WTA_DISPATCH_2 (g_product, x, y, SCM_ARGn, s_product); + return scm_wta_dispatch_2 (g_product, x, y, SCM_ARGn, s_product); } else - SCM_WTA_DISPATCH_2 (g_product, x, y, SCM_ARG1, s_product); + return scm_wta_dispatch_2 (g_product, x, y, SCM_ARG1, s_product); } #if ((defined (HAVE_ISINF) && defined (HAVE_ISNAN)) \ @@ -7848,7 +7851,7 @@ do_divide (SCM x, SCM y, int inexact) if (SCM_UNLIKELY (SCM_UNBNDP (y))) { if (SCM_UNBNDP (x)) - SCM_WTA_DISPATCH_0 (g_divide, s_divide); + return scm_wta_dispatch_0 (g_divide, s_divide); else if (SCM_I_INUMP (x)) { scm_t_inum xx = SCM_I_INUM (x); @@ -7902,7 +7905,7 @@ do_divide (SCM x, SCM y, int inexact) return scm_i_make_ratio (SCM_FRACTION_DENOMINATOR (x), SCM_FRACTION_NUMERATOR (x)); else - SCM_WTA_DISPATCH_1 (g_divide, x, SCM_ARG1, s_divide); + return scm_wta_dispatch_1 (g_divide, x, SCM_ARG1, s_divide); } if (SCM_LIKELY (SCM_I_INUMP (x))) @@ -7976,7 +7979,7 @@ do_divide (SCM x, SCM y, int inexact) return scm_i_make_ratio (scm_product (x, SCM_FRACTION_DENOMINATOR (y)), SCM_FRACTION_NUMERATOR (y)); else - SCM_WTA_DISPATCH_2 (g_divide, x, y, SCM_ARGn, s_divide); + return scm_wta_dispatch_2 (g_divide, x, y, SCM_ARGn, s_divide); } else if (SCM_BIGP (x)) { @@ -8075,7 +8078,7 @@ do_divide (SCM x, SCM y, int inexact) return scm_i_make_ratio (scm_product (x, SCM_FRACTION_DENOMINATOR (y)), SCM_FRACTION_NUMERATOR (y)); else - SCM_WTA_DISPATCH_2 (g_divide, x, y, SCM_ARGn, s_divide); + return scm_wta_dispatch_2 (g_divide, x, y, SCM_ARGn, s_divide); } else if (SCM_REALP (x)) { @@ -8114,7 +8117,7 @@ do_divide (SCM x, SCM y, int inexact) else if (SCM_FRACTIONP (y)) return scm_from_double (rx / scm_i_fraction2double (y)); else - SCM_WTA_DISPATCH_2 (g_divide, x, y, SCM_ARGn, s_divide); + return scm_wta_dispatch_2 (g_divide, x, y, SCM_ARGn, s_divide); } else if (SCM_COMPLEXP (x)) { @@ -8172,7 +8175,7 @@ do_divide (SCM x, SCM y, int inexact) return scm_c_make_rectangular (rx / yy, ix / yy); } else - SCM_WTA_DISPATCH_2 (g_divide, x, y, SCM_ARGn, s_divide); + return scm_wta_dispatch_2 (g_divide, x, y, SCM_ARGn, s_divide); } else if (SCM_FRACTIONP (x)) { @@ -8211,10 +8214,10 @@ do_divide (SCM x, SCM y, int inexact) return scm_i_make_ratio (scm_product (SCM_FRACTION_NUMERATOR (x), SCM_FRACTION_DENOMINATOR (y)), scm_product (SCM_FRACTION_NUMERATOR (y), SCM_FRACTION_DENOMINATOR (x))); else - SCM_WTA_DISPATCH_2 (g_divide, x, y, SCM_ARGn, s_divide); + return scm_wta_dispatch_2 (g_divide, x, y, SCM_ARGn, s_divide); } else - SCM_WTA_DISPATCH_2 (g_divide, x, y, SCM_ARG1, s_divide); + return scm_wta_dispatch_2 (g_divide, x, y, SCM_ARG1, s_divide); } SCM @@ -8291,7 +8294,7 @@ SCM_PRIMITIVE_GENERIC (scm_truncate_number, "truncate", 1, 0, 0, return scm_truncate_quotient (SCM_FRACTION_NUMERATOR (x), SCM_FRACTION_DENOMINATOR (x)); else - SCM_WTA_DISPATCH_1 (g_scm_truncate_number, x, SCM_ARG1, + return scm_wta_dispatch_1 (g_scm_truncate_number, x, SCM_ARG1, s_scm_truncate_number); } #undef FUNC_NAME @@ -8311,8 +8314,8 @@ SCM_PRIMITIVE_GENERIC (scm_round_number, "round", 1, 0, 0, return scm_round_quotient (SCM_FRACTION_NUMERATOR (x), SCM_FRACTION_DENOMINATOR (x)); else - SCM_WTA_DISPATCH_1 (g_scm_round_number, x, SCM_ARG1, - s_scm_round_number); + return scm_wta_dispatch_1 (g_scm_round_number, x, SCM_ARG1, + s_scm_round_number); } #undef FUNC_NAME @@ -8329,7 +8332,7 @@ SCM_PRIMITIVE_GENERIC (scm_floor, "floor", 1, 0, 0, return scm_floor_quotient (SCM_FRACTION_NUMERATOR (x), SCM_FRACTION_DENOMINATOR (x)); else - SCM_WTA_DISPATCH_1 (g_scm_floor, x, 1, s_scm_floor); + return scm_wta_dispatch_1 (g_scm_floor, x, 1, s_scm_floor); } #undef FUNC_NAME @@ -8346,7 +8349,7 @@ SCM_PRIMITIVE_GENERIC (scm_ceiling, "ceiling", 1, 0, 0, return scm_ceiling_quotient (SCM_FRACTION_NUMERATOR (x), SCM_FRACTION_DENOMINATOR (x)); else - SCM_WTA_DISPATCH_1 (g_scm_ceiling, x, 1, s_scm_ceiling); + return scm_wta_dispatch_1 (g_scm_ceiling, x, 1, s_scm_ceiling); } #undef FUNC_NAME @@ -8385,9 +8388,9 @@ SCM_PRIMITIVE_GENERIC (scm_expt, "expt", 2, 0, 0, else if (scm_is_complex (x) && scm_is_complex (y)) return scm_exp (scm_product (scm_log (x), y)); else if (scm_is_complex (x)) - SCM_WTA_DISPATCH_2 (g_scm_expt, x, y, SCM_ARG2, s_scm_expt); + return scm_wta_dispatch_2 (g_scm_expt, x, y, SCM_ARG2, s_scm_expt); else - SCM_WTA_DISPATCH_2 (g_scm_expt, x, y, SCM_ARG1, s_scm_expt); + return scm_wta_dispatch_2 (g_scm_expt, x, y, SCM_ARG1, s_scm_expt); } #undef FUNC_NAME @@ -8414,7 +8417,7 @@ SCM_PRIMITIVE_GENERIC (scm_sin, "sin", 1, 0, 0, cos (x) * sinh (y)); } else - SCM_WTA_DISPATCH_1 (g_scm_sin, z, 1, s_scm_sin); + return scm_wta_dispatch_1 (g_scm_sin, z, 1, s_scm_sin); } #undef FUNC_NAME @@ -8435,7 +8438,7 @@ SCM_PRIMITIVE_GENERIC (scm_cos, "cos", 1, 0, 0, -sin (x) * sinh (y)); } else - SCM_WTA_DISPATCH_1 (g_scm_cos, z, 1, s_scm_cos); + return scm_wta_dispatch_1 (g_scm_cos, z, 1, s_scm_cos); } #undef FUNC_NAME @@ -8460,7 +8463,7 @@ SCM_PRIMITIVE_GENERIC (scm_tan, "tan", 1, 0, 0, return scm_c_make_rectangular (sin (x) / w, sinh (y) / w); } else - SCM_WTA_DISPATCH_1 (g_scm_tan, z, 1, s_scm_tan); + return scm_wta_dispatch_1 (g_scm_tan, z, 1, s_scm_tan); } #undef FUNC_NAME @@ -8481,7 +8484,7 @@ SCM_PRIMITIVE_GENERIC (scm_sinh, "sinh", 1, 0, 0, cosh (x) * sin (y)); } else - SCM_WTA_DISPATCH_1 (g_scm_sinh, z, 1, s_scm_sinh); + return scm_wta_dispatch_1 (g_scm_sinh, z, 1, s_scm_sinh); } #undef FUNC_NAME @@ -8502,7 +8505,7 @@ SCM_PRIMITIVE_GENERIC (scm_cosh, "cosh", 1, 0, 0, sinh (x) * sin (y)); } else - SCM_WTA_DISPATCH_1 (g_scm_cosh, z, 1, s_scm_cosh); + return scm_wta_dispatch_1 (g_scm_cosh, z, 1, s_scm_cosh); } #undef FUNC_NAME @@ -8527,7 +8530,7 @@ SCM_PRIMITIVE_GENERIC (scm_tanh, "tanh", 1, 0, 0, return scm_c_make_rectangular (sinh (x) / w, sin (y) / w); } else - SCM_WTA_DISPATCH_1 (g_scm_tanh, z, 1, s_scm_tanh); + return scm_wta_dispatch_1 (g_scm_tanh, z, 1, s_scm_tanh); } #undef FUNC_NAME @@ -8555,7 +8558,7 @@ SCM_PRIMITIVE_GENERIC (scm_asin, "asin", 1, 0, 0, scm_sys_asinh (scm_c_make_rectangular (-y, x))); } else - SCM_WTA_DISPATCH_1 (g_scm_asin, z, 1, s_scm_asin); + return scm_wta_dispatch_1 (g_scm_asin, z, 1, s_scm_asin); } #undef FUNC_NAME @@ -8585,7 +8588,7 @@ SCM_PRIMITIVE_GENERIC (scm_acos, "acos", 1, 0, 0, scm_sys_asinh (scm_c_make_rectangular (-y, x)))); } else - SCM_WTA_DISPATCH_1 (g_scm_acos, z, 1, s_scm_acos); + return scm_wta_dispatch_1 (g_scm_acos, z, 1, s_scm_acos); } #undef FUNC_NAME @@ -8612,17 +8615,17 @@ SCM_PRIMITIVE_GENERIC (scm_atan, "atan", 1, 1, 0, scm_c_make_rectangular (0, 2)); } else - SCM_WTA_DISPATCH_1 (g_scm_atan, z, SCM_ARG1, s_scm_atan); + return scm_wta_dispatch_1 (g_scm_atan, z, SCM_ARG1, s_scm_atan); } else if (scm_is_real (z)) { if (scm_is_real (y)) return scm_from_double (atan2 (scm_to_double (z), scm_to_double (y))); else - SCM_WTA_DISPATCH_2 (g_scm_atan, z, y, SCM_ARG2, s_scm_atan); + return scm_wta_dispatch_2 (g_scm_atan, z, y, SCM_ARG2, s_scm_atan); } else - SCM_WTA_DISPATCH_2 (g_scm_atan, z, y, SCM_ARG1, s_scm_atan); + return scm_wta_dispatch_2 (g_scm_atan, z, y, SCM_ARG1, s_scm_atan); } #undef FUNC_NAME @@ -8640,7 +8643,7 @@ SCM_PRIMITIVE_GENERIC (scm_sys_asinh, "asinh", 1, 0, 0, scm_sqrt (scm_sum (scm_product (z, z), SCM_INUM1)))); else - SCM_WTA_DISPATCH_1 (g_scm_sys_asinh, z, 1, s_scm_sys_asinh); + return scm_wta_dispatch_1 (g_scm_sys_asinh, z, 1, s_scm_sys_asinh); } #undef FUNC_NAME @@ -8658,7 +8661,7 @@ SCM_PRIMITIVE_GENERIC (scm_sys_acosh, "acosh", 1, 0, 0, scm_sqrt (scm_difference (scm_product (z, z), SCM_INUM1)))); else - SCM_WTA_DISPATCH_1 (g_scm_sys_acosh, z, 1, s_scm_sys_acosh); + return scm_wta_dispatch_1 (g_scm_sys_acosh, z, 1, s_scm_sys_acosh); } #undef FUNC_NAME @@ -8676,7 +8679,7 @@ SCM_PRIMITIVE_GENERIC (scm_sys_atanh, "atanh", 1, 0, 0, scm_difference (SCM_INUM1, z))), SCM_I_MAKINUM (2)); else - SCM_WTA_DISPATCH_1 (g_scm_sys_atanh, z, 1, s_scm_sys_atanh); + return scm_wta_dispatch_1 (g_scm_sys_atanh, z, 1, s_scm_sys_atanh); } #undef FUNC_NAME @@ -8685,7 +8688,7 @@ scm_c_make_rectangular (double re, double im) { SCM z; - z = PTR2SCM (scm_gc_malloc_pointerless (sizeof (scm_t_complex), + z = SCM_PACK_POINTER (scm_gc_malloc_pointerless (sizeof (scm_t_complex), "complex")); SCM_SET_CELL_TYPE (z, scm_tc16_complex); SCM_COMPLEX_REAL (z) = re; @@ -8777,7 +8780,7 @@ SCM_PRIMITIVE_GENERIC (scm_real_part, "real-part", 1, 0, 0, else if (SCM_I_INUMP (z) || SCM_BIGP (z) || SCM_REALP (z) || SCM_FRACTIONP (z)) return z; else - SCM_WTA_DISPATCH_1 (g_scm_real_part, z, SCM_ARG1, s_scm_real_part); + return scm_wta_dispatch_1 (g_scm_real_part, z, SCM_ARG1, s_scm_real_part); } #undef FUNC_NAME @@ -8792,7 +8795,7 @@ SCM_PRIMITIVE_GENERIC (scm_imag_part, "imag-part", 1, 0, 0, else if (SCM_I_INUMP (z) || SCM_REALP (z) || SCM_BIGP (z) || SCM_FRACTIONP (z)) return SCM_INUM0; else - SCM_WTA_DISPATCH_1 (g_scm_imag_part, z, SCM_ARG1, s_scm_imag_part); + return scm_wta_dispatch_1 (g_scm_imag_part, z, SCM_ARG1, s_scm_imag_part); } #undef FUNC_NAME @@ -8808,7 +8811,7 @@ SCM_PRIMITIVE_GENERIC (scm_numerator, "numerator", 1, 0, 0, else if (SCM_REALP (z)) return scm_exact_to_inexact (scm_numerator (scm_inexact_to_exact (z))); else - SCM_WTA_DISPATCH_1 (g_scm_numerator, z, SCM_ARG1, s_scm_numerator); + return scm_wta_dispatch_1 (g_scm_numerator, z, SCM_ARG1, s_scm_numerator); } #undef FUNC_NAME @@ -8825,7 +8828,8 @@ SCM_PRIMITIVE_GENERIC (scm_denominator, "denominator", 1, 0, 0, else if (SCM_REALP (z)) return scm_exact_to_inexact (scm_denominator (scm_inexact_to_exact (z))); else - SCM_WTA_DISPATCH_1 (g_scm_denominator, z, SCM_ARG1, s_scm_denominator); + return scm_wta_dispatch_1 (g_scm_denominator, z, SCM_ARG1, + s_scm_denominator); } #undef FUNC_NAME @@ -8867,7 +8871,8 @@ SCM_PRIMITIVE_GENERIC (scm_magnitude, "magnitude", 1, 0, 0, SCM_FRACTION_DENOMINATOR (z)); } else - SCM_WTA_DISPATCH_1 (g_scm_magnitude, z, SCM_ARG1, s_scm_magnitude); + return scm_wta_dispatch_1 (g_scm_magnitude, z, SCM_ARG1, + s_scm_magnitude); } #undef FUNC_NAME @@ -8913,7 +8918,7 @@ SCM_PRIMITIVE_GENERIC (scm_angle, "angle", 1, 0, 0, else return scm_from_double (atan2 (0.0, -1.0)); } else - SCM_WTA_DISPATCH_1 (g_scm_angle, z, SCM_ARG1, s_scm_angle); + return scm_wta_dispatch_1 (g_scm_angle, z, SCM_ARG1, s_scm_angle); } #undef FUNC_NAME @@ -8932,7 +8937,8 @@ SCM_PRIMITIVE_GENERIC (scm_exact_to_inexact, "exact->inexact", 1, 0, 0, else if (SCM_INEXACTP (z)) return z; else - SCM_WTA_DISPATCH_1 (g_scm_exact_to_inexact, z, 1, s_scm_exact_to_inexact); + return scm_wta_dispatch_1 (g_scm_exact_to_inexact, z, 1, + s_scm_exact_to_inexact); } #undef FUNC_NAME @@ -8953,7 +8959,8 @@ SCM_PRIMITIVE_GENERIC (scm_inexact_to_exact, "inexact->exact", 1, 0, 0, else if (SCM_COMPLEXP (z) && SCM_COMPLEX_IMAG (z) == 0.0) val = SCM_COMPLEX_REAL (z); else - SCM_WTA_DISPATCH_1 (g_scm_inexact_to_exact, z, 1, s_scm_inexact_to_exact); + return scm_wta_dispatch_1 (g_scm_inexact_to_exact, z, 1, + s_scm_inexact_to_exact); if (!SCM_LIKELY (DOUBLE_IS_FINITE (val))) SCM_OUT_OF_RANGE (1, z); @@ -9333,7 +9340,7 @@ scm_from_double (double val) { SCM z; - z = PTR2SCM (scm_gc_malloc_pointerless (sizeof (scm_t_double), "real")); + z = SCM_PACK_POINTER (scm_gc_malloc_pointerless (sizeof (scm_t_double), "real")); SCM_SET_CELL_TYPE (z, scm_tc16_real); SCM_REAL_VALUE (z) = val; @@ -9341,46 +9348,6 @@ scm_from_double (double val) return z; } -#if SCM_ENABLE_DEPRECATED == 1 - -float -scm_num2float (SCM num, unsigned long pos, const char *s_caller) -{ - scm_c_issue_deprecation_warning - ("`scm_num2float' is deprecated. Use scm_to_double instead."); - - if (SCM_BIGP (num)) - { - float res = mpz_get_d (SCM_I_BIG_MPZ (num)); - if (!isinf (res)) - return res; - else - scm_out_of_range (NULL, num); - } - else - return scm_to_double (num); -} - -double -scm_num2double (SCM num, unsigned long pos, const char *s_caller) -{ - scm_c_issue_deprecation_warning - ("`scm_num2double' is deprecated. Use scm_to_double instead."); - - if (SCM_BIGP (num)) - { - double res = mpz_get_d (SCM_I_BIG_MPZ (num)); - if (!isinf (res)) - return res; - else - scm_out_of_range (NULL, num); - } - else - return scm_to_double (num); -} - -#endif - int scm_is_complex (SCM val) { @@ -9530,7 +9497,7 @@ SCM_PRIMITIVE_GENERIC (scm_log, "log", 1, 0, 0, return log_of_fraction (SCM_FRACTION_NUMERATOR (z), SCM_FRACTION_DENOMINATOR (z)); else - SCM_WTA_DISPATCH_1 (g_scm_log, z, 1, s_scm_log); + return scm_wta_dispatch_1 (g_scm_log, z, 1, s_scm_log); } #undef FUNC_NAME @@ -9577,7 +9544,7 @@ SCM_PRIMITIVE_GENERIC (scm_log10, "log10", 1, 0, 0, log_of_fraction (SCM_FRACTION_NUMERATOR (z), SCM_FRACTION_DENOMINATOR (z))); else - SCM_WTA_DISPATCH_1 (g_scm_log10, z, 1, s_scm_log10); + return scm_wta_dispatch_1 (g_scm_log10, z, 1, s_scm_log10); } #undef FUNC_NAME @@ -9605,7 +9572,7 @@ SCM_PRIMITIVE_GENERIC (scm_exp, "exp", 1, 0, 0, return scm_from_double (exp (scm_to_double (z))); } else - SCM_WTA_DISPATCH_1 (g_scm_exp, z, 1, s_scm_exp); + return scm_wta_dispatch_1 (g_scm_exp, z, 1, s_scm_exp); } #undef FUNC_NAME @@ -9710,7 +9677,7 @@ SCM_PRIMITIVE_GENERIC (scm_sqrt, "sqrt", 1, 0, 0, return scm_from_double (sqrt (xx)); } else - SCM_WTA_DISPATCH_1 (g_scm_sqrt, z, 1, s_scm_sqrt); + return scm_wta_dispatch_1 (g_scm_sqrt, z, 1, s_scm_sqrt); } #undef FUNC_NAME diff --git a/libguile/numbers.h b/libguile/numbers.h index 68f321ef7..b7bcfe48c 100644 --- a/libguile/numbers.h +++ b/libguile/numbers.h @@ -125,22 +125,21 @@ typedef scm_t_int32 scm_t_wchar; #define SCM_INEXACTP(x) \ (!SCM_IMP (x) && (0xfeff & SCM_CELL_TYPE (x)) == scm_tc16_real) -#define SCM_REALP(x) (!SCM_IMP (x) && SCM_TYP16 (x) == scm_tc16_real) -#define SCM_COMPLEXP(x) (!SCM_IMP (x) && SCM_TYP16 (x) == scm_tc16_complex) +#define SCM_REALP(x) (SCM_HAS_TYP16 (x, scm_tc16_real)) +#define SCM_COMPLEXP(x) (SCM_HAS_TYP16 (x, scm_tc16_complex)) -#define SCM_REAL_VALUE(x) (((scm_t_double *) SCM2PTR (x))->real) -#define SCM_COMPLEX_REAL(x) (((scm_t_complex *) SCM2PTR (x))->real) -#define SCM_COMPLEX_IMAG(x) (((scm_t_complex *) SCM2PTR (x))->imag) +#define SCM_REAL_VALUE(x) (((scm_t_double *) SCM_HEAP_OBJECT_BASE (x))->real) +#define SCM_COMPLEX_REAL(x) (((scm_t_complex *) SCM_HEAP_OBJECT_BASE (x))->real) +#define SCM_COMPLEX_IMAG(x) (((scm_t_complex *) SCM_HEAP_OBJECT_BASE (x))->imag) /* Each bignum is just an mpz_t stored in a double cell starting at word 1. */ #define SCM_I_BIG_MPZ(x) (*((mpz_t *) (SCM_CELL_OBJECT_LOC((x),1)))) -#define SCM_BIGP(x) (!SCM_IMP (x) && SCM_TYP16 (x) == scm_tc16_big) +#define SCM_BIGP(x) (SCM_HAS_TYP16 (x, scm_tc16_big)) #define SCM_NUMBERP(x) (SCM_I_INUMP(x) || SCM_NUMP(x)) -#define SCM_NUMP(x) (!SCM_IMP(x) \ - && ((0x00ff & SCM_CELL_TYPE (x)) == scm_tc7_number)) +#define SCM_NUMP(x) (SCM_HAS_TYP7 (x, scm_tc7_number)) -#define SCM_FRACTIONP(x) (!SCM_IMP (x) && SCM_TYP16 (x) == scm_tc16_fraction) +#define SCM_FRACTIONP(x) (SCM_HAS_TYP16 (x, scm_tc16_fraction)) #define SCM_FRACTION_NUMERATOR(x) (SCM_CELL_OBJECT_1 (x)) #define SCM_FRACTION_DENOMINATOR(x) (SCM_CELL_OBJECT_2 (x)) diff --git a/libguile/objcodes.c b/libguile/objcodes.c index 536094fe2..5db8ed3e2 100644 --- a/libguile/objcodes.c +++ b/libguile/objcodes.c @@ -377,17 +377,14 @@ SCM_DEFINE (scm_objcode_to_bytecode, "objcode->bytecode", 1, 0, 0, "") #define FUNC_NAME s_scm_objcode_to_bytecode { - scm_t_int8 *s8vector; scm_t_uint32 len; SCM_VALIDATE_OBJCODE (1, objcode); len = sizeof (struct scm_objcode) + SCM_OBJCODE_TOTAL_LEN (objcode); - s8vector = scm_gc_malloc_pointerless (len, FUNC_NAME); - memcpy (s8vector, SCM_OBJCODE_DATA (objcode), len); - - return scm_c_take_gc_bytevector (s8vector, len); + return scm_c_take_gc_bytevector ((scm_t_int8*)SCM_OBJCODE_DATA (objcode), + len, objcode); } #undef FUNC_NAME @@ -423,9 +420,10 @@ SCM_DEFINE (scm_write_objcode, "write-objcode", 2, 0, 0, to_native_order (SCM_OBJCODE_LEN (objcode), target_endianness ()) + to_native_order (SCM_OBJCODE_META_LEN (objcode), target_endianness ()); - scm_c_write (port, cookie, strlen (SCM_OBJCODE_COOKIE)); - scm_c_write (port, SCM_OBJCODE_DATA (objcode), - sizeof (struct scm_objcode) + total_size); + scm_c_write_unlocked (port, cookie, strlen (SCM_OBJCODE_COOKIE)); + scm_c_write_unlocked (port, SCM_OBJCODE_DATA (objcode), + sizeof (struct scm_objcode) + + total_size); return SCM_UNSPECIFIED; } @@ -434,9 +432,9 @@ SCM_DEFINE (scm_write_objcode, "write-objcode", 2, 0, 0, void scm_i_objcode_print (SCM objcode, SCM port, scm_print_state *pstate) { - scm_puts ("#<objcode ", port); + scm_puts_unlocked ("#<objcode ", port); scm_uintprint ((scm_t_bits)SCM_OBJCODE_BASE (objcode), 16, port); - scm_puts (">", port); + scm_puts_unlocked (">", port); } diff --git a/libguile/objcodes.h b/libguile/objcodes.h index 0cfc8e027..0c3865ceb 100644 --- a/libguile/objcodes.h +++ b/libguile/objcodes.h @@ -40,7 +40,7 @@ struct scm_objcode #define SCM_OBJCODE_TYPE_SLICE (2) #define SCM_OBJCODE_TYPE_STATIC (3) -#define SCM_OBJCODE_P(x) (SCM_NIMP (x) && SCM_TYP7 (x) == scm_tc7_objcode) +#define SCM_OBJCODE_P(x) (SCM_HAS_TYP7 (x, scm_tc7_objcode)) #define SCM_OBJCODE_DATA(x) ((struct scm_objcode *) SCM_CELL_WORD_1 (x)) #define SCM_VALIDATE_OBJCODE(p,x) SCM_MAKE_VALIDATE (p, x, OBJCODE_P) diff --git a/libguile/objprop.c b/libguile/objprop.c index 7b50d71d0..b45c9aa26 100644 --- a/libguile/objprop.c +++ b/libguile/objprop.c @@ -27,7 +27,6 @@ #include "libguile/hashtab.h" #include "libguile/alist.h" #include "libguile/root.h" -#include "libguile/weaks.h" #include "libguile/objprop.h" @@ -36,20 +35,13 @@ */ static SCM object_whash; -static scm_i_pthread_mutex_t whash_mutex = SCM_I_PTHREAD_MUTEX_INITIALIZER; SCM_DEFINE (scm_object_properties, "object-properties", 1, 0, 0, (SCM obj), "Return @var{obj}'s property list.") #define FUNC_NAME s_scm_object_properties { - SCM ret; - - scm_i_pthread_mutex_lock (&whash_mutex); - ret = scm_hashq_ref (object_whash, obj, SCM_EOL); - scm_i_pthread_mutex_unlock (&whash_mutex); - - return ret; + return scm_weak_table_refq (object_whash, obj, SCM_EOL); } #undef FUNC_NAME @@ -59,9 +51,7 @@ SCM_DEFINE (scm_set_object_properties_x, "set-object-properties!", 2, 0, 0, "Set @var{obj}'s property list to @var{alist}.") #define FUNC_NAME s_scm_set_object_properties_x { - scm_i_pthread_mutex_lock (&whash_mutex); - scm_hashq_set_x (object_whash, obj, alist); - scm_i_pthread_mutex_unlock (&whash_mutex); + scm_weak_table_putq_x (object_whash, obj, alist); return alist; } @@ -74,7 +64,7 @@ SCM_DEFINE (scm_object_property, "object-property", 2, 0, 0, { SCM assoc; assoc = scm_assq (key, scm_object_properties (obj)); - return (SCM_NIMP (assoc) ? SCM_CDR (assoc) : SCM_BOOL_F); + return (scm_is_pair (assoc) ? SCM_CDR (assoc) : SCM_BOOL_F); } #undef FUNC_NAME @@ -87,14 +77,14 @@ SCM_DEFINE (scm_set_object_property_x, "set-object-property!", 3, 0, 0, SCM alist; SCM assoc; - scm_i_pthread_mutex_lock (&whash_mutex); - alist = scm_hashq_ref (object_whash, obj, SCM_EOL); + scm_i_pthread_mutex_lock (&scm_i_misc_mutex); + alist = scm_weak_table_refq (object_whash, obj, SCM_EOL); assoc = scm_assq (key, alist); - if (SCM_NIMP (assoc)) + if (scm_is_pair (assoc)) SCM_SETCDR (assoc, value); else - scm_hashq_set_x (object_whash, obj, scm_acons (key, value, alist)); - scm_i_pthread_mutex_unlock (&whash_mutex); + scm_weak_table_putq_x (object_whash, obj, scm_acons (key, value, alist)); + scm_i_pthread_mutex_unlock (&scm_i_misc_mutex); return value; } @@ -104,7 +94,7 @@ SCM_DEFINE (scm_set_object_property_x, "set-object-property!", 3, 0, 0, void scm_init_objprop () { - object_whash = scm_make_weak_key_hash_table (SCM_UNDEFINED); + object_whash = scm_c_make_weak_table (0, SCM_WEAK_TABLE_KIND_KEY); #include "libguile/objprop.x" } diff --git a/libguile/options.c b/libguile/options.c index 0e083143c..2d7e18f65 100644 --- a/libguile/options.c +++ b/libguile/options.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995,1996,1998,2000,2001, 2006, 2008, 2009, 2010 Free Software Foundation +/* Copyright (C) 1995,1996,1998,2000,2001, 2006, 2008, 2009, 2010, 2011 Free Software Foundation * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -93,8 +93,6 @@ SCM_SYMBOL (scm_yes_sym, "yes"); SCM_SYMBOL (scm_no_sym, "no"); -static SCM protected_objects = SCM_EOL; - /* Return a list of the current option setting. The format of an * option setting is described in the above documentation. */ static SCM @@ -133,7 +131,7 @@ get_documented_option_setting (const scm_t_option options[]) for (i = 0; options[i].name; ++i) { - SCM ls = scm_cons (scm_from_locale_string (options[i].doc), SCM_EOL); + SCM ls = scm_cons (scm_from_utf8_string (options[i].doc), SCM_EOL); switch (options[i].type) { case SCM_OPTION_BOOLEAN: @@ -177,16 +175,17 @@ change_option_setting (SCM args, scm_t_option options[], const char *s, int dry_run) { unsigned int i; - SCM locally_protected_args = args; - SCM malloc_obj = scm_malloc_obj (options_length (options) * sizeof (scm_t_bits)); - scm_t_bits *flags = (scm_t_bits *) SCM_MALLOCDATA (malloc_obj); + scm_t_bits *new_vals; + + new_vals = scm_gc_malloc (options_length (options) * sizeof (scm_t_bits), + "new-options"); for (i = 0; options[i].name; ++i) { if (options[i].type == SCM_OPTION_BOOLEAN) - flags[i] = 0; + new_vals[i] = 0; else - flags[i] = options[i].val; + new_vals[i] = options[i].val; } while (!SCM_NULL_OR_NIL_P (args)) @@ -201,15 +200,15 @@ change_option_setting (SCM args, scm_t_option options[], const char *s, switch (options[i].type) { case SCM_OPTION_BOOLEAN: - flags[i] = 1; + new_vals[i] = 1; break; case SCM_OPTION_INTEGER: args = SCM_CDR (args); - flags[i] = scm_to_size_t (scm_car (args)); + new_vals[i] = scm_to_size_t (scm_car (args)); break; case SCM_OPTION_SCM: args = SCM_CDR (args); - flags[i] = SCM_UNPACK (scm_car (args)); + new_vals[i] = SCM_UNPACK (scm_car (args)); break; } found = 1; @@ -226,20 +225,7 @@ change_option_setting (SCM args, scm_t_option options[], const char *s, return; for (i = 0; options[i].name; ++i) - { - if (options[i].type == SCM_OPTION_SCM) - { - SCM old = SCM_PACK (options[i].val); - SCM new = SCM_PACK (flags[i]); - if (!SCM_IMP (old)) - protected_objects = scm_delq1_x (old, protected_objects); - if (!SCM_IMP (new)) - protected_objects = scm_cons (new, protected_objects); - } - options[i].val = flags[i]; - } - - scm_remember_upto_here_2 (locally_protected_args, malloc_obj); + options[i].val = new_vals[i]; } @@ -278,7 +264,7 @@ scm_init_opts (SCM (*func) (SCM), scm_t_option options[]) for (i = 0; options[i].name; ++i) { - SCM name = scm_from_locale_symbol (options[i].name); + SCM name = scm_from_utf8_symbol (options[i].name); options[i].name = (char *) SCM_UNPACK (name); } func (SCM_UNDEFINED); @@ -288,8 +274,6 @@ scm_init_opts (SCM (*func) (SCM), scm_t_option options[]) void scm_init_options () { - scm_gc_register_root (&protected_objects); - #include "libguile/options.x" } diff --git a/libguile/ports.c b/libguile/ports.c index 6467228c0..20c734920 100644 --- a/libguile/ports.c +++ b/libguile/ports.c @@ -56,7 +56,7 @@ #include "libguile/validate.h" #include "libguile/ports.h" #include "libguile/vectors.h" -#include "libguile/weaks.h" +#include "libguile/weak-set.h" #include "libguile/fluids.h" #include "libguile/eq.h" @@ -98,19 +98,79 @@ * Indexes into this table are used when generating type * tags for smobjects (if you know a tag you can get an index and conversely). */ -scm_t_ptob_descriptor *scm_ptobs = NULL; -long scm_numptob = 0; +static scm_t_ptob_descriptor **scm_ptobs = NULL; +static long scm_numptob = 0; /* Number of port types. */ +static long scm_ptobs_size = 0; /* Number of slots in the port type + table. */ +static scm_i_pthread_mutex_t scm_ptobs_lock = SCM_I_PTHREAD_MUTEX_INITIALIZER; -/* GC marker for a port with stream of SCM type. */ -SCM -scm_markstream (SCM ptr) +long +scm_c_num_port_types (void) { - int openp; - openp = SCM_CELL_WORD_0 (ptr) & SCM_OPN; - if (openp) - return SCM_PACK (SCM_STREAM (ptr)); - else - return SCM_BOOL_F; + long ret; + + scm_i_pthread_mutex_lock (&scm_ptobs_lock); + ret = scm_numptob; + scm_i_pthread_mutex_unlock (&scm_ptobs_lock); + + return ret; +} + +scm_t_ptob_descriptor* +scm_c_port_type_ref (long ptobnum) +{ + scm_t_ptob_descriptor *ret = NULL; + + scm_i_pthread_mutex_lock (&scm_ptobs_lock); + + if (0 <= ptobnum && ptobnum < scm_numptob) + ret = scm_ptobs[ptobnum]; + + scm_i_pthread_mutex_unlock (&scm_ptobs_lock); + + if (!ret) + scm_out_of_range ("scm_c_port_type_ref", scm_from_long (ptobnum)); + + return ret; +} + +long +scm_c_port_type_add_x (scm_t_ptob_descriptor *desc) +{ + long ret = -1; + + scm_i_pthread_mutex_lock (&scm_ptobs_lock); + + if (scm_numptob + 1 < SCM_I_MAX_PORT_TYPE_COUNT) + { + if (scm_numptob == scm_ptobs_size) + { + unsigned long old_size = scm_ptobs_size; + scm_t_ptob_descriptor **old_ptobs = scm_ptobs; + + /* Currently there are only 9 predefined port types, so one + resize will cover it. */ + scm_ptobs_size = old_size + 10; + + if (scm_ptobs_size >= SCM_I_MAX_PORT_TYPE_COUNT) + scm_ptobs_size = SCM_I_MAX_PORT_TYPE_COUNT; + + scm_ptobs = scm_gc_malloc (sizeof (*scm_ptobs) * scm_ptobs_size, + "scm_ptobs"); + + memcpy (scm_ptobs, old_ptobs, sizeof (*scm_ptobs) * scm_numptob); + } + + ret = scm_numptob++; + scm_ptobs[ret] = desc; + } + + scm_i_pthread_mutex_unlock (&scm_ptobs_lock); + + if (ret < 0) + scm_out_of_range ("scm_c_port_type_add_x", scm_from_long (scm_numptob)); + + return ret; } /* @@ -134,235 +194,91 @@ scm_make_port_type (char *name, int (*fill_input) (SCM port), void (*write) (SCM port, const void *data, size_t size)) { - char *tmp; - if (SCM_I_MAX_PORT_TYPE_COUNT - 1 <= scm_numptob) - goto ptoberr; - SCM_CRITICAL_SECTION_START; - tmp = (char *) scm_gc_realloc ((char *) scm_ptobs, - scm_numptob * sizeof (scm_t_ptob_descriptor), - (1 + scm_numptob) - * sizeof (scm_t_ptob_descriptor), - "port-type"); - if (tmp) - { - scm_ptobs = (scm_t_ptob_descriptor *) tmp; + scm_t_ptob_descriptor *desc; + long ptobnum; - scm_ptobs[scm_numptob].name = name; - scm_ptobs[scm_numptob].mark = 0; - scm_ptobs[scm_numptob].free = NULL; - scm_ptobs[scm_numptob].print = scm_port_print; - scm_ptobs[scm_numptob].equalp = 0; - scm_ptobs[scm_numptob].close = 0; + desc = scm_gc_malloc_pointerless (sizeof (*desc), "port-type"); + memset (desc, 0, sizeof (*desc)); - scm_ptobs[scm_numptob].write = write; - scm_ptobs[scm_numptob].flush = flush_port_default; + desc->name = name; + desc->print = scm_port_print; + desc->write = write; + desc->flush = flush_port_default; + desc->end_input = end_input_default; + desc->fill_input = fill_input; - scm_ptobs[scm_numptob].end_input = end_input_default; - scm_ptobs[scm_numptob].fill_input = fill_input; - scm_ptobs[scm_numptob].input_waiting = 0; + ptobnum = scm_c_port_type_add_x (desc); - scm_ptobs[scm_numptob].seek = 0; - scm_ptobs[scm_numptob].truncate = 0; - - scm_numptob++; - } - SCM_CRITICAL_SECTION_END; - if (!tmp) - { - ptoberr: - scm_memory_error ("scm_make_port_type"); - } - /* Make a class object if Goops is present */ + /* Make a class object if GOOPS is present. */ if (SCM_UNPACK (scm_port_class[0]) != 0) - scm_make_port_classes (scm_numptob - 1, SCM_PTOBNAME (scm_numptob - 1)); - return scm_tc7_port + (scm_numptob - 1) * 256; + scm_make_port_classes (ptobnum, name); + + return scm_tc7_port + ptobnum * 256; } void scm_set_port_mark (scm_t_bits tc, SCM (*mark) (SCM)) { - scm_ptobs[SCM_TC2PTOBNUM (tc)].mark = mark; + scm_c_port_type_ref (SCM_TC2PTOBNUM (tc))->mark = mark; } void scm_set_port_free (scm_t_bits tc, size_t (*free) (SCM)) { - scm_ptobs[SCM_TC2PTOBNUM (tc)].free = free; + scm_c_port_type_ref (SCM_TC2PTOBNUM (tc))->free = free; } void scm_set_port_print (scm_t_bits tc, int (*print) (SCM exp, SCM port, - scm_print_state *pstate)) + scm_print_state *pstate)) { - scm_ptobs[SCM_TC2PTOBNUM (tc)].print = print; + scm_c_port_type_ref (SCM_TC2PTOBNUM (tc))->print = print; } void scm_set_port_equalp (scm_t_bits tc, SCM (*equalp) (SCM, SCM)) { - scm_ptobs[SCM_TC2PTOBNUM (tc)].equalp = equalp; + scm_c_port_type_ref (SCM_TC2PTOBNUM (tc))->equalp = equalp; } void -scm_set_port_flush (scm_t_bits tc, void (*flush) (SCM port)) +scm_set_port_close (scm_t_bits tc, int (*close) (SCM)) { - scm_ptobs[SCM_TC2PTOBNUM (tc)].flush = flush; + scm_c_port_type_ref (SCM_TC2PTOBNUM (tc))->close = close; } void -scm_set_port_end_input (scm_t_bits tc, void (*end_input) (SCM port, int offset)) +scm_set_port_flush (scm_t_bits tc, void (*flush) (SCM port)) { - scm_ptobs[SCM_TC2PTOBNUM (tc)].end_input = end_input; + scm_c_port_type_ref (SCM_TC2PTOBNUM (tc))->flush = flush; } void -scm_set_port_close (scm_t_bits tc, int (*close) (SCM)) +scm_set_port_end_input (scm_t_bits tc, void (*end_input) (SCM port, int offset)) { - scm_ptobs[SCM_TC2PTOBNUM (tc)].close = close; + scm_c_port_type_ref (SCM_TC2PTOBNUM (tc))->end_input = end_input; } void -scm_set_port_seek (scm_t_bits tc, - scm_t_off (*seek) (SCM, scm_t_off, int)) +scm_set_port_seek (scm_t_bits tc, scm_t_off (*seek) (SCM, scm_t_off, int)) { - scm_ptobs[SCM_TC2PTOBNUM (tc)].seek = seek; + scm_c_port_type_ref (SCM_TC2PTOBNUM (tc))->seek = seek; } void scm_set_port_truncate (scm_t_bits tc, void (*truncate) (SCM, scm_t_off)) { - scm_ptobs[SCM_TC2PTOBNUM (tc)].truncate = truncate; + scm_c_port_type_ref (SCM_TC2PTOBNUM (tc))->truncate = truncate; } void scm_set_port_input_waiting (scm_t_bits tc, int (*input_waiting) (SCM)) { - scm_ptobs[SCM_TC2PTOBNUM (tc)].input_waiting = input_waiting; + scm_c_port_type_ref (SCM_TC2PTOBNUM (tc))->input_waiting = input_waiting; } -SCM_DEFINE (scm_char_ready_p, "char-ready?", 0, 1, 0, - (SCM port), - "Return @code{#t} if a character is ready on input @var{port}\n" - "and return @code{#f} otherwise. If @code{char-ready?} returns\n" - "@code{#t} then the next @code{read-char} operation on\n" - "@var{port} is guaranteed not to hang. If @var{port} is a file\n" - "port at end of file then @code{char-ready?} returns @code{#t}.\n" - "\n" - "@code{char-ready?} exists to make it possible for a\n" - "program to accept characters from interactive ports without\n" - "getting stuck waiting for input. Any input editors associated\n" - "with such ports must make sure that characters whose existence\n" - "has been asserted by @code{char-ready?} cannot be rubbed out.\n" - "If @code{char-ready?} were to return @code{#f} at end of file,\n" - "a port at end of file would be indistinguishable from an\n" - "interactive port that has no ready characters.") -#define FUNC_NAME s_scm_char_ready_p -{ - scm_t_port *pt; - - if (SCM_UNBNDP (port)) - port = scm_current_input_port (); - /* It's possible to close the current input port, so validate even in - this case. */ - SCM_VALIDATE_OPINPORT (1, port); - - pt = SCM_PTAB_ENTRY (port); - - /* if the current read buffer is filled, or the - last pushed-back char has been read and the saved buffer is - filled, result is true. */ - if (pt->read_pos < pt->read_end - || (pt->read_buf == pt->putback_buf - && pt->saved_read_pos < pt->saved_read_end)) - return SCM_BOOL_T; - else - { - scm_t_ptob_descriptor *ptob = &scm_ptobs[SCM_PTOBNUM (port)]; - - if (ptob->input_waiting) - return scm_from_bool(ptob->input_waiting (port)); - else - return SCM_BOOL_T; - } -} -#undef FUNC_NAME - -/* move up to read_len chars from port's putback and/or read buffers - into memory starting at dest. returns the number of chars moved. */ -size_t scm_take_from_input_buffers (SCM port, char *dest, size_t read_len) -{ - scm_t_port *pt = SCM_PTAB_ENTRY (port); - size_t chars_read = 0; - size_t from_buf = min (pt->read_end - pt->read_pos, read_len); - - if (from_buf > 0) - { - memcpy (dest, pt->read_pos, from_buf); - pt->read_pos += from_buf; - chars_read += from_buf; - read_len -= from_buf; - dest += from_buf; - } - - /* if putback was active, try the real input buffer too. */ - if (pt->read_buf == pt->putback_buf) - { - from_buf = min (pt->saved_read_end - pt->saved_read_pos, read_len); - if (from_buf > 0) - { - memcpy (dest, pt->saved_read_pos, from_buf); - pt->saved_read_pos += from_buf; - chars_read += from_buf; - } - } - return chars_read; -} - -/* Clear a port's read buffers, returning the contents. */ -SCM_DEFINE (scm_drain_input, "drain-input", 1, 0, 0, - (SCM port), - "This procedure clears a port's input buffers, similar\n" - "to the way that force-output clears the output buffer. The\n" - "contents of the buffers are returned as a single string, e.g.,\n" - "\n" - "@lisp\n" - "(define p (open-input-file ...))\n" - "(drain-input p) => empty string, nothing buffered yet.\n" - "(unread-char (read-char p) p)\n" - "(drain-input p) => initial chars from p, up to the buffer size.\n" - "@end lisp\n\n" - "Draining the buffers may be useful for cleanly finishing\n" - "buffered I/O so that the file descriptor can be used directly\n" - "for further input.") -#define FUNC_NAME s_scm_drain_input -{ - SCM result; - char *data; - scm_t_port *pt; - long count; - - SCM_VALIDATE_OPINPORT (1, port); - pt = SCM_PTAB_ENTRY (port); - - count = pt->read_end - pt->read_pos; - if (pt->read_buf == pt->putback_buf) - count += pt->saved_read_end - pt->saved_read_pos; - - if (count) - { - result = scm_i_make_string (count, &data, 0); - scm_take_from_input_buffers (port, data, count); - } - else - result = scm_nullstr; - - return result; -} -#undef FUNC_NAME - - /* Standard ports --- current input, output, error, and more(!). */ static SCM cur_inport_fluid = SCM_BOOL_F; @@ -501,20 +417,94 @@ scm_i_dynwind_current_load_port (SCM port) scm_dynwind_fluid (cur_loadport_fluid, port); } + -/* The port table --- an array of pointers to ports. */ -/* - We need a global registry of ports to flush them all at exit, and to - get all the ports matching a file descriptor. +/* Retrieving a port's mode. */ + +/* Return the flags that characterize a port based on the mode + * string used to open a file for that port. + * + * See PORT FLAGS in scm.h */ -SCM scm_i_port_weak_hash; -scm_i_pthread_mutex_t scm_i_port_table_mutex = SCM_I_PTHREAD_MUTEX_INITIALIZER; +static long +scm_i_mode_bits_n (SCM modes) +{ + return (SCM_OPN + | (scm_i_string_contains_char (modes, 'r') + || scm_i_string_contains_char (modes, '+') ? SCM_RDNG : 0) + | (scm_i_string_contains_char (modes, 'w') + || scm_i_string_contains_char (modes, 'a') + || scm_i_string_contains_char (modes, '+') ? SCM_WRTNG : 0) + | (scm_i_string_contains_char (modes, '0') ? SCM_BUF0 : 0) + | (scm_i_string_contains_char (modes, 'l') ? SCM_BUFLINE : 0)); +} + +long +scm_mode_bits (char *modes) +{ + return scm_i_mode_bits (scm_from_locale_string (modes)); +} + +long +scm_i_mode_bits (SCM modes) +{ + long bits; + + if (!scm_is_string (modes)) + scm_wrong_type_arg_msg (NULL, 0, modes, "string"); + + bits = scm_i_mode_bits_n (modes); + scm_remember_upto_here_1 (modes); + return bits; +} + +/* Return the mode flags from an open port. + * Some modes such as "append" are only used when opening + * a file and are not returned here. */ + +SCM_DEFINE (scm_port_mode, "port-mode", 1, 0, 0, + (SCM port), + "Return the port modes associated with the open port @var{port}.\n" + "These will not necessarily be identical to the modes used when\n" + "the port was opened, since modes such as \"append\" which are\n" + "used only during port creation are not retained.") +#define FUNC_NAME s_scm_port_mode +{ + char modes[4]; + modes[0] = '\0'; + + port = SCM_COERCE_OUTPORT (port); + SCM_VALIDATE_OPPORT (1, port); + if (SCM_CELL_WORD_0 (port) & SCM_RDNG) { + if (SCM_CELL_WORD_0 (port) & SCM_WRTNG) + strcpy (modes, "r+"); + else + strcpy (modes, "r"); + } + else if (SCM_CELL_WORD_0 (port) & SCM_WRTNG) + strcpy (modes, "w"); + if (SCM_CELL_WORD_0 (port) & SCM_BUF0) + strcat (modes, "0"); + + return scm_from_latin1_string (modes); +} +#undef FUNC_NAME + -/* Port finalization. */ +/* The port table --- a weak set of all ports. + + We need a global registry of ports to flush them all at exit, and to + get all the ports matching a file descriptor. */ +SCM scm_i_port_weak_set; + + + + +/* Port finalization. */ static void finalize_port (GC_PTR, GC_PTR); @@ -527,7 +517,8 @@ register_finalizer_for_port (SCM port) /* Register a finalizer for PORT so that its iconv CDs get freed and optionally its type's `free' function gets called. */ - GC_REGISTER_FINALIZER_NO_ORDER (SCM2PTR (port), finalize_port, 0, + GC_REGISTER_FINALIZER_NO_ORDER (SCM_HEAP_OBJECT_BASE (port), + finalize_port, 0, &prev_finalizer, &prev_finalization_data); } @@ -536,8 +527,7 @@ register_finalizer_for_port (SCM port) static void finalize_port (GC_PTR ptr, GC_PTR data) { - long port_type; - SCM port = PTR2SCM (ptr); + SCM port = SCM_PACK_POINTER (ptr); if (!SCM_PORTP (port)) abort (); @@ -549,16 +539,13 @@ finalize_port (GC_PTR ptr, GC_PTR data) register_finalizer_for_port (port); else { + scm_t_ptob_descriptor *ptob = SCM_PORT_DESCRIPTOR (port); scm_t_port *entry; - port_type = SCM_TC2PTOBNUM (SCM_CELL_TYPE (port)); - if (port_type >= scm_numptob) - abort (); - - if (scm_ptobs[port_type].free) - /* Yes, I really do mean `.free' rather than `.close'. `.close' + if (ptob->free) + /* Yes, I really do mean `free' rather than `close'. `close' is for explicit `close-port' by user. */ - scm_ptobs[port_type].free (port); + ptob->free (port); entry = SCM_PTAB_ENTRY (port); @@ -576,73 +563,62 @@ finalize_port (GC_PTR ptr, GC_PTR data) } - -/* This function is not and should not be thread safe. */ SCM -scm_new_port_table_entry (scm_t_bits tag) -#define FUNC_NAME "scm_new_port_table_entry" +scm_c_make_port_with_encoding (scm_t_bits tag, unsigned long mode_bits, + const char *encoding, + scm_t_string_failed_conversion_handler handler, + scm_t_bits stream) { - /* - We initialize the cell to empty, this is in case scm_gc_calloc - triggers GC ; we don't want the GC to scan a half-finished Z. - */ - - SCM z = scm_cons (SCM_EOL, SCM_EOL); - scm_t_port *entry = (scm_t_port *) scm_gc_calloc (sizeof (scm_t_port), "port"); - const char *enc; + SCM ret; + scm_t_port *entry; + scm_t_ptob_descriptor *ptob; - entry->file_name = SCM_BOOL_F; - entry->rw_active = SCM_PORT_NEITHER; - entry->port = z; + entry = (scm_t_port *) scm_gc_calloc (sizeof (scm_t_port), "port"); + ptob = scm_c_port_type_ref (SCM_TC2PTOBNUM (tag)); - /* Initialize this port with the thread's current default - encoding. */ - enc = scm_i_default_port_encoding (); - entry->encoding = enc ? scm_gc_strdup (enc, "port") : NULL; + ret = scm_words (tag | mode_bits, 3); + SCM_SET_CELL_WORD_1 (ret, (scm_t_bits) entry); + SCM_SET_CELL_WORD_2 (ret, (scm_t_bits) ptob); +#if SCM_USE_PTHREAD_THREADS + scm_i_pthread_mutex_init (&entry->lock, scm_i_pthread_mutexattr_recursive); +#endif + + entry->file_name = SCM_BOOL_F; + entry->rw_active = SCM_PORT_NEITHER; + entry->port = ret; + entry->stream = stream; + entry->encoding = encoding ? scm_gc_strdup (encoding, "port") : NULL; /* The conversion descriptors will be opened lazily. */ entry->input_cd = (iconv_t) -1; entry->output_cd = (iconv_t) -1; + entry->ilseq_handler = handler; - entry->ilseq_handler = scm_i_get_conversion_strategy (SCM_BOOL_F); - - SCM_SET_CELL_TYPE (z, tag); - SCM_SETPTAB_ENTRY (z, entry); - - scm_hashq_set_x (scm_i_port_weak_hash, z, SCM_BOOL_F); + scm_weak_set_add_x (scm_i_port_weak_set, ret); /* For each new port, register a finalizer so that it port type's free function can be invoked eventually. */ - register_finalizer_for_port (z); + register_finalizer_for_port (ret); - return z; + return ret; } -#undef FUNC_NAME -#if SCM_ENABLE_DEPRECATED==1 -scm_t_port * -scm_add_to_port_table (SCM port) +SCM +scm_c_make_port (scm_t_bits tag, unsigned long mode_bits, scm_t_bits stream) { - SCM z; - scm_t_port * pt; - - scm_c_issue_deprecation_warning ("scm_add_to_port_table is deprecated."); - - scm_i_pthread_mutex_lock (&scm_i_port_table_mutex); - z = scm_new_port_table_entry (scm_tc7_port); - pt = SCM_PTAB_ENTRY(z); - pt->port = port; - SCM_SETCAR (z, SCM_EOL); - SCM_SETCDR (z, SCM_EOL); - SCM_SETPTAB_ENTRY (port, pt); - scm_i_pthread_mutex_unlock (&scm_i_port_table_mutex); - - return pt; + return scm_c_make_port_with_encoding (tag, mode_bits, + scm_i_default_port_encoding (), + scm_i_get_conversion_strategy (SCM_BOOL_F), + stream); } -#endif +SCM +scm_new_port_table_entry (scm_t_bits tag) +{ + return scm_c_make_port (tag, 0, 0); +} /* Remove a port from the table and destroy it. */ @@ -652,10 +628,11 @@ scm_i_remove_port (SCM port) { scm_t_port *p; - scm_i_scm_pthread_mutex_lock (&scm_i_port_table_mutex); - p = SCM_PTAB_ENTRY (port); scm_port_non_buffer (p); + SCM_SETPTAB_ENTRY (port, 0); + scm_weak_set_remove_x (scm_i_port_weak_set, port); + p->putback_buf = NULL; p->putback_buf_size = 0; @@ -670,155 +647,72 @@ scm_i_remove_port (SCM port) iconv_close (p->output_cd); p->output_cd = (iconv_t) -1; } - - SCM_SETPTAB_ENTRY (port, 0); - - scm_hashq_remove_x (scm_i_port_weak_hash, port); - - scm_i_pthread_mutex_unlock (&scm_i_port_table_mutex); } #undef FUNC_NAME -/* Functions for debugging. */ -#ifdef GUILE_DEBUG -SCM_DEFINE (scm_pt_size, "pt-size", 0, 0, 0, - (), - "Return the number of ports in the port table. @code{pt-size}\n" - "is only included in @code{--enable-guile-debug} builds.") -#define FUNC_NAME s_scm_pt_size -{ - return scm_from_int (SCM_HASHTABLE_N_ITEMS (scm_i_port_weak_hash)); -} -#undef FUNC_NAME -#endif - -void -scm_port_non_buffer (scm_t_port *pt) -{ - pt->read_pos = pt->read_buf = pt->read_end = &pt->shortbuf; - pt->write_buf = pt->write_pos = &pt->shortbuf; - pt->read_buf_size = pt->write_buf_size = 1; - pt->write_end = pt->write_buf + pt->write_buf_size; -} - -/* Revealed counts --- an oddity inherited from SCSH. */ -/* Find a port in the table and return its revealed count. - Also used by the garbage collector. - */ +/* Predicates. */ -int -scm_revealed_count (SCM port) -{ - return SCM_REVEALED(port); -} - - - -/* Return the revealed count for a port. */ - -SCM_DEFINE (scm_port_revealed, "port-revealed", 1, 0, 0, - (SCM port), - "Return the revealed count for @var{port}.") -#define FUNC_NAME s_scm_port_revealed +SCM_DEFINE (scm_port_p, "port?", 1, 0, 0, + (SCM x), + "Return a boolean indicating whether @var{x} is a port.\n" + "Equivalent to @code{(or (input-port? @var{x}) (output-port?\n" + "@var{x}))}.") +#define FUNC_NAME s_scm_port_p { - port = SCM_COERCE_OUTPORT (port); - SCM_VALIDATE_OPENPORT (1, port); - return scm_from_int (scm_revealed_count (port)); + return scm_from_bool (SCM_PORTP (x)); } #undef FUNC_NAME -/* Set the revealed count for a port. */ -SCM_DEFINE (scm_set_port_revealed_x, "set-port-revealed!", 2, 0, 0, - (SCM port, SCM rcount), - "Sets the revealed count for a port to a given value.\n" - "The return value is unspecified.") -#define FUNC_NAME s_scm_set_port_revealed_x +SCM_DEFINE (scm_input_port_p, "input-port?", 1, 0, 0, + (SCM x), + "Return @code{#t} if @var{x} is an input port, otherwise return\n" + "@code{#f}. Any object satisfying this predicate also satisfies\n" + "@code{port?}.") +#define FUNC_NAME s_scm_input_port_p { - port = SCM_COERCE_OUTPORT (port); - SCM_VALIDATE_OPENPORT (1, port); - SCM_REVEALED (port) = scm_to_int (rcount); - return SCM_UNSPECIFIED; + return scm_from_bool (SCM_INPUT_PORT_P (x)); } #undef FUNC_NAME - - -/* Retrieving a port's mode. */ - -/* Return the flags that characterize a port based on the mode - * string used to open a file for that port. - * - * See PORT FLAGS in scm.h - */ - -static long -scm_i_mode_bits_n (SCM modes) -{ - return (SCM_OPN - | (scm_i_string_contains_char (modes, 'r') - || scm_i_string_contains_char (modes, '+') ? SCM_RDNG : 0) - | (scm_i_string_contains_char (modes, 'w') - || scm_i_string_contains_char (modes, 'a') - || scm_i_string_contains_char (modes, '+') ? SCM_WRTNG : 0) - | (scm_i_string_contains_char (modes, '0') ? SCM_BUF0 : 0) - | (scm_i_string_contains_char (modes, 'l') ? SCM_BUFLINE : 0)); -} - -long -scm_mode_bits (char *modes) +SCM_DEFINE (scm_output_port_p, "output-port?", 1, 0, 0, + (SCM x), + "Return @code{#t} if @var{x} is an output port, otherwise return\n" + "@code{#f}. Any object satisfying this predicate also satisfies\n" + "@code{port?}.") +#define FUNC_NAME s_scm_output_port_p { - return scm_i_mode_bits (scm_from_locale_string (modes)); + x = SCM_COERCE_OUTPORT (x); + return scm_from_bool (SCM_OUTPUT_PORT_P (x)); } +#undef FUNC_NAME -long -scm_i_mode_bits (SCM modes) +SCM_DEFINE (scm_port_closed_p, "port-closed?", 1, 0, 0, + (SCM port), + "Return @code{#t} if @var{port} is closed or @code{#f} if it is\n" + "open.") +#define FUNC_NAME s_scm_port_closed_p { - long bits; - - if (!scm_is_string (modes)) - scm_wrong_type_arg_msg (NULL, 0, modes, "string"); - - bits = scm_i_mode_bits_n (modes); - scm_remember_upto_here_1 (modes); - return bits; + SCM_VALIDATE_PORT (1, port); + return scm_from_bool (!SCM_OPPORTP (port)); } +#undef FUNC_NAME -/* Return the mode flags from an open port. - * Some modes such as "append" are only used when opening - * a file and are not returned here. */ - -SCM_DEFINE (scm_port_mode, "port-mode", 1, 0, 0, - (SCM port), - "Return the port modes associated with the open port @var{port}.\n" - "These will not necessarily be identical to the modes used when\n" - "the port was opened, since modes such as \"append\" which are\n" - "used only during port creation are not retained.") -#define FUNC_NAME s_scm_port_mode +SCM_DEFINE (scm_eof_object_p, "eof-object?", 1, 0, 0, + (SCM x), + "Return @code{#t} if @var{x} is an end-of-file object; otherwise\n" + "return @code{#f}.") +#define FUNC_NAME s_scm_eof_object_p { - char modes[4]; - modes[0] = '\0'; - - port = SCM_COERCE_OUTPORT (port); - SCM_VALIDATE_OPPORT (1, port); - if (SCM_CELL_WORD_0 (port) & SCM_RDNG) { - if (SCM_CELL_WORD_0 (port) & SCM_WRTNG) - strcpy (modes, "r+"); - else - strcpy (modes, "r"); - } - else if (SCM_CELL_WORD_0 (port) & SCM_WRTNG) - strcpy (modes, "w"); - if (SCM_CELL_WORD_0 (port) & SCM_BUF0) - strcat (modes, "0"); - return scm_from_locale_string (modes); + return scm_from_bool (SCM_EOF_OBJECT_P (x)); } #undef FUNC_NAME + /* Closing ports. */ /* scm_close_port @@ -835,7 +729,6 @@ SCM_DEFINE (scm_close_port, "close-port", 1, 0, 0, "descriptors.") #define FUNC_NAME s_scm_close_port { - size_t i; int rv; port = SCM_COERCE_OUTPORT (port); @@ -843,9 +736,8 @@ SCM_DEFINE (scm_close_port, "close-port", 1, 0, 0, SCM_VALIDATE_PORT (1, port); if (SCM_CLOSEDP (port)) return SCM_BOOL_F; - i = SCM_PTOBNUM (port); - if (scm_ptobs[i].close) - rv = (scm_ptobs[i].close) (port); + if (SCM_PORT_DESCRIPTOR (port)->close) + rv = SCM_PORT_DESCRIPTOR (port)->close (port); else rv = 0; scm_i_remove_port (port); @@ -885,183 +777,596 @@ SCM_DEFINE (scm_close_output_port, "close-output-port", 1, 0, 0, } #undef FUNC_NAME -static SCM -collect_keys (void *unused, SCM key, SCM value, SCM result) + + + +/* Encoding characters to byte streams, and decoding byte streams to + characters. */ + +/* A fluid specifying the default encoding for newly created ports. If it is + a string, that is the encoding. If it is #f, it is in the "native" + (Latin-1) encoding. */ +SCM_VARIABLE (default_port_encoding_var, "%default-port-encoding"); + +static int scm_port_encoding_init = 0; + +/* Use ENCODING as the default encoding for future ports. */ +void +scm_i_set_default_port_encoding (const char *encoding) { - return scm_cons (key, result); + if (!scm_port_encoding_init + || !scm_is_fluid (SCM_VARIABLE_REF (default_port_encoding_var))) + scm_misc_error (NULL, "tried to set port encoding fluid before it is initialized", + SCM_EOL); + + if (encoding == NULL + || !strcmp (encoding, "ASCII") + || !strcmp (encoding, "ANSI_X3.4-1968") + || !strcmp (encoding, "ISO-8859-1")) + scm_fluid_set_x (SCM_VARIABLE_REF (default_port_encoding_var), SCM_BOOL_F); + else + scm_fluid_set_x (SCM_VARIABLE_REF (default_port_encoding_var), + scm_from_locale_string (encoding)); +} + +/* Return the name of the default encoding for newly created ports; a + return value of NULL means "ISO-8859-1". */ +const char * +scm_i_default_port_encoding (void) +{ + if (!scm_port_encoding_init) + return NULL; + else if (!scm_is_fluid (SCM_VARIABLE_REF (default_port_encoding_var))) + return NULL; + else + { + SCM encoding; + + encoding = scm_fluid_ref (SCM_VARIABLE_REF (default_port_encoding_var)); + if (!scm_is_string (encoding)) + return NULL; + else + return scm_i_string_chars (encoding); + } } void -scm_c_port_for_each (void (*proc)(void *data, SCM p), void *data) +scm_i_set_port_encoding_x (SCM port, const char *encoding) { - SCM ports; + scm_t_port *pt; + iconv_t new_input_cd, new_output_cd; - /* Copy out the port table as a list so that we get strong references - to all the values. */ - scm_i_pthread_mutex_lock (&scm_i_port_table_mutex); - ports = scm_internal_hash_fold (collect_keys, NULL, - SCM_EOL, scm_i_port_weak_hash); - scm_i_pthread_mutex_unlock (&scm_i_port_table_mutex); + new_input_cd = (iconv_t) -1; + new_output_cd = (iconv_t) -1; + + /* Set the character encoding for this port. */ + pt = SCM_PTAB_ENTRY (port); + + if (encoding == NULL) + encoding = "ISO-8859-1"; + + if (pt->encoding != encoding) + pt->encoding = scm_gc_strdup (encoding, "port"); - for (; scm_is_pair (ports); ports = scm_cdr (ports)) + /* If ENCODING is UTF-8, then no conversion descriptor is opened + because we do I/O ourselves. This saves 100+ KiB for each + descriptor. */ + if (strcmp (encoding, "UTF-8")) { - SCM p = scm_car (ports); - if (SCM_PORTP (p)) - proc (data, p); + if (SCM_CELL_WORD_0 (port) & SCM_RDNG) + { + /* Open an input iconv conversion descriptor, from ENCODING + to UTF-8. We choose UTF-8, not UTF-32, because iconv + implementations can typically convert from anything to + UTF-8, but not to UTF-32 (see + <http://lists.gnu.org/archive/html/bug-libunistring/2010-09/msg00007.html>). */ + new_input_cd = iconv_open ("UTF-8", encoding); + if (new_input_cd == (iconv_t) -1) + goto invalid_encoding; + } + + if (SCM_CELL_WORD_0 (port) & SCM_WRTNG) + { + new_output_cd = iconv_open (encoding, "UTF-8"); + if (new_output_cd == (iconv_t) -1) + { + if (new_input_cd != (iconv_t) -1) + iconv_close (new_input_cd); + goto invalid_encoding; + } + } } + + if (pt->input_cd != (iconv_t) -1) + iconv_close (pt->input_cd); + if (pt->output_cd != (iconv_t) -1) + iconv_close (pt->output_cd); + + pt->input_cd = new_input_cd; + pt->output_cd = new_output_cd; + + return; + + invalid_encoding: + { + SCM err; + err = scm_from_locale_string (encoding); + scm_misc_error ("scm_i_set_port_encoding_x", + "invalid or unknown character encoding ~s", + scm_list_1 (err)); + } } -SCM_DEFINE (scm_port_for_each, "port-for-each", 1, 0, 0, - (SCM proc), - "Apply @var{proc} to each port in the Guile port table\n" - "in turn. The return value is unspecified. More specifically,\n" - "@var{proc} is applied exactly once to every port that exists\n" - "in the system at the time @var{port-for-each} is invoked.\n" - "Changes to the port table while @var{port-for-each} is running\n" - "have no effect as far as @var{port-for-each} is concerned.") -#define FUNC_NAME s_scm_port_for_each +SCM_DEFINE (scm_port_encoding, "port-encoding", 1, 0, 0, + (SCM port), + "Returns, as a string, the character encoding that @var{port}\n" + "uses to interpret its input and output.\n") +#define FUNC_NAME s_scm_port_encoding { - SCM ports; + scm_t_port *pt; + const char *enc; - SCM_VALIDATE_PROC (1, proc); + SCM_VALIDATE_PORT (1, port); - /* Copy out the port table as a list so that we get strong references - to all the values. */ - scm_i_pthread_mutex_lock (&scm_i_port_table_mutex); - ports = scm_internal_hash_fold (collect_keys, NULL, - SCM_EOL, scm_i_port_weak_hash); - scm_i_pthread_mutex_unlock (&scm_i_port_table_mutex); + pt = SCM_PTAB_ENTRY (port); + enc = pt->encoding; + if (enc) + return scm_from_locale_string (pt->encoding); + else + return SCM_BOOL_F; +} +#undef FUNC_NAME + +SCM_DEFINE (scm_set_port_encoding_x, "set-port-encoding!", 2, 0, 0, + (SCM port, SCM enc), + "Sets the character encoding that will be used to interpret all\n" + "port I/O. New ports are created with the encoding\n" + "appropriate for the current locale if @code{setlocale} has \n" + "been called or ISO-8859-1 otherwise\n" + "and this procedure can be used to modify that encoding.\n") +#define FUNC_NAME s_scm_set_port_encoding_x +{ + char *enc_str; - for (; scm_is_pair (ports); ports = scm_cdr (ports)) - if (SCM_PORTP (SCM_CAR (ports))) - scm_call_1 (proc, SCM_CAR (ports)); + SCM_VALIDATE_PORT (1, port); + SCM_VALIDATE_STRING (2, enc); + + enc_str = scm_to_locale_string (enc); + scm_i_set_port_encoding_x (port, enc_str); + free (enc_str); return SCM_UNSPECIFIED; } #undef FUNC_NAME - -/* Utter miscellany. Gosh, we should clean this up some time. */ +/* This determines how conversions handle unconvertible characters. */ +SCM_GLOBAL_VARIABLE (scm_conversion_strategy, "%port-conversion-strategy"); +static int scm_conversion_strategy_init = 0; -SCM_DEFINE (scm_input_port_p, "input-port?", 1, 0, 0, - (SCM x), - "Return @code{#t} if @var{x} is an input port, otherwise return\n" - "@code{#f}. Any object satisfying this predicate also satisfies\n" - "@code{port?}.") -#define FUNC_NAME s_scm_input_port_p +scm_t_string_failed_conversion_handler +scm_i_get_conversion_strategy (SCM port) { - return scm_from_bool (SCM_INPUT_PORT_P (x)); + SCM encoding; + + if (scm_is_false (port)) + { + if (!scm_conversion_strategy_init + || !scm_is_fluid (SCM_VARIABLE_REF (scm_conversion_strategy))) + return SCM_FAILED_CONVERSION_QUESTION_MARK; + else + { + encoding = scm_fluid_ref (SCM_VARIABLE_REF (scm_conversion_strategy)); + if (scm_is_false (encoding)) + return SCM_FAILED_CONVERSION_QUESTION_MARK; + else + return (scm_t_string_failed_conversion_handler) scm_to_int (encoding); + } + } + else + { + scm_t_port *pt; + pt = SCM_PTAB_ENTRY (port); + return pt->ilseq_handler; + } + } -#undef FUNC_NAME -SCM_DEFINE (scm_output_port_p, "output-port?", 1, 0, 0, - (SCM x), - "Return @code{#t} if @var{x} is an output port, otherwise return\n" - "@code{#f}. Any object satisfying this predicate also satisfies\n" - "@code{port?}.") -#define FUNC_NAME s_scm_output_port_p +void +scm_i_set_conversion_strategy_x (SCM port, + scm_t_string_failed_conversion_handler handler) { - x = SCM_COERCE_OUTPORT (x); - return scm_from_bool (SCM_OUTPUT_PORT_P (x)); + SCM strategy; + scm_t_port *pt; + + strategy = scm_from_int ((int) handler); + + if (scm_is_false (port)) + { + /* Set the default encoding for future ports. */ + if (!scm_conversion_strategy_init + || !scm_is_fluid (SCM_VARIABLE_REF (scm_conversion_strategy))) + scm_misc_error (NULL, "tried to set conversion strategy fluid before it is initialized", + SCM_EOL); + scm_fluid_set_x (SCM_VARIABLE_REF (scm_conversion_strategy), strategy); + } + else + { + /* Set the character encoding for this port. */ + pt = SCM_PTAB_ENTRY (port); + pt->ilseq_handler = handler; + } +} + +SCM_DEFINE (scm_port_conversion_strategy, "port-conversion-strategy", + 1, 0, 0, (SCM port), + "Returns the behavior of the port when handling a character that\n" + "is not representable in the port's current encoding.\n" + "It returns the symbol @code{error} if unrepresentable characters\n" + "should cause exceptions, @code{substitute} if the port should\n" + "try to replace unrepresentable characters with question marks or\n" + "approximate characters, or @code{escape} if unrepresentable\n" + "characters should be converted to string escapes.\n" + "\n" + "If @var{port} is @code{#f}, then the current default behavior\n" + "will be returned. New ports will have this default behavior\n" + "when they are created.\n") +#define FUNC_NAME s_scm_port_conversion_strategy +{ + scm_t_string_failed_conversion_handler h; + + SCM_VALIDATE_OPPORT (1, port); + + if (!scm_is_false (port)) + { + SCM_VALIDATE_OPPORT (1, port); + } + + h = scm_i_get_conversion_strategy (port); + if (h == SCM_FAILED_CONVERSION_ERROR) + return scm_from_latin1_symbol ("error"); + else if (h == SCM_FAILED_CONVERSION_QUESTION_MARK) + return scm_from_latin1_symbol ("substitute"); + else if (h == SCM_FAILED_CONVERSION_ESCAPE_SEQUENCE) + return scm_from_latin1_symbol ("escape"); + else + abort (); + + /* Never gets here. */ + return SCM_UNDEFINED; } #undef FUNC_NAME -SCM_DEFINE (scm_port_p, "port?", 1, 0, 0, - (SCM x), - "Return a boolean indicating whether @var{x} is a port.\n" - "Equivalent to @code{(or (input-port? @var{x}) (output-port?\n" - "@var{x}))}.") -#define FUNC_NAME s_scm_port_p +SCM_DEFINE (scm_set_port_conversion_strategy_x, "set-port-conversion-strategy!", + 2, 0, 0, + (SCM port, SCM sym), + "Sets the behavior of the interpreter when outputting a character\n" + "that is not representable in the port's current encoding.\n" + "@var{sym} can be either @code{'error}, @code{'substitute}, or\n" + "@code{'escape}. If it is @code{'error}, an error will be thrown\n" + "when an unconvertible character is encountered. If it is\n" + "@code{'substitute}, then unconvertible characters will \n" + "be replaced with approximate characters, or with question marks\n" + "if no approximately correct character is available.\n" + "If it is @code{'escape},\n" + "it will appear as a hex escape when output.\n" + "\n" + "If @var{port} is an open port, the conversion error behavior\n" + "is set for that port. If it is @code{#f}, it is set as the\n" + "default behavior for any future ports that get created in\n" + "this thread.\n") +#define FUNC_NAME s_scm_set_port_conversion_strategy_x { - return scm_from_bool (SCM_PORTP (x)); + SCM err; + SCM qm; + SCM esc; + + if (!scm_is_false (port)) + { + SCM_VALIDATE_OPPORT (1, port); + } + + err = scm_from_latin1_symbol ("error"); + if (scm_is_true (scm_eqv_p (sym, err))) + { + scm_i_set_conversion_strategy_x (port, SCM_FAILED_CONVERSION_ERROR); + return SCM_UNSPECIFIED; + } + + qm = scm_from_latin1_symbol ("substitute"); + if (scm_is_true (scm_eqv_p (sym, qm))) + { + scm_i_set_conversion_strategy_x (port, + SCM_FAILED_CONVERSION_QUESTION_MARK); + return SCM_UNSPECIFIED; + } + + esc = scm_from_latin1_symbol ("escape"); + if (scm_is_true (scm_eqv_p (sym, esc))) + { + scm_i_set_conversion_strategy_x (port, + SCM_FAILED_CONVERSION_ESCAPE_SEQUENCE); + return SCM_UNSPECIFIED; + } + + SCM_MISC_ERROR ("unknown conversion behavior ~s", scm_list_1 (sym)); + + return SCM_UNSPECIFIED; } #undef FUNC_NAME -SCM_DEFINE (scm_port_closed_p, "port-closed?", 1, 0, 0, + + + +/* The port lock. */ + +static void +lock_port (SCM port) +{ + scm_c_lock_port (port); +} + +static void +unlock_port (SCM port) +{ + scm_c_unlock_port (port); +} + +void +scm_dynwind_lock_port (SCM port) +{ + scm_dynwind_unwind_handler_with_scm (unlock_port, port, + SCM_F_WIND_EXPLICITLY); + scm_dynwind_rewind_handler_with_scm (lock_port, port, + SCM_F_WIND_EXPLICITLY); +} + + + + +/* Revealed counts --- an oddity inherited from SCSH. */ + +/* Find a port in the table and return its revealed count. + Also used by the garbage collector. + */ +int +scm_revealed_count (SCM port) +{ + int ret; + + scm_c_lock_port (port); + ret = SCM_REVEALED (port); + scm_c_unlock_port (port); + + return ret; +} + +SCM_DEFINE (scm_port_revealed, "port-revealed", 1, 0, 0, (SCM port), - "Return @code{#t} if @var{port} is closed or @code{#f} if it is\n" - "open.") -#define FUNC_NAME s_scm_port_closed_p + "Return the revealed count for @var{port}.") +#define FUNC_NAME s_scm_port_revealed { - SCM_VALIDATE_PORT (1, port); - return scm_from_bool (!SCM_OPPORTP (port)); + port = SCM_COERCE_OUTPORT (port); + SCM_VALIDATE_OPENPORT (1, port); + return scm_from_int (scm_revealed_count (port)); } #undef FUNC_NAME -SCM_DEFINE (scm_eof_object_p, "eof-object?", 1, 0, 0, - (SCM x), - "Return @code{#t} if @var{x} is an end-of-file object; otherwise\n" - "return @code{#f}.") -#define FUNC_NAME s_scm_eof_object_p +/* Set the revealed count for a port. */ +SCM_DEFINE (scm_set_port_revealed_x, "set-port-revealed!", 2, 0, 0, + (SCM port, SCM rcount), + "Sets the revealed count for a port to a given value.\n" + "The return value is unspecified.") +#define FUNC_NAME s_scm_set_port_revealed_x { - return scm_from_bool(SCM_EOF_OBJECT_P (x)); + int r; + port = SCM_COERCE_OUTPORT (port); + SCM_VALIDATE_OPENPORT (1, port); + r = scm_to_int (rcount); + scm_c_lock_port (port); + SCM_REVEALED (port) = r; + scm_c_unlock_port (port); + return SCM_UNSPECIFIED; } #undef FUNC_NAME -SCM_DEFINE (scm_force_output, "force-output", 0, 1, 0, - (SCM port), - "Flush the specified output port, or the current output port if @var{port}\n" - "is omitted. The current output buffer contents are passed to the\n" - "underlying port implementation (e.g., in the case of fports, the\n" - "data will be written to the file and the output buffer will be cleared.)\n" - "It has no effect on an unbuffered port.\n\n" +/* Set the revealed count for a port. */ +SCM_DEFINE (scm_adjust_port_revealed_x, "adjust-port-revealed!", 2, 0, 0, + (SCM port, SCM addend), + "Add @var{addend} to the revealed count of @var{port}.\n" "The return value is unspecified.") -#define FUNC_NAME s_scm_force_output +#define FUNC_NAME s_scm_set_port_revealed_x { - if (SCM_UNBNDP (port)) - port = scm_current_output_port (); - else - { - port = SCM_COERCE_OUTPORT (port); - SCM_VALIDATE_OPOUTPORT (1, port); - } - scm_flush (port); + int a; + port = SCM_COERCE_OUTPORT (port); + SCM_VALIDATE_OPENPORT (1, port); + a = scm_to_int (addend); + scm_c_lock_port (port); + SCM_REVEALED (port) += a; + scm_c_unlock_port (port); return SCM_UNSPECIFIED; } #undef FUNC_NAME -static void -flush_output_port (void *closure, SCM port) + + +/* Input. */ + +int +scm_get_byte_or_eof (SCM port) { - if (SCM_OPOUTPORTP (port)) - scm_flush (port); + int ret; + + scm_c_lock_port (port); + ret = scm_get_byte_or_eof_unlocked (port); + scm_c_unlock_port (port); + + return ret; } -SCM_DEFINE (scm_flush_all_ports, "flush-all-ports", 0, 0, 0, - (), - "Equivalent to calling @code{force-output} on\n" - "all open output ports. The return value is unspecified.") -#define FUNC_NAME s_scm_flush_all_ports +int +scm_peek_byte_or_eof (SCM port) { - scm_c_port_for_each (&flush_output_port, NULL); - return SCM_UNSPECIFIED; + int ret; + + scm_c_lock_port (port); + ret = scm_peek_byte_or_eof_unlocked (port); + scm_c_unlock_port (port); + + return ret; } -#undef FUNC_NAME -SCM_DEFINE (scm_read_char, "read-char", 0, 1, 0, - (SCM port), - "Return the next character available from @var{port}, updating\n" - "@var{port} to point to the following character. If no more\n" - "characters are available, the end-of-file object is returned.\n" - "\n" - "When @var{port}'s data cannot be decoded according to its\n" - "character encoding, a @code{decoding-error} is raised and\n" - "@var{port} points past the erroneous byte sequence.\n") -#define FUNC_NAME s_scm_read_char +/* scm_c_read + * + * Used by an application to read arbitrary number of bytes from an + * SCM port. Same semantics as libc read, except that scm_c_read only + * returns less than SIZE bytes if at end-of-file. + * + * Warning: Doesn't update port line and column counts! */ + +/* This structure, and the following swap_buffer function, are used + for temporarily swapping a port's own read buffer, and the buffer + that the caller of scm_c_read provides. */ +struct port_and_swap_buffer { - scm_t_wchar c; - if (SCM_UNBNDP (port)) - port = scm_current_input_port (); + scm_t_port *pt; + unsigned char *buffer; + size_t size; +}; + +static void +swap_buffer (void *data) +{ + struct port_and_swap_buffer *psb = (struct port_and_swap_buffer *) data; + unsigned char *old_buf = psb->pt->read_buf; + size_t old_size = psb->pt->read_buf_size; + + /* Make the port use (buffer, size) from the struct. */ + psb->pt->read_pos = psb->pt->read_buf = psb->pt->read_end = psb->buffer; + psb->pt->read_buf_size = psb->size; + + /* Save the port's old (buffer, size) in the struct. */ + psb->buffer = old_buf; + psb->size = old_size; +} + +size_t +scm_c_read_unlocked (SCM port, void *buffer, size_t size) +#define FUNC_NAME "scm_c_read" +{ + scm_t_port *pt; + size_t n_read = 0, n_available; + struct port_and_swap_buffer psb; + SCM_VALIDATE_OPINPORT (1, port); - c = scm_getc (port); - if (EOF == c) - return SCM_EOF_VAL; - return SCM_MAKE_CHAR (c); + + pt = SCM_PTAB_ENTRY (port); + if (pt->rw_active == SCM_PORT_WRITE) + SCM_PORT_DESCRIPTOR (port)->flush (port); + + if (pt->rw_random) + pt->rw_active = SCM_PORT_READ; + + /* Take bytes first from the port's read buffer. */ + if (pt->read_pos < pt->read_end) + { + n_available = min (size, pt->read_end - pt->read_pos); + memcpy (buffer, pt->read_pos, n_available); + buffer = (char *) buffer + n_available; + pt->read_pos += n_available; + n_read += n_available; + size -= n_available; + } + + /* Avoid the scm_dynwind_* costs if we now have enough data. */ + if (size == 0) + return n_read; + + /* Now we will call scm_fill_input repeatedly until we have read the + requested number of bytes. (Note that a single scm_fill_input + call does not guarantee to fill the whole of the port's read + buffer.) */ + if (pt->read_buf_size <= 1 && pt->encoding == NULL) + { + /* The port that we are reading from is unbuffered - i.e. does + not have its own persistent buffer - but we have a buffer, + provided by our caller, that is the right size for the data + that is wanted. For the following scm_fill_input calls, + therefore, we use the buffer in hand as the port's read + buffer. + + We need to make sure that the port's normal (1 byte) buffer + is reinstated in case one of the scm_fill_input () calls + throws an exception; we use the scm_dynwind_* API to achieve + that. + + A consequence of this optimization is that the fill_input + functions can't unget characters. That'll push data to the + pushback buffer instead of this psb buffer. */ +#if SCM_DEBUG == 1 + unsigned char *pback = pt->putback_buf; +#endif + psb.pt = pt; + psb.buffer = buffer; + psb.size = size; + scm_dynwind_begin (SCM_F_DYNWIND_REWINDABLE); + scm_dynwind_rewind_handler (swap_buffer, &psb, SCM_F_WIND_EXPLICITLY); + scm_dynwind_unwind_handler (swap_buffer, &psb, SCM_F_WIND_EXPLICITLY); + + /* Call scm_fill_input until we have all the bytes that we need, + or we hit EOF. */ + while (pt->read_buf_size && (scm_fill_input_unlocked (port) != EOF)) + { + pt->read_buf_size -= (pt->read_end - pt->read_pos); + pt->read_pos = pt->read_buf = pt->read_end; + } +#if SCM_DEBUG == 1 + if (pback != pt->putback_buf + || pt->read_buf - (unsigned char *) buffer < 0) + scm_misc_error (FUNC_NAME, + "scm_c_read must not call a fill function that pushes " + "back characters onto an unbuffered port", SCM_EOL); +#endif + n_read += pt->read_buf - (unsigned char *) buffer; + + /* Reinstate the port's normal buffer. */ + scm_dynwind_end (); + } + else + { + /* The port has its own buffer. It is important that we use it, + even if it happens to be smaller than our caller's buffer, so + that a custom port implementation's entry points (in + particular, fill_input) can rely on the buffer always being + the same as they first set up. */ + while (size && (scm_fill_input_unlocked (port) != EOF)) + { + n_available = min (size, pt->read_end - pt->read_pos); + memcpy (buffer, pt->read_pos, n_available); + buffer = (char *) buffer + n_available; + pt->read_pos += n_available; + n_read += n_available; + size -= n_available; + } + } + + return n_read; } #undef FUNC_NAME +size_t +scm_c_read (SCM port, void *buffer, size_t size) +{ + size_t ret; + + scm_c_lock_port (port); + ret = scm_c_read_unlocked (port, buffer, size); + scm_c_unlock_port (port); + + return ret; +} + /* Update the line and column number of PORT after consumption of C. */ static inline void update_port_lf (scm_t_wchar c, SCM port) @@ -1148,7 +1453,7 @@ get_utf8_codepoint (SCM port, scm_t_wchar *codepoint, *len = 0; pt = SCM_PTAB_ENTRY (port); - byte = scm_get_byte_or_eof (port); + byte = scm_get_byte_or_eof_unlocked (port); if (byte == EOF) { *codepoint = EOF; @@ -1164,7 +1469,7 @@ get_utf8_codepoint (SCM port, scm_t_wchar *codepoint, else if (buf[0] >= 0xc2 && buf[0] <= 0xdf) { /* 2-byte form. */ - byte = scm_peek_byte_or_eof (port); + byte = scm_peek_byte_or_eof_unlocked (port); ASSERT_NOT_EOF (byte); if (SCM_UNLIKELY ((byte & 0xc0) != 0x80)) @@ -1180,7 +1485,7 @@ get_utf8_codepoint (SCM port, scm_t_wchar *codepoint, else if ((buf[0] & 0xf0) == 0xe0) { /* 3-byte form. */ - byte = scm_peek_byte_or_eof (port); + byte = scm_peek_byte_or_eof_unlocked (port); ASSERT_NOT_EOF (byte); if (SCM_UNLIKELY ((byte & 0xc0) != 0x80 @@ -1192,7 +1497,7 @@ get_utf8_codepoint (SCM port, scm_t_wchar *codepoint, buf[1] = (scm_t_uint8) byte; *len = 2; - byte = scm_peek_byte_or_eof (port); + byte = scm_peek_byte_or_eof_unlocked (port); ASSERT_NOT_EOF (byte); if (SCM_UNLIKELY ((byte & 0xc0) != 0x80)) @@ -1209,7 +1514,7 @@ get_utf8_codepoint (SCM port, scm_t_wchar *codepoint, else if (buf[0] >= 0xf0 && buf[0] <= 0xf4) { /* 4-byte form. */ - byte = scm_peek_byte_or_eof (port); + byte = scm_peek_byte_or_eof_unlocked (port); ASSERT_NOT_EOF (byte); if (SCM_UNLIKELY (((byte & 0xc0) != 0x80) @@ -1221,7 +1526,7 @@ get_utf8_codepoint (SCM port, scm_t_wchar *codepoint, buf[1] = (scm_t_uint8) byte; *len = 2; - byte = scm_peek_byte_or_eof (port); + byte = scm_peek_byte_or_eof_unlocked (port); ASSERT_NOT_EOF (byte); if (SCM_UNLIKELY ((byte & 0xc0) != 0x80)) @@ -1231,7 +1536,7 @@ get_utf8_codepoint (SCM port, scm_t_wchar *codepoint, buf[2] = (scm_t_uint8) byte; *len = 3; - byte = scm_peek_byte_or_eof (port); + byte = scm_peek_byte_or_eof_unlocked (port); ASSERT_NOT_EOF (byte); if (SCM_UNLIKELY ((byte & 0xc0) != 0x80)) @@ -1286,7 +1591,7 @@ get_iconv_codepoint (SCM port, scm_t_wchar *codepoint, char *input; size_t input_left, output_left, done; - byte_read = scm_get_byte_or_eof (port); + byte_read = scm_get_byte_or_eof_unlocked (port); if (byte_read == EOF) { if (bytes_consumed == 0) @@ -1366,7 +1671,7 @@ get_codepoint (SCM port, scm_t_wchar *codepoint, /* Read a codepoint from PORT and return it. */ scm_t_wchar -scm_getc (SCM port) +scm_getc_unlocked (SCM port) #define FUNC_NAME "scm_getc" { int err; @@ -1384,274 +1689,47 @@ scm_getc (SCM port) } #undef FUNC_NAME -/* this should only be called when the read buffer is empty. it - tries to refill the read buffer. it returns the first char from - the port, which is either EOF or *(pt->read_pos). */ -int -scm_fill_input (SCM port) -{ - scm_t_port *pt = SCM_PTAB_ENTRY (port); - - assert (pt->read_pos == pt->read_end); - - if (pt->read_buf == pt->putback_buf) - { - /* finished reading put-back chars. */ - pt->read_buf = pt->saved_read_buf; - pt->read_pos = pt->saved_read_pos; - pt->read_end = pt->saved_read_end; - pt->read_buf_size = pt->saved_read_buf_size; - if (pt->read_pos < pt->read_end) - return *(pt->read_pos); - } - return scm_ptobs[SCM_PTOBNUM (port)].fill_input (port); -} - - -/* scm_lfwrite - * - * This function differs from scm_c_write; it updates port line and - * column. */ - -void -scm_lfwrite (const char *ptr, size_t size, SCM port) -{ - scm_t_port *pt = SCM_PTAB_ENTRY (port); - scm_t_ptob_descriptor *ptob = &scm_ptobs[SCM_PTOBNUM (port)]; - - if (pt->rw_active == SCM_PORT_READ) - scm_end_input (port); - - ptob->write (port, ptr, size); - - for (; size; ptr++, size--) - update_port_lf ((scm_t_wchar) (unsigned char) *ptr, port); - - if (pt->rw_random) - pt->rw_active = SCM_PORT_WRITE; -} - -/* Write STR to PORT from START inclusive to END exclusive. */ -void -scm_lfwrite_substr (SCM str, size_t start, size_t end, SCM port) -{ - scm_t_port *pt = SCM_PTAB_ENTRY (port); - - if (pt->rw_active == SCM_PORT_READ) - scm_end_input (port); - - if (end == (size_t) -1) - end = scm_i_string_length (str); - - scm_display (scm_c_substring (str, start, end), port); - - if (pt->rw_random) - pt->rw_active = SCM_PORT_WRITE; -} - -/* scm_c_read - * - * Used by an application to read arbitrary number of bytes from an - * SCM port. Same semantics as libc read, except that scm_c_read only - * returns less than SIZE bytes if at end-of-file. - * - * Warning: Doesn't update port line and column counts! */ - -/* This structure, and the following swap_buffer function, are used - for temporarily swapping a port's own read buffer, and the buffer - that the caller of scm_c_read provides. */ -struct port_and_swap_buffer -{ - scm_t_port *pt; - unsigned char *buffer; - size_t size; -}; - -static void -swap_buffer (void *data) +scm_t_wchar +scm_getc (SCM port) { - struct port_and_swap_buffer *psb = (struct port_and_swap_buffer *) data; - unsigned char *old_buf = psb->pt->read_buf; - size_t old_size = psb->pt->read_buf_size; + scm_t_wchar ret; - /* Make the port use (buffer, size) from the struct. */ - psb->pt->read_pos = psb->pt->read_buf = psb->pt->read_end = psb->buffer; - psb->pt->read_buf_size = psb->size; + scm_c_lock_port (port); + ret = scm_getc_unlocked (port); + scm_c_unlock_port (port); - /* Save the port's old (buffer, size) in the struct. */ - psb->buffer = old_buf; - psb->size = old_size; + return ret; } -size_t -scm_c_read (SCM port, void *buffer, size_t size) -#define FUNC_NAME "scm_c_read" +SCM_DEFINE (scm_read_char, "read-char", 0, 1, 0, + (SCM port), + "Return the next character available from @var{port}, updating\n" + "@var{port} to point to the following character. If no more\n" + "characters are available, the end-of-file object is returned.\n" + "\n" + "When @var{port}'s data cannot be decoded according to its\n" + "character encoding, a @code{decoding-error} is raised and\n" + "@var{port} points past the erroneous byte sequence.\n") +#define FUNC_NAME s_scm_read_char { - scm_t_port *pt; - size_t n_read = 0, n_available; - struct port_and_swap_buffer psb; - + scm_t_wchar c; + if (SCM_UNBNDP (port)) + port = scm_current_input_port (); SCM_VALIDATE_OPINPORT (1, port); - - pt = SCM_PTAB_ENTRY (port); - if (pt->rw_active == SCM_PORT_WRITE) - scm_ptobs[SCM_PTOBNUM (port)].flush (port); - - if (pt->rw_random) - pt->rw_active = SCM_PORT_READ; - - /* Take bytes first from the port's read buffer. */ - if (pt->read_pos < pt->read_end) - { - n_available = min (size, pt->read_end - pt->read_pos); - memcpy (buffer, pt->read_pos, n_available); - buffer = (char *) buffer + n_available; - pt->read_pos += n_available; - n_read += n_available; - size -= n_available; - } - - /* Avoid the scm_dynwind_* costs if we now have enough data. */ - if (size == 0) - return n_read; - - /* Now we will call scm_fill_input repeatedly until we have read the - requested number of bytes. (Note that a single scm_fill_input - call does not guarantee to fill the whole of the port's read - buffer.) */ - if (pt->read_buf_size <= 1 && pt->encoding == NULL) - { - /* The port that we are reading from is unbuffered - i.e. does - not have its own persistent buffer - but we have a buffer, - provided by our caller, that is the right size for the data - that is wanted. For the following scm_fill_input calls, - therefore, we use the buffer in hand as the port's read - buffer. - - We need to make sure that the port's normal (1 byte) buffer - is reinstated in case one of the scm_fill_input () calls - throws an exception; we use the scm_dynwind_* API to achieve - that. - - A consequence of this optimization is that the fill_input - functions can't unget characters. That'll push data to the - pushback buffer instead of this psb buffer. */ -#if SCM_DEBUG == 1 - unsigned char *pback = pt->putback_buf; -#endif - psb.pt = pt; - psb.buffer = buffer; - psb.size = size; - scm_dynwind_begin (SCM_F_DYNWIND_REWINDABLE); - scm_dynwind_rewind_handler (swap_buffer, &psb, SCM_F_WIND_EXPLICITLY); - scm_dynwind_unwind_handler (swap_buffer, &psb, SCM_F_WIND_EXPLICITLY); - - /* Call scm_fill_input until we have all the bytes that we need, - or we hit EOF. */ - while (pt->read_buf_size && (scm_fill_input (port) != EOF)) - { - pt->read_buf_size -= (pt->read_end - pt->read_pos); - pt->read_pos = pt->read_buf = pt->read_end; - } -#if SCM_DEBUG == 1 - if (pback != pt->putback_buf - || pt->read_buf - (unsigned char *) buffer < 0) - scm_misc_error (FUNC_NAME, - "scm_c_read must not call a fill function that pushes " - "back characters onto an unbuffered port", SCM_EOL); -#endif - n_read += pt->read_buf - (unsigned char *) buffer; - - /* Reinstate the port's normal buffer. */ - scm_dynwind_end (); - } - else - { - /* The port has its own buffer. It is important that we use it, - even if it happens to be smaller than our caller's buffer, so - that a custom port implementation's entry points (in - particular, fill_input) can rely on the buffer always being - the same as they first set up. */ - while (size && (scm_fill_input (port) != EOF)) - { - n_available = min (size, pt->read_end - pt->read_pos); - memcpy (buffer, pt->read_pos, n_available); - buffer = (char *) buffer + n_available; - pt->read_pos += n_available; - n_read += n_available; - size -= n_available; - } - } - - return n_read; -} -#undef FUNC_NAME - -/* scm_c_write - * - * Used by an application to write arbitrary number of bytes to an SCM - * port. Similar semantics as libc write. However, unlike libc - * write, scm_c_write writes the requested number of bytes and has no - * return value. - * - * Warning: Doesn't update port line and column counts! - */ - -void -scm_c_write (SCM port, const void *ptr, size_t size) -#define FUNC_NAME "scm_c_write" -{ - scm_t_port *pt; - scm_t_ptob_descriptor *ptob; - - SCM_VALIDATE_OPOUTPORT (1, port); - - pt = SCM_PTAB_ENTRY (port); - ptob = &scm_ptobs[SCM_PTOBNUM (port)]; - - if (pt->rw_active == SCM_PORT_READ) - scm_end_input (port); - - ptob->write (port, ptr, size); - - if (pt->rw_random) - pt->rw_active = SCM_PORT_WRITE; + c = scm_getc_unlocked (port); + if (EOF == c) + return SCM_EOF_VAL; + return SCM_MAKE_CHAR (c); } #undef FUNC_NAME -void -scm_flush (SCM port) -{ - long i = SCM_PTOBNUM (port); - assert (i >= 0); - (scm_ptobs[i].flush) (port); -} - -void -scm_end_input (SCM port) -{ - long offset; - scm_t_port *pt = SCM_PTAB_ENTRY (port); - - if (pt->read_buf == pt->putback_buf) - { - offset = pt->read_end - pt->read_pos; - pt->read_buf = pt->saved_read_buf; - pt->read_pos = pt->saved_read_pos; - pt->read_end = pt->saved_read_end; - pt->read_buf_size = pt->saved_read_buf_size; - } - else - offset = 0; - - scm_ptobs[SCM_PTOBNUM (port)].end_input (port, offset); -} +/* Pushback. */ void -scm_unget_byte (int c, SCM port) +scm_unget_byte_unlocked (int c, SCM port) #define FUNC_NAME "scm_unget_byte" { scm_t_port *pt = SCM_PTAB_ENTRY (port); @@ -1714,8 +1792,16 @@ scm_unget_byte (int c, SCM port) } #undef FUNC_NAME +void +scm_unget_byte (int c, SCM port) +{ + scm_c_lock_port (port); + scm_unget_byte_unlocked (c, port); + scm_c_unlock_port (port); +} + void -scm_ungetc (scm_t_wchar c, SCM port) +scm_ungetc_unlocked (scm_t_wchar c, SCM port) #define FUNC_NAME "scm_ungetc" { scm_t_port *pt = SCM_PTAB_ENTRY (port); @@ -1742,7 +1828,7 @@ scm_ungetc (scm_t_wchar c, SCM port) SCM_BOOL_F, SCM_MAKE_CHAR (c)); for (i = len - 1; i >= 0; i--) - scm_unget_byte (result[i], port); + scm_unget_byte_unlocked (result[i], port); if (SCM_UNLIKELY (result != result_buf)) free (result); @@ -1759,9 +1845,16 @@ scm_ungetc (scm_t_wchar c, SCM port) } #undef FUNC_NAME +void +scm_ungetc (scm_t_wchar c, SCM port) +{ + scm_c_lock_port (port); + scm_ungetc_unlocked (c, port); + scm_c_unlock_port (port); +} void -scm_ungets (const char *s, int n, SCM port) +scm_ungets_unlocked (const char *s, int n, SCM port) { /* This is simple minded and inefficient, but unreading strings is * probably not a common operation, and remember that line and @@ -1770,9 +1863,16 @@ scm_ungets (const char *s, int n, SCM port) * Please feel free to write an optimized version! */ while (n--) - scm_ungetc (s[n], port); + scm_ungetc_unlocked (s[n], port); } +void +scm_ungets (const char *s, int n, SCM port) +{ + scm_c_lock_port (port); + scm_ungets_unlocked (s, n, port); + scm_c_unlock_port (port); +} SCM_DEFINE (scm_peek_char, "peek-char", 0, 1, 0, (SCM port), @@ -1814,7 +1914,7 @@ SCM_DEFINE (scm_peek_char, "peek-char", 0, 1, 0, err = get_codepoint (port, &c, bytes, &len); for (i = len - 1; i >= 0; i--) - scm_unget_byte (bytes[i], port); + scm_unget_byte_unlocked (bytes[i], port); SCM_COL (port) = column; SCM_LINUM (port) = line; @@ -1852,7 +1952,7 @@ SCM_DEFINE (scm_unread_char, "unread-char", 1, 1, 0, c = SCM_CHAR (cobj); - scm_ungetc (c, port); + scm_ungetc_unlocked (c, port); return cobj; } #undef FUNC_NAME @@ -1874,12 +1974,361 @@ SCM_DEFINE (scm_unread_string, "unread-string", 2, 0, 0, n = scm_i_string_length (str); while (n--) - scm_ungetc (scm_i_string_ref (str, n), port); + scm_ungetc_unlocked (scm_i_string_ref (str, n), port); return str; } #undef FUNC_NAME + + + +/* Manipulating the buffers. */ + +/* This routine does not take any locks, as it is usually called as part + of a port implementation. */ +void +scm_port_non_buffer (scm_t_port *pt) +{ + pt->read_pos = pt->read_buf = pt->read_end = &pt->shortbuf; + pt->write_buf = pt->write_pos = &pt->shortbuf; + pt->read_buf_size = pt->write_buf_size = 1; + pt->write_end = pt->write_buf + pt->write_buf_size; +} + +/* this should only be called when the read buffer is empty. it + tries to refill the read buffer. it returns the first char from + the port, which is either EOF or *(pt->read_pos). */ +int +scm_fill_input_unlocked (SCM port) +{ + scm_t_port *pt = SCM_PTAB_ENTRY (port); + + assert (pt->read_pos == pt->read_end); + + if (pt->read_buf == pt->putback_buf) + { + /* finished reading put-back chars. */ + pt->read_buf = pt->saved_read_buf; + pt->read_pos = pt->saved_read_pos; + pt->read_end = pt->saved_read_end; + pt->read_buf_size = pt->saved_read_buf_size; + if (pt->read_pos < pt->read_end) + return *(pt->read_pos); + } + return SCM_PORT_DESCRIPTOR (port)->fill_input (port); +} + +int +scm_fill_input (SCM port) +{ + int ret; + + scm_c_lock_port (port); + ret = scm_fill_input_unlocked (port); + scm_c_unlock_port (port); + + return ret; +} + +/* move up to read_len chars from port's putback and/or read buffers + into memory starting at dest. returns the number of chars moved. */ +size_t +scm_take_from_input_buffers (SCM port, char *dest, size_t read_len) +{ + scm_t_port *pt = SCM_PTAB_ENTRY (port); + size_t chars_read = 0; + size_t from_buf = min (pt->read_end - pt->read_pos, read_len); + + if (from_buf > 0) + { + memcpy (dest, pt->read_pos, from_buf); + pt->read_pos += from_buf; + chars_read += from_buf; + read_len -= from_buf; + dest += from_buf; + } + + /* if putback was active, try the real input buffer too. */ + if (pt->read_buf == pt->putback_buf) + { + from_buf = min (pt->saved_read_end - pt->saved_read_pos, read_len); + if (from_buf > 0) + { + memcpy (dest, pt->saved_read_pos, from_buf); + pt->saved_read_pos += from_buf; + chars_read += from_buf; + } + } + return chars_read; +} + +/* Clear a port's read buffers, returning the contents. */ +SCM_DEFINE (scm_drain_input, "drain-input", 1, 0, 0, + (SCM port), + "This procedure clears a port's input buffers, similar\n" + "to the way that force-output clears the output buffer. The\n" + "contents of the buffers are returned as a single string, e.g.,\n" + "\n" + "@lisp\n" + "(define p (open-input-file ...))\n" + "(drain-input p) => empty string, nothing buffered yet.\n" + "(unread-char (read-char p) p)\n" + "(drain-input p) => initial chars from p, up to the buffer size.\n" + "@end lisp\n\n" + "Draining the buffers may be useful for cleanly finishing\n" + "buffered I/O so that the file descriptor can be used directly\n" + "for further input.") +#define FUNC_NAME s_scm_drain_input +{ + SCM result; + char *data; + scm_t_port *pt; + long count; + + SCM_VALIDATE_OPINPORT (1, port); + pt = SCM_PTAB_ENTRY (port); + + count = pt->read_end - pt->read_pos; + if (pt->read_buf == pt->putback_buf) + count += pt->saved_read_end - pt->saved_read_pos; + + if (count) + { + result = scm_i_make_string (count, &data, 0); + scm_take_from_input_buffers (port, data, count); + } + else + result = scm_nullstr; + + return result; +} +#undef FUNC_NAME + +void +scm_end_input_unlocked (SCM port) +{ + long offset; + scm_t_port *pt = SCM_PTAB_ENTRY (port); + + if (pt->read_buf == pt->putback_buf) + { + offset = pt->read_end - pt->read_pos; + pt->read_buf = pt->saved_read_buf; + pt->read_pos = pt->saved_read_pos; + pt->read_end = pt->saved_read_end; + pt->read_buf_size = pt->saved_read_buf_size; + } + else + offset = 0; + + SCM_PORT_DESCRIPTOR (port)->end_input (port, offset); +} + +void +scm_end_input (SCM port) +{ + scm_c_lock_port (port); + scm_end_input_unlocked (port); + scm_c_unlock_port (port); +} + +SCM_DEFINE (scm_force_output, "force-output", 0, 1, 0, + (SCM port), + "Flush the specified output port, or the current output port if @var{port}\n" + "is omitted. The current output buffer contents are passed to the\n" + "underlying port implementation (e.g., in the case of fports, the\n" + "data will be written to the file and the output buffer will be cleared.)\n" + "It has no effect on an unbuffered port.\n\n" + "The return value is unspecified.") +#define FUNC_NAME s_scm_force_output +{ + if (SCM_UNBNDP (port)) + port = scm_current_output_port (); + else + { + port = SCM_COERCE_OUTPORT (port); + SCM_VALIDATE_OPOUTPORT (1, port); + } + scm_flush_unlocked (port); + return SCM_UNSPECIFIED; +} +#undef FUNC_NAME + +void +scm_flush_unlocked (SCM port) +{ + SCM_PORT_DESCRIPTOR (port)->flush (port); +} + +void +scm_flush (SCM port) +{ + scm_c_lock_port (port); + scm_flush_unlocked (port); + scm_c_unlock_port (port); +} + + + + +/* Output. */ + +void +scm_putc (char c, SCM port) +{ + scm_c_lock_port (port); + scm_putc_unlocked (c, port); + scm_c_unlock_port (port); +} + +void +scm_puts (const char *s, SCM port) +{ + scm_c_lock_port (port); + scm_puts_unlocked (s, port); + scm_c_unlock_port (port); +} + +/* scm_c_write + * + * Used by an application to write arbitrary number of bytes to an SCM + * port. Similar semantics as libc write. However, unlike libc + * write, scm_c_write writes the requested number of bytes and has no + * return value. + * + * Warning: Doesn't update port line and column counts! + */ +void +scm_c_write_unlocked (SCM port, const void *ptr, size_t size) +#define FUNC_NAME "scm_c_write" +{ + scm_t_port *pt; + scm_t_ptob_descriptor *ptob; + + SCM_VALIDATE_OPOUTPORT (1, port); + + pt = SCM_PTAB_ENTRY (port); + ptob = SCM_PORT_DESCRIPTOR (port); + + if (pt->rw_active == SCM_PORT_READ) + scm_end_input_unlocked (port); + + ptob->write (port, ptr, size); + + if (pt->rw_random) + pt->rw_active = SCM_PORT_WRITE; +} +#undef FUNC_NAME + +void +scm_c_write (SCM port, const void *ptr, size_t size) +{ + scm_c_lock_port (port); + scm_c_write_unlocked (port, ptr, size); + scm_c_unlock_port (port); +} + +/* scm_lfwrite + * + * This function differs from scm_c_write; it updates port line and + * column. */ +void +scm_lfwrite_unlocked (const char *ptr, size_t size, SCM port) +{ + scm_t_port *pt = SCM_PTAB_ENTRY (port); + scm_t_ptob_descriptor *ptob = SCM_PORT_DESCRIPTOR (port); + + if (pt->rw_active == SCM_PORT_READ) + scm_end_input_unlocked (port); + + ptob->write (port, ptr, size); + + for (; size; ptr++, size--) + update_port_lf ((scm_t_wchar) (unsigned char) *ptr, port); + + if (pt->rw_random) + pt->rw_active = SCM_PORT_WRITE; +} + +void +scm_lfwrite (const char *ptr, size_t size, SCM port) +{ + scm_c_lock_port (port); + scm_lfwrite_unlocked (ptr, size, port); + scm_c_unlock_port (port); +} + +/* Write STR to PORT from START inclusive to END exclusive. */ +void +scm_lfwrite_substr (SCM str, size_t start, size_t end, SCM port) +{ + scm_t_port *pt = SCM_PTAB_ENTRY (port); + + if (pt->rw_active == SCM_PORT_READ) + scm_end_input_unlocked (port); + + if (end == (size_t) -1) + end = scm_i_string_length (str); + + scm_display (scm_c_substring (str, start, end), port); + + if (pt->rw_random) + pt->rw_active = SCM_PORT_WRITE; +} + + + + +/* Querying and setting positions, and character availability. */ + +SCM_DEFINE (scm_char_ready_p, "char-ready?", 0, 1, 0, + (SCM port), + "Return @code{#t} if a character is ready on input @var{port}\n" + "and return @code{#f} otherwise. If @code{char-ready?} returns\n" + "@code{#t} then the next @code{read-char} operation on\n" + "@var{port} is guaranteed not to hang. If @var{port} is a file\n" + "port at end of file then @code{char-ready?} returns @code{#t}.\n" + "\n" + "@code{char-ready?} exists to make it possible for a\n" + "program to accept characters from interactive ports without\n" + "getting stuck waiting for input. Any input editors associated\n" + "with such ports must make sure that characters whose existence\n" + "has been asserted by @code{char-ready?} cannot be rubbed out.\n" + "If @code{char-ready?} were to return @code{#f} at end of file,\n" + "a port at end of file would be indistinguishable from an\n" + "interactive port that has no ready characters.") +#define FUNC_NAME s_scm_char_ready_p +{ + scm_t_port *pt; + + if (SCM_UNBNDP (port)) + port = scm_current_input_port (); + /* It's possible to close the current input port, so validate even in + this case. */ + SCM_VALIDATE_OPINPORT (1, port); + + pt = SCM_PTAB_ENTRY (port); + + /* if the current read buffer is filled, or the + last pushed-back char has been read and the saved buffer is + filled, result is true. */ + if (pt->read_pos < pt->read_end + || (pt->read_buf == pt->putback_buf + && pt->saved_read_pos < pt->saved_read_end)) + return SCM_BOOL_T; + else + { + scm_t_ptob_descriptor *ptob = SCM_PORT_DESCRIPTOR (port); + + if (ptob->input_waiting) + return scm_from_bool(ptob->input_waiting (port)); + else + return SCM_BOOL_T; + } +} +#undef FUNC_NAME + SCM_DEFINE (scm_seek, "seek", 3, 0, 0, (SCM fd_port, SCM offset, SCM whence), "Sets the current position of @var{fd/port} to the integer\n" @@ -1917,7 +2366,7 @@ SCM_DEFINE (scm_seek, "seek", 3, 0, 0, if (SCM_OPPORTP (fd_port)) { - scm_t_ptob_descriptor *ptob = scm_ptobs + SCM_PTOBNUM (fd_port); + scm_t_ptob_descriptor *ptob = SCM_PORT_DESCRIPTOR (fd_port); off_t_or_off64_t off = scm_to_off_t_or_off64_t (offset); off_t_or_off64_t rv; @@ -2012,12 +2461,12 @@ SCM_DEFINE (scm_truncate_file, "truncate-file", 1, 1, 0, { off_t_or_off64_t c_length = scm_to_off_t_or_off64_t (length); scm_t_port *pt = SCM_PTAB_ENTRY (object); - scm_t_ptob_descriptor *ptob = scm_ptobs + SCM_PTOBNUM (object); + scm_t_ptob_descriptor *ptob = SCM_PORT_DESCRIPTOR (object); if (!ptob->truncate) SCM_MISC_ERROR ("port is not truncatable", SCM_EOL); if (pt->rw_active == SCM_PORT_READ) - scm_end_input (object); + scm_end_input_unlocked (object); else if (pt->rw_active == SCM_PORT_WRITE) ptob->flush (object); @@ -2128,349 +2577,116 @@ SCM_DEFINE (scm_set_port_filename_x, "set-port-filename!", 2, 0, 0, } #undef FUNC_NAME -/* A fluid specifying the default encoding for newly created ports. If it is - a string, that is the encoding. If it is #f, it is in the "native" - (Latin-1) encoding. */ -SCM_VARIABLE (default_port_encoding_var, "%default-port-encoding"); - -static int scm_port_encoding_init = 0; - -/* Use ENCODING as the default encoding for future ports. */ -void -scm_i_set_default_port_encoding (const char *encoding) -{ - if (!scm_port_encoding_init - || !scm_is_fluid (SCM_VARIABLE_REF (default_port_encoding_var))) - scm_misc_error (NULL, "tried to set port encoding fluid before it is initialized", - SCM_EOL); - - if (encoding == NULL - || !strcmp (encoding, "ASCII") - || !strcmp (encoding, "ANSI_X3.4-1968") - || !strcmp (encoding, "ISO-8859-1")) - scm_fluid_set_x (SCM_VARIABLE_REF (default_port_encoding_var), SCM_BOOL_F); - else - scm_fluid_set_x (SCM_VARIABLE_REF (default_port_encoding_var), - scm_from_locale_string (encoding)); -} -/* Return the name of the default encoding for newly created ports; a - return value of NULL means "ISO-8859-1". */ -const char * -scm_i_default_port_encoding (void) -{ - if (!scm_port_encoding_init) - return NULL; - else if (!scm_is_fluid (SCM_VARIABLE_REF (default_port_encoding_var))) - return NULL; - else - { - SCM encoding; + - encoding = scm_fluid_ref (SCM_VARIABLE_REF (default_port_encoding_var)); - if (!scm_is_string (encoding)) - return NULL; - else - return scm_i_string_chars (encoding); - } -} +/* Implementation helpers for port printing functions. */ void -scm_i_set_port_encoding_x (SCM port, const char *encoding) +scm_print_port_mode (SCM exp, SCM port) { - scm_t_port *pt; - iconv_t new_input_cd, new_output_cd; - - new_input_cd = (iconv_t) -1; - new_output_cd = (iconv_t) -1; - - /* Set the character encoding for this port. */ - pt = SCM_PTAB_ENTRY (port); - - if (encoding == NULL) - encoding = "ISO-8859-1"; - - if (pt->encoding != encoding) - pt->encoding = scm_gc_strdup (encoding, "port"); - - /* If ENCODING is UTF-8, then no conversion descriptor is opened - because we do I/O ourselves. This saves 100+ KiB for each - descriptor. */ - if (strcmp (encoding, "UTF-8")) - { - if (SCM_CELL_WORD_0 (port) & SCM_RDNG) - { - /* Open an input iconv conversion descriptor, from ENCODING - to UTF-8. We choose UTF-8, not UTF-32, because iconv - implementations can typically convert from anything to - UTF-8, but not to UTF-32 (see - <http://lists.gnu.org/archive/html/bug-libunistring/2010-09/msg00007.html>). */ - new_input_cd = iconv_open ("UTF-8", encoding); - if (new_input_cd == (iconv_t) -1) - goto invalid_encoding; - } - - if (SCM_CELL_WORD_0 (port) & SCM_WRTNG) - { - new_output_cd = iconv_open (encoding, "UTF-8"); - if (new_output_cd == (iconv_t) -1) - { - if (new_input_cd != (iconv_t) -1) - iconv_close (new_input_cd); - goto invalid_encoding; - } - } - } - - if (pt->input_cd != (iconv_t) -1) - iconv_close (pt->input_cd); - if (pt->output_cd != (iconv_t) -1) - iconv_close (pt->output_cd); - - pt->input_cd = new_input_cd; - pt->output_cd = new_output_cd; - - return; - - invalid_encoding: - { - SCM err; - err = scm_from_locale_string (encoding); - scm_misc_error ("scm_i_set_port_encoding_x", - "invalid or unknown character encoding ~s", - scm_list_1 (err)); - } + scm_puts_unlocked (SCM_CLOSEDP (exp) + ? "closed: " + : (SCM_RDNG & SCM_CELL_WORD_0 (exp) + ? (SCM_WRTNG & SCM_CELL_WORD_0 (exp) + ? "input-output: " + : "input: ") + : (SCM_WRTNG & SCM_CELL_WORD_0 (exp) + ? "output: " + : "bogus: ")), + port); } -SCM_DEFINE (scm_port_encoding, "port-encoding", 1, 0, 0, - (SCM port), - "Returns, as a string, the character encoding that @var{port}\n" - "uses to interpret its input and output.\n") -#define FUNC_NAME s_scm_port_encoding +int +scm_port_print (SCM exp, SCM port, scm_print_state *pstate SCM_UNUSED) { - scm_t_port *pt; - const char *enc; - - SCM_VALIDATE_PORT (1, port); - - pt = SCM_PTAB_ENTRY (port); - enc = pt->encoding; - if (enc) - return scm_from_locale_string (pt->encoding); - else - return SCM_BOOL_F; + char *type = SCM_PTOBNAME (SCM_PTOBNUM (exp)); + if (!type) + type = "port"; + scm_puts_unlocked ("#<", port); + scm_print_port_mode (exp, port); + scm_puts_unlocked (type, port); + scm_putc_unlocked (' ', port); + scm_uintprint (SCM_CELL_WORD_1 (exp), 16, port); + scm_putc_unlocked ('>', port); + return 1; } -#undef FUNC_NAME - -SCM_DEFINE (scm_set_port_encoding_x, "set-port-encoding!", 2, 0, 0, - (SCM port, SCM enc), - "Sets the character encoding that will be used to interpret all\n" - "port I/O. New ports are created with the encoding\n" - "appropriate for the current locale if @code{setlocale} has \n" - "been called or ISO-8859-1 otherwise\n" - "and this procedure can be used to modify that encoding.\n") -#define FUNC_NAME s_scm_set_port_encoding_x -{ - char *enc_str; - SCM_VALIDATE_PORT (1, port); - SCM_VALIDATE_STRING (2, enc); - enc_str = scm_to_locale_string (enc); - scm_i_set_port_encoding_x (port, enc_str); - free (enc_str); - - return SCM_UNSPECIFIED; -} -#undef FUNC_NAME + +/* Iterating over all ports. */ -/* This determines how conversions handle unconvertible characters. */ -SCM_GLOBAL_VARIABLE (scm_conversion_strategy, "%port-conversion-strategy"); -static int scm_conversion_strategy_init = 0; +struct for_each_data +{ + void (*proc) (void *data, SCM p); + void *data; +}; -scm_t_string_failed_conversion_handler -scm_i_get_conversion_strategy (SCM port) +static SCM +for_each_trampoline (void *data, SCM port, SCM result) { - SCM encoding; + struct for_each_data *d = data; - if (scm_is_false (port)) - { - if (!scm_conversion_strategy_init - || !scm_is_fluid (SCM_VARIABLE_REF (scm_conversion_strategy))) - return SCM_FAILED_CONVERSION_QUESTION_MARK; - else - { - encoding = scm_fluid_ref (SCM_VARIABLE_REF (scm_conversion_strategy)); - if (scm_is_false (encoding)) - return SCM_FAILED_CONVERSION_QUESTION_MARK; - else - return (scm_t_string_failed_conversion_handler) scm_to_int (encoding); - } - } - else - { - scm_t_port *pt; - pt = SCM_PTAB_ENTRY (port); - return pt->ilseq_handler; - } - + d->proc (d->data, port); + + return result; } void -scm_i_set_conversion_strategy_x (SCM port, - scm_t_string_failed_conversion_handler handler) +scm_c_port_for_each (void (*proc)(void *data, SCM p), void *data) { - SCM strategy; - scm_t_port *pt; + struct for_each_data d; - strategy = scm_from_int ((int) handler); - - if (scm_is_false (port)) - { - /* Set the default encoding for future ports. */ - if (!scm_conversion_strategy_init - || !scm_is_fluid (SCM_VARIABLE_REF (scm_conversion_strategy))) - scm_misc_error (NULL, "tried to set conversion strategy fluid before it is initialized", - SCM_EOL); - scm_fluid_set_x (SCM_VARIABLE_REF (scm_conversion_strategy), strategy); - } - else - { - /* Set the character encoding for this port. */ - pt = SCM_PTAB_ENTRY (port); - pt->ilseq_handler = handler; - } + d.proc = proc; + d.data = data; + + scm_c_weak_set_fold (for_each_trampoline, &d, SCM_EOL, + scm_i_port_weak_set); } -SCM_DEFINE (scm_port_conversion_strategy, "port-conversion-strategy", - 1, 0, 0, (SCM port), - "Returns the behavior of the port when handling a character that\n" - "is not representable in the port's current encoding.\n" - "It returns the symbol @code{error} if unrepresentable characters\n" - "should cause exceptions, @code{substitute} if the port should\n" - "try to replace unrepresentable characters with question marks or\n" - "approximate characters, or @code{escape} if unrepresentable\n" - "characters should be converted to string escapes.\n" - "\n" - "If @var{port} is @code{#f}, then the current default behavior\n" - "will be returned. New ports will have this default behavior\n" - "when they are created.\n") -#define FUNC_NAME s_scm_port_conversion_strategy +static void +scm_for_each_trampoline (void *data, SCM port) { - scm_t_string_failed_conversion_handler h; - - SCM_VALIDATE_OPPORT (1, port); - - if (!scm_is_false (port)) - { - SCM_VALIDATE_OPPORT (1, port); - } - - h = scm_i_get_conversion_strategy (port); - if (h == SCM_FAILED_CONVERSION_ERROR) - return scm_from_latin1_symbol ("error"); - else if (h == SCM_FAILED_CONVERSION_QUESTION_MARK) - return scm_from_latin1_symbol ("substitute"); - else if (h == SCM_FAILED_CONVERSION_ESCAPE_SEQUENCE) - return scm_from_latin1_symbol ("escape"); - else - abort (); - - /* Never gets here. */ - return SCM_UNDEFINED; + scm_call_1 (SCM_PACK_POINTER (data), port); } -#undef FUNC_NAME -SCM_DEFINE (scm_set_port_conversion_strategy_x, "set-port-conversion-strategy!", - 2, 0, 0, - (SCM port, SCM sym), - "Sets the behavior of the interpreter when outputting a character\n" - "that is not representable in the port's current encoding.\n" - "@var{sym} can be either @code{'error}, @code{'substitute}, or\n" - "@code{'escape}. If it is @code{'error}, an error will be thrown\n" - "when an unconvertible character is encountered. If it is\n" - "@code{'substitute}, then unconvertible characters will \n" - "be replaced with approximate characters, or with question marks\n" - "if no approximately correct character is available.\n" - "If it is @code{'escape},\n" - "it will appear as a hex escape when output.\n" - "\n" - "If @var{port} is an open port, the conversion error behavior\n" - "is set for that port. If it is @code{#f}, it is set as the\n" - "default behavior for any future ports that get created in\n" - "this thread.\n") -#define FUNC_NAME s_scm_set_port_conversion_strategy_x +SCM_DEFINE (scm_port_for_each, "port-for-each", 1, 0, 0, + (SCM proc), + "Apply @var{proc} to each port in the Guile port table\n" + "in turn. The return value is unspecified. More specifically,\n" + "@var{proc} is applied exactly once to every port that exists\n" + "in the system at the time @var{port-for-each} is invoked.\n" + "Changes to the port table while @var{port-for-each} is running\n" + "have no effect as far as @var{port-for-each} is concerned.") +#define FUNC_NAME s_scm_port_for_each { - SCM err; - SCM qm; - SCM esc; - - if (!scm_is_false (port)) - { - SCM_VALIDATE_OPPORT (1, port); - } - - err = scm_from_latin1_symbol ("error"); - if (scm_is_true (scm_eqv_p (sym, err))) - { - scm_i_set_conversion_strategy_x (port, SCM_FAILED_CONVERSION_ERROR); - return SCM_UNSPECIFIED; - } - - qm = scm_from_latin1_symbol ("substitute"); - if (scm_is_true (scm_eqv_p (sym, qm))) - { - scm_i_set_conversion_strategy_x (port, - SCM_FAILED_CONVERSION_QUESTION_MARK); - return SCM_UNSPECIFIED; - } - - esc = scm_from_latin1_symbol ("escape"); - if (scm_is_true (scm_eqv_p (sym, esc))) - { - scm_i_set_conversion_strategy_x (port, - SCM_FAILED_CONVERSION_ESCAPE_SEQUENCE); - return SCM_UNSPECIFIED; - } - - SCM_MISC_ERROR ("unknown conversion behavior ~s", scm_list_1 (sym)); + SCM_VALIDATE_PROC (1, proc); + scm_c_port_for_each (scm_for_each_trampoline, SCM_UNPACK_POINTER (proc)); + return SCM_UNSPECIFIED; } #undef FUNC_NAME - - -void -scm_print_port_mode (SCM exp, SCM port) +static void +flush_output_port (void *closure, SCM port) { - scm_puts (SCM_CLOSEDP (exp) - ? "closed: " - : (SCM_RDNG & SCM_CELL_WORD_0 (exp) - ? (SCM_WRTNG & SCM_CELL_WORD_0 (exp) - ? "input-output: " - : "input: ") - : (SCM_WRTNG & SCM_CELL_WORD_0 (exp) - ? "output: " - : "bogus: ")), - port); + if (SCM_OPOUTPORTP (port)) + scm_flush_unlocked (port); } -int -scm_port_print (SCM exp, SCM port, scm_print_state *pstate SCM_UNUSED) +SCM_DEFINE (scm_flush_all_ports, "flush-all-ports", 0, 0, 0, + (), + "Equivalent to calling @code{force-output} on\n" + "all open output ports. The return value is unspecified.") +#define FUNC_NAME s_scm_flush_all_ports { - char *type = SCM_PTOBNAME (SCM_PTOBNUM (exp)); - if (!type) - type = "port"; - scm_puts ("#<", port); - scm_print_port_mode (exp, port); - scm_puts (type, port); - scm_putc (' ', port); - scm_uintprint (SCM_CELL_WORD_1 (exp), 16, port); - scm_putc ('>', port); - return 1; + scm_c_port_for_each (&flush_output_port, NULL); + return SCM_UNSPECIFIED; } +#undef FUNC_NAME + @@ -2493,18 +2709,13 @@ write_void_port (SCM port SCM_UNUSED, static SCM scm_i_void_port (long mode_bits) { - scm_i_scm_pthread_mutex_lock (&scm_i_port_table_mutex); - { - SCM answer = scm_new_port_table_entry (scm_tc16_void_port); - scm_t_port * pt = SCM_PTAB_ENTRY(answer); + SCM ret; + + ret = scm_c_make_port (scm_tc16_void_port, mode_bits, 0); - scm_port_non_buffer (pt); + scm_port_non_buffer (SCM_PTAB_ENTRY (ret)); - SCM_SETSTREAM (answer, 0); - SCM_SET_CELL_TYPE (answer, scm_tc16_void_port | mode_bits); - scm_i_pthread_mutex_unlock (&scm_i_port_table_mutex); - return answer; - } + return ret; } SCM @@ -2525,7 +2736,9 @@ SCM_DEFINE (scm_sys_make_void_port, "%make-void-port", 1, 0, 0, } #undef FUNC_NAME + + /* Initialization. */ void @@ -2544,7 +2757,7 @@ scm_init_ports () cur_errport_fluid = scm_make_fluid (); cur_loadport_fluid = scm_make_fluid (); - scm_i_port_weak_hash = scm_make_weak_key_hash_table (SCM_I_MAKINUM(31)); + scm_i_port_weak_set = scm_c_make_weak_set (31); #include "libguile/ports.x" diff --git a/libguile/ports.h b/libguile/ports.h index 6a669b660..b6db482b2 100644 --- a/libguile/ports.h +++ b/libguile/ports.h @@ -26,7 +26,12 @@ #include "libguile/__scm.h" +#include <stdio.h> +#include <string.h> #include <unistd.h> +#include "libguile/gc.h" +#include "libguile/tags.h" +#include "libguile/error.h" #include "libguile/print.h" #include "libguile/struct.h" #include "libguile/threads.h" @@ -48,6 +53,10 @@ typedef enum scm_t_port_rw_active { typedef struct { SCM port; /* Link back to the port object. */ +#if SCM_USE_PTHREAD_THREADS + scm_i_pthread_mutex_t lock; /* A recursive lock for this port. */ +#endif + int revealed; /* 0 not revealed, > 1 revealed. * Revealed ports do not get GC'd. */ @@ -118,8 +127,7 @@ typedef struct } scm_t_port; -SCM_INTERNAL scm_i_pthread_mutex_t scm_i_port_table_mutex; -SCM_INTERNAL SCM scm_i_port_weak_hash; +SCM_INTERNAL SCM scm_i_port_weak_set; #define SCM_READ_BUFFER_EMPTY_P(c_port) (c_port->read_pos >= c_port->read_end) @@ -139,22 +147,19 @@ SCM_INTERNAL SCM scm_i_port_weak_hash; #define SCM_BUF0 (8L<<16) /* Is it unbuffered? */ #define SCM_BUFLINE (64L<<16) /* Is it line-buffered? */ -#define SCM_PORTP(x) (!SCM_IMP (x) && (SCM_TYP7 (x) == scm_tc7_port)) -#define SCM_OPPORTP(x) (!SCM_IMP(x) && (((0x7f | SCM_OPN) & SCM_CELL_WORD_0(x))==(scm_tc7_port | SCM_OPN))) -#define SCM_OPINPORTP(x) (!SCM_IMP(x) && (((0x7f | SCM_OPN | SCM_RDNG) & SCM_CELL_WORD_0(x))==(scm_tc7_port | SCM_OPN | SCM_RDNG))) -#define SCM_OPOUTPORTP(x) (!SCM_IMP(x) && (((0x7f | SCM_OPN | SCM_WRTNG) & SCM_CELL_WORD_0(x))==(scm_tc7_port | SCM_OPN | SCM_WRTNG))) -#define SCM_INPUT_PORT_P(x) \ - (!SCM_IMP(x) \ - && (((0x7f | SCM_RDNG) & SCM_CELL_WORD_0(x)) == (scm_tc7_port | SCM_RDNG))) -#define SCM_OUTPUT_PORT_P(x) \ - (!SCM_IMP(x) \ - && (((0x7f | SCM_WRTNG) & SCM_CELL_WORD_0(x))==(scm_tc7_port | SCM_WRTNG))) -#define SCM_OPENP(x) (!SCM_IMP(x) && (SCM_OPN & SCM_CELL_WORD_0 (x))) -#define SCM_CLOSEDP(x) (!SCM_OPENP(x)) +#define SCM_PORTP(x) (SCM_HAS_TYP7 (x, scm_tc7_port)) +#define SCM_OPPORTP(x) (SCM_PORTP (x) && (SCM_CELL_WORD_0 (x) & SCM_OPN)) +#define SCM_INPUT_PORT_P(x) (SCM_PORTP (x) && (SCM_CELL_WORD_0 (x) & SCM_RDNG)) +#define SCM_OUTPUT_PORT_P(x) (SCM_PORTP (x) && (SCM_CELL_WORD_0 (x) & SCM_WRTNG)) +#define SCM_OPINPORTP(x) (SCM_OPPORTP (x) && SCM_INPUT_PORT_P (x)) +#define SCM_OPOUTPORTP(x) (SCM_OPPORTP (x) && SCM_OUTPUT_PORT_P (x)) +#define SCM_OPENP(x) (SCM_OPPORTP (x)) +#define SCM_CLOSEDP(x) (!SCM_OPENP (x)) #define SCM_CLR_PORT_OPEN_FLAG(p) \ SCM_SET_CELL_WORD_0 ((p), SCM_CELL_WORD_0 (p) & ~SCM_OPN) #define SCM_PTAB_ENTRY(x) ((scm_t_port *) SCM_CELL_WORD_1 (x)) +#define SCM_PORT_DESCRIPTOR(port) ((scm_t_ptob_descriptor *) SCM_CELL_WORD_2 (port)) #define SCM_SETPTAB_ENTRY(x, ent) (SCM_SET_CELL_WORD_1 ((x), (scm_t_bits) (ent))) #define SCM_STREAM(x) (SCM_PTAB_ENTRY(x)->stream) #define SCM_SETSTREAM(x, s) (SCM_PTAB_ENTRY(x)->stream = (scm_t_bits) (s)) @@ -201,19 +206,12 @@ typedef struct scm_t_ptob_descriptor #define SCM_TC2PTOBNUM(x) (0x0ff & ((x) >> 8)) #define SCM_PTOBNUM(x) (SCM_TC2PTOBNUM (SCM_CELL_TYPE (x))) /* SCM_PTOBNAME can be 0 if name is missing */ -#define SCM_PTOBNAME(ptobnum) scm_ptobs[ptobnum].name - - +#define SCM_PTOBNAME(ptobnum) (scm_c_port_type_ref (ptobnum)->name) -/* Hey you! Yes you, reading the header file! We're going to deprecate - scm_ptobs in 2.2, so please don't write any new code that uses it. - Thanks. */ -SCM_API scm_t_ptob_descriptor *scm_ptobs; -SCM_API long scm_numptob; - - - -SCM_API SCM scm_markstream (SCM ptr); +/* Port types, and their vtables. */ +SCM_INTERNAL long scm_c_num_port_types (void); +SCM_API scm_t_ptob_descriptor* scm_c_port_type_ref (long ptobnum); +SCM_API long scm_c_port_type_add_x (scm_t_ptob_descriptor *desc); SCM_API scm_t_bits scm_make_port_type (char *name, int (*fill_input) (SCM port), void (*write) (SCM port, @@ -228,11 +226,10 @@ SCM_API void scm_set_port_print (scm_t_bits tc, SCM_API void scm_set_port_equalp (scm_t_bits tc, SCM (*equalp) (SCM, SCM)); SCM_API void scm_set_port_close (scm_t_bits tc, int (*close) (SCM)); -SCM_API void scm_set_port_flush (scm_t_bits tc, - void (*flush) (SCM port)); +SCM_API void scm_set_port_flush (scm_t_bits tc, void (*flush) (SCM port)); SCM_API void scm_set_port_end_input (scm_t_bits tc, - void (*end_input) (SCM port, - int offset)); + void (*end_input) (SCM port, + int offset)); SCM_API void scm_set_port_seek (scm_t_bits tc, scm_t_off (*seek) (SCM port, scm_t_off OFFSET, @@ -241,9 +238,8 @@ SCM_API void scm_set_port_truncate (scm_t_bits tc, void (*truncate) (SCM port, scm_t_off length)); SCM_API void scm_set_port_input_waiting (scm_t_bits tc, int (*input_waiting) (SCM)); -SCM_API SCM scm_char_ready_p (SCM port); -size_t scm_take_from_input_buffers (SCM port, char *dest, size_t read_len); -SCM_API SCM scm_drain_input (SCM port); + +/* The input, output, error, and load ports. */ SCM_API SCM scm_current_input_port (void); SCM_API SCM scm_current_output_port (void); SCM_API SCM scm_current_error_port (void); @@ -254,44 +250,109 @@ SCM_API SCM scm_set_current_error_port (SCM port); SCM_API void scm_dynwind_current_input_port (SCM port); SCM_API void scm_dynwind_current_output_port (SCM port); SCM_API void scm_dynwind_current_error_port (SCM port); -SCM_API SCM scm_new_port_table_entry (scm_t_bits tag); -SCM_API void scm_grow_port_cbuf (SCM port, size_t requested); -SCM_API SCM scm_pt_size (void); -SCM_API SCM scm_pt_member (SCM member); -SCM_API void scm_port_non_buffer (scm_t_port *pt); -SCM_API int scm_revealed_count (SCM port); -SCM_API SCM scm_port_revealed (SCM port); -SCM_API SCM scm_set_port_revealed_x (SCM port, SCM rcount); +SCM_INTERNAL void scm_i_dynwind_current_load_port (SCM port); + +/* Mode bits. */ +SCM_INTERNAL long scm_i_mode_bits (SCM modes); SCM_API long scm_mode_bits (char *modes); SCM_API SCM scm_port_mode (SCM port); -SCM_API SCM scm_close_input_port (SCM port); -SCM_API SCM scm_close_output_port (SCM port); -SCM_API SCM scm_close_port (SCM port); -SCM_API SCM scm_port_for_each (SCM proc); -SCM_API void scm_c_port_for_each (void (*proc)(void *data, SCM p), void *data); + +/* Low-level constructors. */ +SCM_API SCM +scm_c_make_port_with_encoding (scm_t_bits tag, + unsigned long mode_bits, + const char *encoding, + scm_t_string_failed_conversion_handler handler, + scm_t_bits stream); +SCM_API SCM scm_c_make_port (scm_t_bits tag, unsigned long mode_bits, + scm_t_bits stream); +SCM_API SCM scm_new_port_table_entry (scm_t_bits tag); + +/* Predicates. */ +SCM_API SCM scm_port_p (SCM x); SCM_API SCM scm_input_port_p (SCM x); SCM_API SCM scm_output_port_p (SCM x); -SCM_API SCM scm_port_p (SCM x); SCM_API SCM scm_port_closed_p (SCM port); SCM_API SCM scm_eof_object_p (SCM x); -SCM_API SCM scm_force_output (SCM port); -SCM_API SCM scm_flush_all_ports (void); -SCM_API SCM scm_read_char (SCM port); -SCM_API scm_t_wchar scm_getc (SCM port); + +/* Closing ports. */ +SCM_API SCM scm_close_port (SCM port); +SCM_API SCM scm_close_input_port (SCM port); +SCM_API SCM scm_close_output_port (SCM port); + +/* Encoding characters to byte streams, and decoding byte streams to + characters. */ +SCM_INTERNAL const char *scm_i_default_port_encoding (void); +SCM_INTERNAL void scm_i_set_default_port_encoding (const char *); +SCM_INTERNAL void scm_i_set_port_encoding_x (SCM port, const char *str); +SCM_API SCM scm_port_encoding (SCM port); +SCM_API SCM scm_set_port_encoding_x (SCM port, SCM encoding); +SCM_INTERNAL scm_t_string_failed_conversion_handler scm_i_get_conversion_strategy (SCM port); +SCM_INTERNAL void scm_i_set_conversion_strategy_x (SCM port, + scm_t_string_failed_conversion_handler h); +SCM_API SCM scm_port_conversion_strategy (SCM port); +SCM_API SCM scm_set_port_conversion_strategy_x (SCM port, SCM behavior); + +/* Acquiring and releasing the port lock. */ +SCM_API void scm_dynwind_lock_port (SCM port); +SCM_INLINE int scm_c_lock_port (SCM port); +SCM_INLINE int scm_c_try_lock_port (SCM port); +SCM_INLINE int scm_c_unlock_port (SCM port); + +/* Revealed counts. */ +SCM_API int scm_revealed_count (SCM port); +SCM_API SCM scm_port_revealed (SCM port); +SCM_API SCM scm_set_port_revealed_x (SCM port, SCM rcount); +SCM_API SCM scm_adjust_port_revealed_x (SCM port, SCM addend); + +/* Input. */ +SCM_API int scm_get_byte_or_eof (SCM port); +SCM_INLINE int scm_get_byte_or_eof_unlocked (SCM port); +SCM_API int scm_peek_byte_or_eof (SCM port); +SCM_INLINE int scm_peek_byte_or_eof_unlocked (SCM port); SCM_API size_t scm_c_read (SCM port, void *buffer, size_t size); -SCM_API void scm_c_write (SCM port, const void *buffer, size_t size); -SCM_API void scm_lfwrite (const char *ptr, size_t size, SCM port); -SCM_INTERNAL void scm_lfwrite_substr (SCM str, size_t start, size_t end, - SCM port); -SCM_API void scm_flush (SCM port); -SCM_API void scm_end_input (SCM port); -SCM_API int scm_fill_input (SCM port); +SCM_API size_t scm_c_read_unlocked (SCM port, void *buffer, size_t size); +SCM_API scm_t_wchar scm_getc (SCM port); +SCM_API scm_t_wchar scm_getc_unlocked (SCM port); +SCM_API SCM scm_read_char (SCM port); + +/* Pushback. */ SCM_INTERNAL void scm_unget_byte (int c, SCM port); +SCM_INTERNAL void scm_unget_byte_unlocked (int c, SCM port); SCM_API void scm_ungetc (scm_t_wchar c, SCM port); +SCM_API void scm_ungetc_unlocked (scm_t_wchar c, SCM port); SCM_API void scm_ungets (const char *s, int n, SCM port); +SCM_API void scm_ungets_unlocked (const char *s, int n, SCM port); SCM_API SCM scm_peek_char (SCM port); SCM_API SCM scm_unread_char (SCM cobj, SCM port); SCM_API SCM scm_unread_string (SCM str, SCM port); + +/* Manipulating the buffers. */ +SCM_API void scm_port_non_buffer (scm_t_port *pt); +SCM_API int scm_fill_input (SCM port); +SCM_API int scm_fill_input_unlocked (SCM port); +SCM_INTERNAL size_t scm_take_from_input_buffers (SCM port, char *dest, size_t read_len); +SCM_API SCM scm_drain_input (SCM port); +SCM_API void scm_end_input (SCM port); +SCM_API void scm_end_input_unlocked (SCM port); +SCM_API SCM scm_force_output (SCM port); +SCM_API void scm_flush (SCM port); +SCM_API void scm_flush_unlocked (SCM port); + +/* Output. */ +SCM_API void scm_putc (char c, SCM port); +SCM_INLINE void scm_putc_unlocked (char c, SCM port); +SCM_API void scm_puts (const char *str_data, SCM port); +SCM_INLINE void scm_puts_unlocked (const char *str_data, SCM port); +SCM_API void scm_c_write (SCM port, const void *buffer, size_t size); +SCM_API void scm_c_write_unlocked (SCM port, const void *buffer, size_t size); +SCM_API void scm_lfwrite (const char *ptr, size_t size, SCM port); +SCM_API void scm_lfwrite_unlocked (const char *ptr, size_t size, SCM port); +SCM_INTERNAL void scm_lfwrite_substr (SCM str, size_t start, size_t end, + SCM port); + +/* Querying and setting positions, and character availability. */ +SCM_API SCM scm_char_ready_p (SCM port); SCM_API SCM scm_seek (SCM object, SCM offset, SCM whence); SCM_API SCM scm_truncate_file (SCM object, SCM length); SCM_API SCM scm_port_line (SCM port); @@ -300,36 +361,120 @@ SCM_API SCM scm_port_column (SCM port); SCM_API SCM scm_set_port_column_x (SCM port, SCM line); SCM_API SCM scm_port_filename (SCM port); SCM_API SCM scm_set_port_filename_x (SCM port, SCM filename); -SCM_INTERNAL const char *scm_i_default_port_encoding (void); -SCM_INTERNAL void scm_i_set_default_port_encoding (const char *); -SCM_INTERNAL void scm_i_set_port_encoding_x (SCM port, const char *str); -SCM_API SCM scm_port_encoding (SCM port); -SCM_API SCM scm_set_port_encoding_x (SCM port, SCM encoding); -SCM_INTERNAL scm_t_string_failed_conversion_handler scm_i_get_conversion_strategy (SCM port); -SCM_INTERNAL void scm_i_set_conversion_strategy_x (SCM port, - scm_t_string_failed_conversion_handler h); -SCM_API SCM scm_port_conversion_strategy (SCM port); -SCM_API SCM scm_set_port_conversion_strategy_x (SCM port, SCM behavior); + +/* Implementation helpers for port printing functions. */ SCM_API int scm_port_print (SCM exp, SCM port, scm_print_state *); SCM_API void scm_print_port_mode (SCM exp, SCM port); + +/* Iterating over all ports. */ +SCM_API SCM scm_port_for_each (SCM proc); +SCM_API void scm_c_port_for_each (void (*proc)(void *data, SCM p), void *data); +SCM_API SCM scm_flush_all_ports (void); + +/* Void ports. */ SCM_API SCM scm_void_port (char * mode_str); SCM_API SCM scm_sys_make_void_port (SCM mode); + +/* Initialization. */ SCM_INTERNAL void scm_init_ports (void); -#if SCM_ENABLE_DEPRECATED==1 -SCM_DEPRECATED scm_t_port * scm_add_to_port_table (SCM port); + +/* Inline function implementations. */ + +#if SCM_CAN_INLINE || defined SCM_INLINE_C_IMPLEMENTING_INLINES +SCM_INLINE_IMPLEMENTATION int +scm_c_lock_port (SCM port) +{ +#if 0 && SCM_USE_PTHREAD_THREADS + return scm_i_pthread_mutex_lock (&SCM_PTAB_ENTRY (port)->lock); +#else + return 0; #endif +} -#ifdef GUILE_DEBUG -SCM_API SCM scm_pt_size (void); -SCM_API SCM scm_pt_member (SCM member); -#endif /* GUILE_DEBUG */ +SCM_INLINE_IMPLEMENTATION int +scm_c_try_lock_port (SCM port) +{ +#if 0 && SCM_USE_PTHREAD_THREADS + return scm_i_pthread_mutex_trylock (&SCM_PTAB_ENTRY (port)->lock); +#else + return 0; +#endif +} -/* internal */ +SCM_INLINE_IMPLEMENTATION int +scm_c_unlock_port (SCM port) +{ +#if 0 && SCM_USE_PTHREAD_THREADS + return scm_i_pthread_mutex_unlock (&SCM_PTAB_ENTRY (port)->lock); +#else + return 0; +#endif +} -SCM_INTERNAL long scm_i_mode_bits (SCM modes); -SCM_INTERNAL void scm_i_dynwind_current_load_port (SCM port); +SCM_INLINE_IMPLEMENTATION int +scm_get_byte_or_eof_unlocked (SCM port) +{ + int c; + scm_t_port *pt = SCM_PTAB_ENTRY (port); + + if (pt->rw_active == SCM_PORT_WRITE) + /* may be marginally faster than calling scm_flush. */ + SCM_PORT_DESCRIPTOR (port)->flush (port); + if (pt->rw_random) + pt->rw_active = SCM_PORT_READ; + + if (pt->read_pos >= pt->read_end) + { + if (SCM_UNLIKELY (scm_fill_input_unlocked (port) == EOF)) + return EOF; + } + + c = *(pt->read_pos++); + + return c; +} + +/* Like `scm_get_byte_or_eof' but does not change PORT's `read_pos'. */ +SCM_INLINE_IMPLEMENTATION int +scm_peek_byte_or_eof_unlocked (SCM port) +{ + int c; + scm_t_port *pt = SCM_PTAB_ENTRY (port); + + if (pt->rw_active == SCM_PORT_WRITE) + /* may be marginally faster than calling scm_flush. */ + SCM_PORT_DESCRIPTOR (port)->flush (port); + + if (pt->rw_random) + pt->rw_active = SCM_PORT_READ; + + if (pt->read_pos >= pt->read_end) + { + if (SCM_UNLIKELY (scm_fill_input_unlocked (port) == EOF)) + return EOF; + } + + c = *pt->read_pos; + + return c; +} + +SCM_INLINE_IMPLEMENTATION void +scm_putc_unlocked (char c, SCM port) +{ + SCM_ASSERT_TYPE (SCM_OPOUTPORTP (port), port, 0, NULL, "output port"); + scm_lfwrite_unlocked (&c, 1, port); +} + +SCM_INLINE_IMPLEMENTATION void +scm_puts_unlocked (const char *s, SCM port) +{ + SCM_ASSERT_TYPE (SCM_OPOUTPORTP (port), port, 0, NULL, "output port"); + scm_lfwrite_unlocked (s, strlen (s), port); +} +#endif /* SCM_CAN_INLINE || defined SCM_INLINE_C_IMPLEMENTING_INLINES */ #endif /* SCM_PORTS_H */ diff --git a/libguile/print.c b/libguile/print.c index 4afd12c92..030ea6908 100644 --- a/libguile/print.c +++ b/libguile/print.c @@ -40,7 +40,6 @@ #include "libguile/macros.h" #include "libguile/procprop.h" #include "libguile/read.h" -#include "libguile/weaks.h" #include "libguile/programs.h" #include "libguile/alist.h" #include "libguile/struct.h" @@ -157,7 +156,7 @@ do \ { \ if (pstate->top - pstate->list_offset >= pstate->level) \ { \ - scm_putc ('#', port); \ + scm_putc_unlocked ('#', port); \ return; \ } \ } \ @@ -301,9 +300,9 @@ print_circref (SCM port, scm_print_state *pstate, SCM ref) for (i = pstate->top - 1; 1; --i) if (scm_is_eq (PSTATE_STACK_REF(pstate, i), ref)) break; - scm_putc ('#', port); + scm_putc_unlocked ('#', port); scm_intprint (i - self, 10, port); - scm_putc ('#', port); + scm_putc_unlocked ('#', port); } /* Print the name of a symbol. */ @@ -394,7 +393,7 @@ print_extended_symbol (SCM sym, SCM port) len = scm_i_symbol_length (sym); strategy = scm_i_get_conversion_strategy (port); - scm_lfwrite ("#{", 2, port); + scm_lfwrite_unlocked ("#{", 2, port); for (pos = 0; pos < len; pos++) { @@ -417,7 +416,7 @@ print_extended_symbol (SCM sym, SCM port) } } - scm_lfwrite ("}#", 2, port); + scm_lfwrite_unlocked ("}#", 2, port); } /* FIXME: allow R6RS hex escapes instead of #{...}#. */ @@ -433,7 +432,7 @@ scm_i_print_symbol_name (SCM sym, SCM port) void scm_print_symbol_name (const char *str, size_t len, SCM port) { - SCM symbol = scm_from_locale_symboln (str, len); + SCM symbol = scm_from_utf8_symboln (str, len); scm_i_print_symbol_name (symbol, port); } @@ -453,7 +452,7 @@ static void iprin1 (SCM exp, SCM port, scm_print_state *pstate); scm_intprint (i, 8, port); \ else \ { \ - scm_puts ("x", port); \ + scm_puts_unlocked ("x", port); \ scm_intprint (i, 16, port); \ } \ } \ @@ -508,7 +507,7 @@ iprin1 (SCM exp, SCM port, scm_print_state *pstate) else if (SCM_IFLAGP (exp) && ((size_t) SCM_IFLAGNUM (exp) < (sizeof iflagnames / sizeof (char *)))) { - scm_puts (iflagnames [SCM_IFLAGNUM (exp)], port); + scm_puts_unlocked (iflagnames [SCM_IFLAGNUM (exp)], port); } else { @@ -529,7 +528,7 @@ iprin1 (SCM exp, SCM port, scm_print_state *pstate) goto print_struct; pwps = scm_i_port_with_print_state (port, pstate->handle); pstate->revealed = 1; - scm_call_generic_2 (print, exp, pwps); + scm_call_2 (print, exp, pwps); } else { @@ -602,11 +601,11 @@ iprin1 (SCM exp, SCM port, scm_print_state *pstate) } else { - scm_puts ("#<uninterned-symbol ", port); + scm_puts_unlocked ("#<uninterned-symbol ", port); scm_i_print_symbol_name (exp, port); - scm_putc (' ', port); + scm_putc_unlocked (' ', port); scm_uintprint (SCM_UNPACK (exp), 16, port); - scm_putc ('>', port); + scm_putc_unlocked ('>', port); } break; case scm_tc7_variable: @@ -621,6 +620,12 @@ iprin1 (SCM exp, SCM port, scm_print_state *pstate) case scm_tc7_hashtable: scm_i_hashtable_print (exp, port, pstate); break; + case scm_tc7_weak_set: + scm_i_weak_set_print (exp, port, pstate); + break; + case scm_tc7_weak_table: + scm_i_weak_table_print (exp, port, pstate); + break; case scm_tc7_fluid: scm_i_fluid_print (exp, port, pstate); break; @@ -647,10 +652,7 @@ iprin1 (SCM exp, SCM port, scm_print_state *pstate) break; case scm_tc7_wvect: ENTER_NESTED_DATA (pstate, exp, circref); - if (SCM_IS_WHVEC (exp)) - scm_puts ("#wh(", port); - else - scm_puts ("#w(", port); + scm_puts_unlocked ("#w(", port); goto common_vector_printer; case scm_tc7_bytevector: @@ -658,7 +660,7 @@ iprin1 (SCM exp, SCM port, scm_print_state *pstate) break; case scm_tc7_vector: ENTER_NESTED_DATA (pstate, exp, circref); - scm_puts ("#(", port); + scm_puts_unlocked ("#(", port); common_vector_printer: { register long i; @@ -670,43 +672,26 @@ iprin1 (SCM exp, SCM port, scm_print_state *pstate) last = pstate->length - 1; cutp = 1; } - if (SCM_I_WVECTP (exp)) - { - /* Elements of weak vectors may not be accessed via the - `SIMPLE_VECTOR_REF ()' macro. */ - for (i = 0; i < last; ++i) - { - scm_iprin1 (scm_c_vector_ref (exp, i), - port, pstate); - scm_putc (' ', port); - } - } - else - { - for (i = 0; i < last; ++i) - { - scm_iprin1 (SCM_SIMPLE_VECTOR_REF (exp, i), port, pstate); - scm_putc (' ', port); - } - } - + for (i = 0; i < last; ++i) + { + scm_iprin1 (scm_c_vector_ref (exp, i), port, pstate); + scm_putc_unlocked (' ', port); + } if (i == last) { /* CHECK_INTS; */ scm_iprin1 (scm_c_vector_ref (exp, i), port, pstate); } if (cutp) - scm_puts (" ...", port); - scm_putc (')', port); + scm_puts_unlocked (" ...", port); + scm_putc_unlocked (')', port); } EXIT_NESTED_DATA (pstate); break; case scm_tc7_port: { - register long i = SCM_PTOBNUM (exp); - if (i < scm_numptob - && scm_ptobs[i].print - && (scm_ptobs[i].print) (exp, port, pstate)) + scm_t_ptob_descriptor *ptob = SCM_PORT_DESCRIPTOR (exp); + if (ptob->print && ptob->print (exp, port, pstate)) break; goto punk; } @@ -851,7 +836,7 @@ display_string_as_utf8 (const void *str, int narrow_p, size_t len, /* INPUT was successfully converted, entirely; print the result. */ - scm_lfwrite (utf8_buf, utf8_len, port); + scm_lfwrite_unlocked (utf8_buf, utf8_len, port); printed += i - printed; } @@ -912,7 +897,7 @@ display_string_using_iconv (const void *str, int narrow_p, size_t len, iconv (pt->output_cd, NULL, NULL, NULL, NULL); /* Print the OUTPUT_LEN bytes successfully converted. */ - scm_lfwrite (encoded_output, output_len, port); + scm_lfwrite_unlocked (encoded_output, output_len, port); /* See how many input codepoints these OUTPUT_LEN bytes corresponds to. */ @@ -947,7 +932,7 @@ display_string_using_iconv (const void *str, int narrow_p, size_t len, { /* INPUT was successfully converted, entirely; print the result. */ - scm_lfwrite (encoded_output, output_len, port); + scm_lfwrite_unlocked (encoded_output, output_len, port); codepoints_read = i - printed; printed += codepoints_read; } @@ -1027,7 +1012,7 @@ write_character_escaped (scm_t_wchar ch, int string_escapes_p, SCM port) /* Use special escapes for some C0 controls. */ buf[0] = '\\'; buf[1] = escapes[ch - 0x07]; - scm_lfwrite (buf, 2, port); + scm_lfwrite_unlocked (buf, 2, port); } else if (!SCM_R6RS_ESCAPES_P) { @@ -1037,7 +1022,7 @@ write_character_escaped (scm_t_wchar ch, int string_escapes_p, SCM port) buf[1] = 'x'; buf[2] = hex[ch / 16]; buf[3] = hex[ch % 16]; - scm_lfwrite (buf, 4, port); + scm_lfwrite_unlocked (buf, 4, port); } else if (ch <= 0xFFFF) { @@ -1047,7 +1032,7 @@ write_character_escaped (scm_t_wchar ch, int string_escapes_p, SCM port) buf[3] = hex[(ch & 0xF00) >> 8]; buf[4] = hex[(ch & 0xF0) >> 4]; buf[5] = hex[(ch & 0xF)]; - scm_lfwrite (buf, 6, port); + scm_lfwrite_unlocked (buf, 6, port); } else if (ch > 0xFFFF) { @@ -1059,7 +1044,7 @@ write_character_escaped (scm_t_wchar ch, int string_escapes_p, SCM port) buf[5] = hex[(ch & 0xF00) >> 8]; buf[6] = hex[(ch & 0xF0) >> 4]; buf[7] = hex[(ch & 0xF)]; - scm_lfwrite (buf, 8, port); + scm_lfwrite_unlocked (buf, 8, port); } } else @@ -1082,7 +1067,7 @@ write_character_escaped (scm_t_wchar ch, int string_escapes_p, SCM port) buf[i] = 'x'; i --; buf[i] = '\\'; - scm_lfwrite (buf + i, 9 - i, port); + scm_lfwrite_unlocked (buf + i, 9 - i, port); } } else @@ -1092,7 +1077,7 @@ write_character_escaped (scm_t_wchar ch, int string_escapes_p, SCM port) name = scm_i_charname (SCM_MAKE_CHAR (ch)); if (name != NULL) - scm_puts (name, port); + scm_puts_unlocked (name, port); else PRINT_CHAR_ESCAPE (ch, port); } @@ -1157,14 +1142,14 @@ void scm_intprint (scm_t_intmax n, int radix, SCM port) { char num_buf[SCM_INTBUFLEN]; - scm_lfwrite (num_buf, scm_iint2str (n, radix, num_buf), port); + scm_lfwrite_unlocked (num_buf, scm_iint2str (n, radix, num_buf), port); } void scm_uintprint (scm_t_uintmax n, int radix, SCM port) { char num_buf[SCM_INTBUFLEN]; - scm_lfwrite (num_buf, scm_iuint2str (n, radix, num_buf), port); + scm_lfwrite_unlocked (num_buf, scm_iuint2str (n, radix, num_buf), port); } /* Print an object of unrecognized type. @@ -1173,19 +1158,19 @@ scm_uintprint (scm_t_uintmax n, int radix, SCM port) void scm_ipruk (char *hdr, SCM ptr, SCM port) { - scm_puts ("#<unknown-", port); - scm_puts (hdr, port); + scm_puts_unlocked ("#<unknown-", port); + scm_puts_unlocked (hdr, port); if (1) /* (scm_in_heap_p (ptr)) */ /* FIXME */ { - scm_puts (" (0x", port); + scm_puts_unlocked (" (0x", port); scm_uintprint (SCM_CELL_WORD_0 (ptr), 16, port); - scm_puts (" . 0x", port); + scm_puts_unlocked (" . 0x", port); scm_uintprint (SCM_CELL_WORD_1 (ptr), 16, port); - scm_puts (") @", port); + scm_puts_unlocked (") @", port); } - scm_puts (" 0x", port); + scm_puts_unlocked (" 0x", port); scm_uintprint (SCM_UNPACK (ptr), 16, port); - scm_putc ('>', port); + scm_putc_unlocked ('>', port); } @@ -1196,7 +1181,7 @@ scm_iprlist (char *hdr, SCM exp, int tlr, SCM port, scm_print_state *pstate) { register SCM hare, tortoise; long floor = pstate->top - 2; - scm_puts (hdr, port); + scm_puts_unlocked (hdr, port); /* CHECK_INTS; */ if (pstate->fancyp) goto fancy_printing; @@ -1226,18 +1211,18 @@ scm_iprlist (char *hdr, SCM exp, int tlr, SCM port, scm_print_state *pstate) if (scm_is_eq (PSTATE_STACK_REF(pstate, i), exp)) goto circref; PUSH_REF (pstate, exp); - scm_putc (' ', port); + scm_putc_unlocked (' ', port); /* CHECK_INTS; */ scm_iprin1 (SCM_CAR (exp), port, pstate); } if (!SCM_NULL_OR_NIL_P (exp)) { - scm_puts (" . ", port); + scm_puts_unlocked (" . ", port); scm_iprin1 (exp, port, pstate); } end: - scm_putc (tlr, port); + scm_putc_unlocked (tlr, port); pstate->top = floor + 2; return; @@ -1258,7 +1243,7 @@ fancy_printing: { if (n == 0) { - scm_puts (" ...", port); + scm_puts_unlocked (" ...", port); goto skip_tail; } else @@ -1266,14 +1251,14 @@ fancy_printing: } PUSH_REF(pstate, exp); ++pstate->list_offset; - scm_putc (' ', port); + scm_putc_unlocked (' ', port); /* CHECK_INTS; */ scm_iprin1 (SCM_CAR (exp), port, pstate); } } if (!SCM_NULL_OR_NIL_P (exp)) { - scm_puts (" . ", port); + scm_puts_unlocked (" . ", port); scm_iprin1 (exp, port, pstate); } skip_tail: @@ -1284,7 +1269,7 @@ fancy_circref: pstate->list_offset -= pstate->top - floor - 2; circref: - scm_puts (" . ", port); + scm_puts_unlocked (" . ", port); print_circref (port, pstate, exp); goto end; } @@ -1309,7 +1294,11 @@ scm_write (SCM obj, SCM port) SCM_ASSERT (scm_valid_oport_value_p (port), port, SCM_ARG2, s_write); + scm_dynwind_begin (0); + scm_dynwind_lock_port (port); scm_prin1 (obj, port, 1); + scm_dynwind_end (); + return SCM_UNSPECIFIED; } @@ -1324,7 +1313,11 @@ scm_display (SCM obj, SCM port) SCM_ASSERT (scm_valid_oport_value_p (port), port, SCM_ARG2, s_display); + scm_dynwind_begin (0); + scm_dynwind_lock_port (port); scm_prin1 (obj, port, 0); + scm_dynwind_end (); + return SCM_UNSPECIFIED; } @@ -1437,7 +1430,7 @@ SCM_DEFINE (scm_newline, "newline", 0, 1, 0, SCM_VALIDATE_OPORT_VALUE (1, port); - scm_putc ('\n', SCM_COERCE_OUTPORT (port)); + scm_putc_unlocked ('\n', SCM_COERCE_OUTPORT (port)); return SCM_UNSPECIFIED; } #undef FUNC_NAME @@ -1482,7 +1475,7 @@ static int port_with_ps_print (SCM obj, SCM port, scm_print_state *pstate) { obj = SCM_PORT_WITH_PS_PORT (obj); - return scm_ptobs[SCM_PTOBNUM (obj)].print (obj, port, pstate); + return SCM_PORT_DESCRIPTOR (obj)->print (obj, port, pstate); } SCM @@ -1527,7 +1520,7 @@ SCM_DEFINE (scm_get_print_state, "get-print-state", 1, 0, 0, void scm_init_print () { - SCM vtable, layout, type; + SCM type; scm_init_opts (scm_print_options, scm_print_opts); @@ -1536,12 +1529,8 @@ scm_init_print () scm_from_latin1_symbol ("highlight-suffix"), scm_from_locale_string ("}"))); - scm_gc_register_root (&print_state_pool); - scm_gc_register_root (&scm_print_state_vtable); - vtable = scm_make_vtable_vtable (scm_nullstr, SCM_INUM0, SCM_EOL); - layout = - scm_make_struct_layout (scm_from_locale_string (SCM_PRINT_STATE_LAYOUT)); - type = scm_make_struct (vtable, SCM_INUM0, scm_list_1 (layout)); + type = scm_make_vtable (scm_from_locale_string (SCM_PRINT_STATE_LAYOUT), + SCM_BOOL_F); scm_set_struct_vtable_name_x (type, scm_from_latin1_symbol ("print-state")); scm_print_state_vtable = type; diff --git a/libguile/private-gc.h b/libguile/private-gc.h index 42514c1e2..4c691dd0b 100644 --- a/libguile/private-gc.h +++ b/libguile/private-gc.h @@ -1,7 +1,7 @@ /* * private-gc.h - private declarations for garbage collection. * - * Copyright (C) 2002, 03, 04, 05, 06, 07, 08, 09 Free Software Foundation, Inc. + * Copyright (C) 2002, 03, 04, 05, 06, 07, 08, 09, 11 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -49,18 +49,6 @@ typedef enum { return_on_error, abort_on_error } policy_on_error; #define SCM_MAX(A, B) ((A) > (B) ? (A) : (B)) #define SCM_MIN(A, B) ((A) < (B) ? (A) : (B)) -/* CELL_P checks a random word whether it has the right form for a - pointer to a cell. Use scm_i_find_heap_segment_containing_object - to find out whether it actually points to a real cell. - - The right form for a cell pointer is this: the low three bits must - be scm_tc3_cons, and when the scm_tc3_cons tag is stripped, the - resulting pointer must be correctly aligned. - scm_i_initialize_heap_segment_data guarantees that the test below - works. -*/ -#define CELL_P(x) ((SCM_UNPACK(x) & (sizeof(scm_t_cell)-1)) == scm_tc3_cons) - SCM_INTERNAL char const *scm_i_tag_name (scm_t_bits tag); /* MOVEME */ #endif diff --git a/libguile/procprop.c b/libguile/procprop.c index 8e2cd6a5f..93ee7f033 100644 --- a/libguile/procprop.c +++ b/libguile/procprop.c @@ -22,20 +22,16 @@ # include <config.h> #endif -#define SCM_BUILDING_DEPRECATED_CODE - #include "libguile/_scm.h" #include "libguile/alist.h" -#include "libguile/deprecation.h" -#include "libguile/deprecated.h" #include "libguile/eval.h" #include "libguile/procs.h" #include "libguile/gsubr.h" #include "libguile/smob.h" #include "libguile/root.h" #include "libguile/vectors.h" -#include "libguile/hashtab.h" +#include "libguile/weak-table.h" #include "libguile/programs.h" #include "libguile/validate.h" @@ -43,13 +39,9 @@ SCM_GLOBAL_SYMBOL (scm_sym_system_procedure, "system-procedure"); -#if (SCM_ENABLE_DEPRECATED == 1) -SCM_GLOBAL_SYMBOL (scm_sym_arity, "arity"); -#endif SCM_GLOBAL_SYMBOL (scm_sym_name, "name"); static SCM overrides; -static scm_i_pthread_mutex_t overrides_lock = SCM_I_PTHREAD_MUTEX_INITIALIZER; static SCM arity_overrides; @@ -58,9 +50,7 @@ scm_i_procedure_arity (SCM proc, int *req, int *opt, int *rest) { SCM o; - scm_i_pthread_mutex_lock (&overrides_lock); - o = scm_hashq_ref (arity_overrides, proc, SCM_BOOL_F); - scm_i_pthread_mutex_unlock (&overrides_lock); + o = scm_weak_table_refq (arity_overrides, proc, SCM_BOOL_F); if (scm_is_true (o)) { @@ -72,23 +62,20 @@ scm_i_procedure_arity (SCM proc, int *req, int *opt, int *rest) while (!SCM_PROGRAM_P (proc)) { - if (SCM_IMP (proc)) - return 0; - switch (SCM_TYP7 (proc)) + if (SCM_STRUCTP (proc)) { - case scm_tc7_smob: - if (!SCM_SMOB_APPLICABLE_P (proc)) - return 0; - proc = scm_i_smob_apply_trampoline (proc); - break; - case scm_tcs_struct: if (!SCM_STRUCT_APPLICABLE_P (proc)) return 0; proc = SCM_STRUCT_PROCEDURE (proc); - break; - default: - return 0; } + else if (SCM_HAS_TYP7 (proc, scm_tc7_smob)) + { + if (!SCM_SMOB_APPLICABLE_P (proc)) + return 0; + proc = scm_i_smob_apply_trampoline (proc); + } + else + return 0; } return scm_i_program_arity (proc, req, opt, rest); @@ -106,9 +93,7 @@ SCM_DEFINE (scm_set_procedure_minimum_arity_x, "set-procedure-minimum-arity!", SCM_VALIDATE_INT_COPY (3, opt, t); SCM_VALIDATE_BOOL (4, rest); - scm_i_pthread_mutex_lock (&overrides_lock); - scm_hashq_set_x (arity_overrides, proc, scm_list_3 (req, opt, rest)); - scm_i_pthread_mutex_unlock (&overrides_lock); + scm_weak_table_putq_x (arity_overrides, proc, scm_list_3 (req, opt, rest)); return SCM_UNDEFINED; } #undef FUNC_NAME @@ -147,9 +132,7 @@ SCM_DEFINE (scm_procedure_properties, "procedure-properties", 1, 0, 0, SCM_VALIDATE_PROC (1, proc); - scm_i_pthread_mutex_lock (&overrides_lock); - ret = scm_hashq_ref (overrides, proc, SCM_BOOL_F); - scm_i_pthread_mutex_unlock (&overrides_lock); + ret = scm_weak_table_refq (overrides, proc, SCM_BOOL_F); if (scm_is_false (ret)) { @@ -159,10 +142,6 @@ SCM_DEFINE (scm_procedure_properties, "procedure-properties", 1, 0, 0, ret = SCM_EOL; } -#if (SCM_ENABLE_DEPRECATED == 1) - ret = scm_acons (scm_sym_arity, scm_procedure_minimum_arity (proc), ret); -#endif - return ret; } #undef FUNC_NAME @@ -174,14 +153,7 @@ SCM_DEFINE (scm_set_procedure_properties_x, "set-procedure-properties!", 2, 0, 0 { SCM_VALIDATE_PROC (1, proc); -#if (SCM_ENABLE_DEPRECATED == 1) - if (scm_assq (alist, scm_sym_arity)) - SCM_MISC_ERROR ("arity is a read-only property", SCM_EOL); -#endif - - scm_i_pthread_mutex_lock (&overrides_lock); - scm_hashq_set_x (overrides, proc, alist); - scm_i_pthread_mutex_unlock (&overrides_lock); + scm_weak_table_putq_x (overrides, proc, alist); return SCM_UNSPECIFIED; } @@ -194,13 +166,6 @@ SCM_DEFINE (scm_procedure_property, "procedure-property", 2, 0, 0, { SCM_VALIDATE_PROC (1, proc); -#if (SCM_ENABLE_DEPRECATED == 1) - if (scm_is_eq (key, scm_sym_arity)) - scm_c_issue_deprecation_warning - ("Accessing a procedure's arity via `procedure-property' is deprecated.\n" - "Use `procedure-minimum-arity instead."); -#endif - return scm_assq_ref (scm_procedure_properties (proc), key); } #undef FUNC_NAME @@ -215,13 +180,8 @@ SCM_DEFINE (scm_set_procedure_property_x, "set-procedure-property!", 3, 0, 0, SCM_VALIDATE_PROC (1, proc); -#if (SCM_ENABLE_DEPRECATED == 1) - if (scm_is_eq (key, scm_sym_arity)) - SCM_MISC_ERROR ("arity is a deprecated read-only property", SCM_EOL); -#endif - - scm_i_pthread_mutex_lock (&overrides_lock); - props = scm_hashq_ref (overrides, proc, SCM_BOOL_F); + scm_i_pthread_mutex_lock (&scm_i_misc_mutex); + props = scm_weak_table_refq (overrides, proc, SCM_BOOL_F); if (scm_is_false (props)) { if (SCM_PROGRAM_P (proc)) @@ -229,8 +189,8 @@ SCM_DEFINE (scm_set_procedure_property_x, "set-procedure-property!", 3, 0, 0, else props = SCM_EOL; } - scm_hashq_set_x (overrides, proc, scm_assq_set_x (props, key, val)); - scm_i_pthread_mutex_unlock (&overrides_lock); + scm_weak_table_putq_x (overrides, proc, scm_assq_set_x (props, key, val)); + scm_i_pthread_mutex_unlock (&scm_i_misc_mutex); return SCM_UNSPECIFIED; } @@ -242,8 +202,8 @@ SCM_DEFINE (scm_set_procedure_property_x, "set-procedure-property!", 3, 0, 0, void scm_init_procprop () { - overrides = scm_make_weak_key_hash_table (SCM_UNDEFINED); - arity_overrides = scm_make_weak_key_hash_table (SCM_UNDEFINED); + overrides = scm_c_make_weak_table (0, SCM_WEAK_TABLE_KIND_KEY); + arity_overrides = scm_c_make_weak_table (0, SCM_WEAK_TABLE_KIND_KEY); #include "libguile/procprop.x" } diff --git a/libguile/procprop.h b/libguile/procprop.h index 919fa4d3a..88e44ec30 100644 --- a/libguile/procprop.h +++ b/libguile/procprop.h @@ -3,7 +3,7 @@ #ifndef SCM_PROCPROP_H #define SCM_PROCPROP_H -/* Copyright (C) 1995,1996,1998,2000, 2006, 2008, 2009, 2010 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996,1998,2000, 2006, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -28,9 +28,6 @@ SCM_API SCM scm_sym_name; -#if (SCM_ENABLE_DEPRECATED == 1) -SCM_DEPRECATED SCM scm_sym_arity; -#endif SCM_API SCM scm_sym_system_procedure; diff --git a/libguile/procs.c b/libguile/procs.c index a096591df..7a2f491d9 100644 --- a/libguile/procs.c +++ b/libguile/procs.c @@ -46,21 +46,10 @@ SCM_DEFINE (scm_procedure_p, "procedure?", 1, 0, 0, "Return @code{#t} if @var{obj} is a procedure.") #define FUNC_NAME s_scm_procedure_p { - if (SCM_NIMP (obj)) - switch (SCM_TYP7 (obj)) - { - case scm_tcs_struct: - if (!((SCM_OBJ_CLASS_FLAGS (obj) & SCM_CLASSF_PURE_GENERIC) - || SCM_STRUCT_APPLICABLE_P (obj))) - break; - case scm_tc7_program: - return SCM_BOOL_T; - case scm_tc7_smob: - return scm_from_bool (SCM_SMOB_DESCRIPTOR (obj).apply); - default: - return SCM_BOOL_F; - } - return SCM_BOOL_F; + return scm_from_bool (SCM_PROGRAM_P (obj) + || (SCM_STRUCTP (obj) && SCM_STRUCT_APPLICABLE_P (obj)) + || (SCM_HAS_TYP7 (obj, scm_tc7_smob) + && SCM_SMOB_APPLICABLE_P (obj))); } #undef FUNC_NAME @@ -146,14 +135,15 @@ SCM_PRIMITIVE_GENERIC (scm_setter, "setter", 1, 0, 0, "applicable struct with a setter.") #define FUNC_NAME s_scm_setter { - SCM_GASSERT1 (SCM_STRUCTP (proc), g_scm_setter, proc, SCM_ARG1, FUNC_NAME); + if (SCM_UNLIKELY (!SCM_STRUCTP (proc))) + return scm_wta_dispatch_1 (g_scm_setter, proc, SCM_ARG1, FUNC_NAME); if (SCM_STRUCT_SETTER_P (proc)) return SCM_STRUCT_SETTER (proc); if (SCM_PUREGENERICP (proc) && SCM_IS_A_P (proc, scm_class_generic_with_setter)) /* FIXME: might not be an accessor */ return SCM_GENERIC_SETTER (proc); - SCM_WTA_DISPATCH_1 (g_scm_setter, proc, SCM_ARG1, FUNC_NAME); + return scm_wta_dispatch_1 (g_scm_setter, proc, SCM_ARG1, FUNC_NAME); return SCM_BOOL_F; /* not reached */ } #undef FUNC_NAME diff --git a/libguile/programs.c b/libguile/programs.c index b84f84bd3..128e0312a 100644 --- a/libguile/programs.c +++ b/libguile/programs.c @@ -82,22 +82,22 @@ scm_i_program_print (SCM program, SCM port, scm_print_state *pstate) if (SCM_PROGRAM_IS_CONTINUATION (program)) { /* twingliness */ - scm_puts ("#<continuation ", port); + scm_puts_unlocked ("#<continuation ", port); scm_uintprint (SCM_UNPACK (program), 16, port); - scm_putc ('>', port); + scm_putc_unlocked ('>', port); } else if (SCM_PROGRAM_IS_PARTIAL_CONTINUATION (program)) { /* twingliness */ - scm_puts ("#<partial-continuation ", port); + scm_puts_unlocked ("#<partial-continuation ", port); scm_uintprint (SCM_UNPACK (program), 16, port); - scm_putc ('>', port); + scm_putc_unlocked ('>', port); } else if (scm_is_false (write_program) || print_error) { - scm_puts ("#<program ", port); + scm_puts_unlocked ("#<program ", port); scm_uintprint (SCM_UNPACK (program), 16, port); - scm_putc ('>', port); + scm_putc_unlocked ('>', port); } else { diff --git a/libguile/programs.h b/libguile/programs.h index d0e788e51..d53fd8f84 100644 --- a/libguile/programs.h +++ b/libguile/programs.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2001, 2009, 2010 Free Software Foundation, Inc. +/* Copyright (C) 2001, 2009, 2010, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -32,7 +32,7 @@ #define SCM_F_PROGRAM_IS_CONTINUATION 0x800 #define SCM_F_PROGRAM_IS_PARTIAL_CONTINUATION 0x1000 -#define SCM_PROGRAM_P(x) (!SCM_IMP (x) && SCM_TYP7(x) == scm_tc7_program) +#define SCM_PROGRAM_P(x) (SCM_HAS_TYP7 (x, scm_tc7_program)) #define SCM_PROGRAM_OBJCODE(x) (SCM_CELL_OBJECT_1 (x)) #define SCM_PROGRAM_OBJTABLE(x) (SCM_CELL_OBJECT_2 (x)) #define SCM_PROGRAM_FREE_VARIABLES(x) (SCM_CELL_OBJECT_LOC (x, 3)) diff --git a/libguile/promises.c b/libguile/promises.c index 4aff15092..57a208104 100644 --- a/libguile/promises.c +++ b/libguile/promises.c @@ -88,11 +88,11 @@ static int promise_print (SCM exp, SCM port, scm_print_state *pstate) { int writingp = SCM_WRITINGP (pstate); - scm_puts ("#<promise ", port); + scm_puts_unlocked ("#<promise ", port); SCM_SET_WRITINGP (pstate, 1); scm_iprin1 (SCM_PROMISE_DATA (exp), port, pstate); SCM_SET_WRITINGP (pstate, writingp); - scm_putc ('>', port); + scm_putc_unlocked ('>', port); return !0; } diff --git a/libguile/pthread-threads.h b/libguile/pthread-threads.h index 4c67b1857..b5fae4e89 100644 --- a/libguile/pthread-threads.h +++ b/libguile/pthread-threads.h @@ -29,27 +29,15 @@ #include <pthread.h> #include <sched.h> -/* `libgc' defines wrapper procedures for pthread calls. */ -#include "libguile/bdw-gc.h" - /* Threads */ #define scm_i_pthread_t pthread_t #define scm_i_pthread_self pthread_self -#define scm_i_pthread_create GC_pthread_create -#define scm_i_pthread_detach GC_pthread_detach +#define scm_i_pthread_create pthread_create +#define scm_i_pthread_detach pthread_detach -#if SCM_HAVE_GC_PTHREAD_EXIT -#define scm_i_pthread_exit GC_pthread_exit -#else #define scm_i_pthread_exit pthread_exit -#endif - -#if SCM_HAVE_GC_PTHREAD_CANCEL -#define scm_i_pthread_cancel GC_pthread_cancel -#else #define scm_i_pthread_cancel pthread_cancel -#endif #define scm_i_pthread_cleanup_push pthread_cleanup_push #define scm_i_pthread_cleanup_pop pthread_cleanup_pop @@ -57,11 +45,7 @@ /* Signals */ -#if SCM_HAVE_GC_PTHREAD_SIGMASK -#define scm_i_pthread_sigmask GC_pthread_sigmask -#else #define scm_i_pthread_sigmask pthread_sigmask -#endif /* Mutexes */ diff --git a/libguile/r6rs-ports.c b/libguile/r6rs-ports.c index e8674299d..60ba38caa 100644 --- a/libguile/r6rs-ports.c +++ b/libguile/r6rs-ports.c @@ -84,17 +84,14 @@ make_bip (SCM bv) scm_t_port *c_port; const unsigned long mode_bits = SCM_OPN | SCM_RDNG; - scm_i_scm_pthread_mutex_lock (&scm_i_port_table_mutex); + port = scm_c_make_port_with_encoding (bytevector_input_port_type, + mode_bits, + NULL, /* encoding */ + SCM_FAILED_CONVERSION_ERROR, + SCM_UNPACK (bv)); - port = scm_new_port_table_entry (bytevector_input_port_type); c_port = SCM_PTAB_ENTRY (port); - /* Match the expectation of `binary-port?'. */ - c_port->encoding = NULL; - - /* Prevent BV from being GC'd. */ - SCM_SETSTREAM (port, SCM_UNPACK (bv)); - /* Have the port directly access the bytevector. */ c_bv = (char *) SCM_BYTEVECTOR_CONTENTS (bv); c_len = SCM_BYTEVECTOR_LENGTH (bv); @@ -103,11 +100,6 @@ make_bip (SCM bv) c_port->read_end = (unsigned char *) c_bv + c_len; c_port->read_buf_size = c_len; - /* Mark PORT as open, readable and unbuffered (hmm, how elegant...). */ - SCM_SET_CELL_TYPE (port, bytevector_input_port_type | mode_bits); - - scm_i_pthread_mutex_unlock (&scm_i_port_table_mutex); - return port; } @@ -312,27 +304,19 @@ make_cbip (SCM read_proc, SCM get_position_proc, SCM_SIMPLE_VECTOR_SET (method_vector, 2, set_position_proc); SCM_SIMPLE_VECTOR_SET (method_vector, 3, close_proc); - scm_i_pthread_mutex_lock (&scm_i_port_table_mutex); + port = scm_c_make_port_with_encoding (custom_binary_input_port_type, + mode_bits, + NULL, /* encoding */ + SCM_FAILED_CONVERSION_ERROR, + SCM_UNPACK (method_vector)); - port = scm_new_port_table_entry (custom_binary_input_port_type); c_port = SCM_PTAB_ENTRY (port); - /* Match the expectation of `binary-port?'. */ - c_port->encoding = NULL; - - /* Attach it the method vector. */ - SCM_SETSTREAM (port, SCM_UNPACK (method_vector)); - /* Have the port directly access the buffer (bytevector). */ c_port->read_pos = c_port->read_buf = (unsigned char *) c_bv; c_port->read_end = (unsigned char *) c_bv; c_port->read_buf_size = c_len; - /* Mark PORT as open, readable and unbuffered (hmm, how elegant...). */ - SCM_SET_CELL_TYPE (port, custom_binary_input_port_type | mode_bits); - - scm_i_pthread_mutex_unlock (&scm_i_port_table_mutex); - return port; } @@ -491,7 +475,7 @@ SCM_DEFINE (scm_get_bytevector_n, "get-bytevector-n", 2, 0, 0, if (SCM_LIKELY (c_count > 0)) /* XXX: `scm_c_read ()' does not update the port position. */ - c_read = scm_c_read (port, c_bv, c_count); + c_read = scm_c_read_unlocked (port, c_bv, c_count); else /* Don't invoke `scm_c_read ()' since it may block. */ c_read = 0; @@ -538,7 +522,7 @@ SCM_DEFINE (scm_get_bytevector_n_x, "get-bytevector-n!", 4, 0, 0, scm_out_of_range (FUNC_NAME, count); if (SCM_LIKELY (c_count > 0)) - c_read = scm_c_read (port, c_bv + c_start, c_count); + c_read = scm_c_read_unlocked (port, c_bv + c_start, c_count); else /* Don't invoke `scm_c_read ()' since it may block. */ c_read = 0; @@ -593,7 +577,7 @@ SCM_DEFINE (scm_get_bytevector_some, "get-bytevector-some", 1, 0, 0, } /* We can't use `scm_c_read ()' since it blocks. */ - c_chr = scm_getc (port); + c_chr = scm_getc_unlocked (port); if (c_chr != EOF) { c_bv[c_total] = (char) c_chr; @@ -618,7 +602,8 @@ SCM_DEFINE (scm_get_bytevector_some, "get-bytevector-some", 1, 0, 0, c_len = (unsigned) c_total; } - result = scm_c_take_gc_bytevector ((signed char *) c_bv, c_len); + result = scm_c_take_gc_bytevector ((signed char *) c_bv, c_len, + SCM_BOOL_F); } return result; @@ -657,7 +642,7 @@ SCM_DEFINE (scm_get_bytevector_all, "get-bytevector-all", 1, 0, 0, /* `scm_c_read ()' blocks until C_COUNT bytes are available or EOF is reached. */ - c_read = scm_c_read (port, c_bv + c_total, c_count); + c_read = scm_c_read_unlocked (port, c_bv + c_total, c_count); c_total += c_read, c_count -= c_read; } while (!SCM_EOF_OBJECT_P (scm_peek_char (port))); @@ -677,7 +662,8 @@ SCM_DEFINE (scm_get_bytevector_all, "get-bytevector-all", 1, 0, 0, c_len = (unsigned) c_total; } - result = scm_c_take_gc_bytevector ((signed char *) c_bv, c_len); + result = scm_c_take_gc_bytevector ((signed char *) c_bv, c_len, + SCM_BOOL_F); } return result; @@ -702,7 +688,7 @@ SCM_DEFINE (scm_put_u8, "put-u8", 2, 0, 0, SCM_VALIDATE_BINARY_OUTPUT_PORT (1, port); c_octet = scm_to_uint8 (octet); - scm_putc ((char) c_octet, port); + scm_putc_unlocked ((char) c_octet, port); return SCM_UNSPECIFIED; } @@ -745,7 +731,7 @@ SCM_DEFINE (scm_put_bytevector, "put-bytevector", 2, 2, 0, else c_start = 0, c_count = c_len; - scm_c_write (port, c_bv + c_start, c_count); + scm_c_write_unlocked (port, c_bv + c_start, c_count); return SCM_UNSPECIFIED; } @@ -827,26 +813,19 @@ make_bop (void) scm_t_bop_buffer *buf; const unsigned long mode_bits = SCM_OPN | SCM_WRTNG; - scm_i_pthread_mutex_lock (&scm_i_port_table_mutex); - - port = scm_new_port_table_entry (bytevector_output_port_type); - c_port = SCM_PTAB_ENTRY (port); - - /* Match the expectation of `binary-port?'. */ - c_port->encoding = NULL; - buf = (scm_t_bop_buffer *) scm_gc_malloc (sizeof (* buf), SCM_GC_BOP); bop_buffer_init (buf); - c_port->write_buf = c_port->write_pos = c_port->write_end = NULL; - c_port->write_buf_size = 0; - - SCM_SET_BOP_BUFFER (port, buf); + port = scm_c_make_port_with_encoding (bytevector_output_port_type, + mode_bits, + NULL, /* encoding */ + SCM_FAILED_CONVERSION_ERROR, + (scm_t_bits)buf); - /* Mark PORT as open and writable. */ - SCM_SET_CELL_TYPE (port, bytevector_output_port_type | mode_bits); + c_port = SCM_PTAB_ENTRY (port); - scm_i_pthread_mutex_unlock (&scm_i_port_table_mutex); + c_port->write_buf = c_port->write_pos = c_port->write_end = NULL; + c_port->write_buf_size = 0; /* Make the bop procedure. */ SCM_NEWSMOB (bop_proc, bytevector_output_port_procedure, buf); @@ -919,7 +898,7 @@ SCM_SMOB_APPLY (bytevector_output_port_procedure, bop_buffer_init (buf); if (result_buf.len == 0) - bv = scm_c_take_gc_bytevector (NULL, 0); + bv = scm_c_take_gc_bytevector (NULL, 0, SCM_BOOL_F); else { if (result_buf.total_len > result_buf.len) @@ -930,7 +909,7 @@ SCM_SMOB_APPLY (bytevector_output_port_procedure, SCM_GC_BOP); bv = scm_c_take_gc_bytevector ((signed char *) result_buf.buffer, - result_buf.len); + result_buf.len, SCM_BOOL_F); } return bv; @@ -986,26 +965,18 @@ make_cbop (SCM write_proc, SCM get_position_proc, SCM_SIMPLE_VECTOR_SET (method_vector, 2, set_position_proc); SCM_SIMPLE_VECTOR_SET (method_vector, 3, close_proc); - scm_i_pthread_mutex_lock (&scm_i_port_table_mutex); + port = scm_c_make_port_with_encoding (custom_binary_output_port_type, + mode_bits, + NULL, /* encoding */ + SCM_FAILED_CONVERSION_ERROR, + SCM_UNPACK (method_vector)); - port = scm_new_port_table_entry (custom_binary_output_port_type); c_port = SCM_PTAB_ENTRY (port); - /* Match the expectation of `binary-port?'. */ - c_port->encoding = NULL; - - /* Attach it the method vector. */ - SCM_SETSTREAM (port, SCM_UNPACK (method_vector)); - /* Have the port directly access the buffer (bytevector). */ c_port->write_buf = c_port->write_pos = c_port->write_end = NULL; c_port->write_buf_size = c_port->read_buf_size = 0; - /* Mark PORT as open, writable and unbuffered. */ - SCM_SET_CELL_TYPE (port, custom_binary_output_port_type | mode_bits); - - scm_i_pthread_mutex_unlock (&scm_i_port_table_mutex); - return port; } @@ -1103,13 +1074,8 @@ make_tp (SCM binary_port, unsigned long mode) scm_t_port *c_port; const unsigned long mode_bits = SCM_OPN | mode; - scm_i_pthread_mutex_lock (&scm_i_port_table_mutex); - - port = scm_new_port_table_entry (transcoded_port_type); - - SCM_SETSTREAM (port, SCM_UNPACK (binary_port)); - - SCM_SET_CELL_TYPE (port, transcoded_port_type | mode_bits); + port = scm_c_make_port (transcoded_port_type, mode_bits, + SCM_UNPACK (binary_port)); if (SCM_INPUT_PORT_P (port)) { @@ -1122,15 +1088,13 @@ make_tp (SCM binary_port, unsigned long mode) SCM_SET_CELL_WORD_0 (port, SCM_CELL_WORD_0 (port) & ~SCM_BUF0); } - scm_i_pthread_mutex_unlock (&scm_i_port_table_mutex); - return port; } static void tp_write (SCM port, const void *data, size_t size) { - scm_c_write (SCM_TP_BINARY_PORT (port), data, size); + scm_c_write_unlocked (SCM_TP_BINARY_PORT (port), data, size); } static int @@ -1148,7 +1112,7 @@ tp_fill_input (SCM port) scm_force_output (bport); if (c_bport->read_pos >= c_bport->read_end) - scm_fill_input (bport); + scm_fill_input_unlocked (bport); count = c_bport->read_end - c_bport->read_pos; if (count > c_port->read_buf_size) @@ -1185,7 +1149,7 @@ tp_flush (SCM port) We just throw away the data when the underlying port is closed. */ if (SCM_OPOUTPORTP (binary_port)) - scm_c_write (binary_port, c_port->write_buf, count); + scm_c_write_unlocked (binary_port, c_port->write_buf, count); c_port->write_pos = c_port->write_buf; c_port->rw_active = SCM_PORT_NEITHER; @@ -1267,7 +1231,7 @@ SCM_DEFINE (scm_get_string_n_x, for (j = c_start; j < c_end; j++) { - c = scm_getc (port); + c = scm_getc_unlocked (port); if (c == EOF) { size_t chars_read = j - c_start; diff --git a/libguile/rdelim.c b/libguile/rdelim.c index 9d1496795..c8c7d8b43 100644 --- a/libguile/rdelim.c +++ b/libguile/rdelim.c @@ -79,13 +79,13 @@ SCM_DEFINE (scm_read_delimited_x, "%read-delimited!", 3, 3, 0, { size_t k; - c = scm_getc (port); + c = scm_getc_unlocked (port); for (k = 0; k < num_delims; k++) { if (scm_i_string_ref (delims, k) == c) { if (scm_is_false (gobble)) - scm_ungetc (c, port); + scm_ungetc_unlocked (c, port); return scm_cons (SCM_MAKE_CHAR (c), scm_from_size_t (j - cstart)); @@ -149,7 +149,7 @@ SCM_DEFINE (scm_read_line, "%read-line", 0, 1, 0, } else { - buf[index] = scm_getc (port); + buf[index] = scm_getc_unlocked (port); switch (buf[index]) { case EOF: diff --git a/libguile/read.c b/libguile/read.c index 616672418..7db03417c 100644 --- a/libguile/read.c +++ b/libguile/read.c @@ -216,13 +216,13 @@ read_token (SCM port, char *buf, const size_t buf_size, size_t *read) { int chr; - chr = scm_get_byte_or_eof (port); + chr = scm_get_byte_or_eof_unlocked (port); if (chr == EOF) return 0; else if (CHAR_IS_DELIMITER (chr)) { - scm_unget_byte (chr, port); + scm_unget_byte_unlocked (chr, port); return 0; } else @@ -288,7 +288,7 @@ flush_ws (SCM port, const char *eoferr) { register scm_t_wchar c; while (1) - switch (c = scm_getc (port)) + switch (c = scm_getc_unlocked (port)) { case EOF: goteof: @@ -303,7 +303,7 @@ flush_ws (SCM port, const char *eoferr) case ';': lp: - switch (c = scm_getc (port)) + switch (c = scm_getc_unlocked (port)) { case EOF: goto goteof; @@ -315,7 +315,7 @@ flush_ws (SCM port, const char *eoferr) break; case '#': - switch (c = scm_getc (port)) + switch (c = scm_getc_unlocked (port)) { case EOF: eoferr = "read_sharp"; @@ -334,7 +334,7 @@ flush_ws (SCM port, const char *eoferr) } /* fall through */ default: - scm_ungetc (c, port); + scm_ungetc_unlocked (c, port); return '#'; } break; @@ -375,7 +375,7 @@ scm_read_sexp (scm_t_wchar chr, SCM port) if (terminating_char == c) return SCM_EOL; - scm_ungetc (c, port); + scm_ungetc_unlocked (c, port); tmp = scm_read_expression (port); /* Note that it is possible for scm_read_expression to return @@ -402,7 +402,7 @@ scm_read_sexp (scm_t_wchar chr, SCM port) "in pair: mismatched close paren: ~A", scm_list_1 (SCM_MAKE_CHAR (c))); - scm_ungetc (c, port); + scm_ungetc_unlocked (c, port); tmp = scm_read_expression (port); /* See above note about scm_sym_dot. */ @@ -442,7 +442,7 @@ scm_read_sexp (scm_t_wchar chr, SCM port) c = 0; \ while (i < ndigits) \ { \ - a = scm_getc (port); \ + a = scm_getc_unlocked (port); \ if (a == EOF) \ goto str_eof; \ if (terminator \ @@ -472,13 +472,13 @@ skip_intraline_whitespace (SCM port) do { - c = scm_getc (port); + c = scm_getc_unlocked (port); if (c == EOF) return; } while (c == '\t' || uc_is_general_category (c, UC_SPACE_SEPARATOR)); - scm_ungetc (c, port); + scm_ungetc_unlocked (c, port); } static SCM @@ -493,7 +493,7 @@ scm_read_string (int chr, SCM port) scm_t_wchar c; str = scm_i_make_string (READER_STRING_BUFFER_SIZE, NULL, 0); - while ('"' != (c = scm_getc (port))) + while ('"' != (c = scm_getc_unlocked (port))) { if (c == EOF) { @@ -511,7 +511,7 @@ scm_read_string (int chr, SCM port) if (c == '\\') { - switch (c = scm_getc (port)) + switch (c = scm_getc_unlocked (port)) { case EOF: goto str_eof; @@ -596,7 +596,7 @@ scm_read_number (scm_t_wchar chr, SCM port) int overflow; scm_t_port *pt = SCM_PTAB_ENTRY (port); - scm_ungetc (chr, port); + scm_ungetc_unlocked (chr, port); overflow = read_complete_token (port, buffer, sizeof (buffer), &overflow_buffer, &bytes_read); @@ -633,7 +633,7 @@ scm_read_mixed_case_symbol (scm_t_wchar chr, SCM port) scm_t_port *pt = SCM_PTAB_ENTRY (port); SCM str; - scm_ungetc (chr, port); + scm_ungetc_unlocked (chr, port); overflow = read_complete_token (port, buffer, READER_BUFFER_SIZE, &overflow_buffer, &bytes_read); if (bytes_read > 0) @@ -710,8 +710,8 @@ scm_read_number_and_radix (scm_t_wchar chr, SCM port) break; default: - scm_ungetc (chr, port); - scm_ungetc ('#', port); + scm_ungetc_unlocked (chr, port); + scm_ungetc_unlocked ('#', port); radix = 10; } @@ -762,12 +762,12 @@ scm_read_quote (int chr, SCM port) { scm_t_wchar c; - c = scm_getc (port); + c = scm_getc_unlocked (port); if ('@' == c) p = scm_sym_uq_splicing; else { - scm_ungetc (c, port); + scm_ungetc_unlocked (c, port); p = scm_sym_unquote; } break; @@ -812,12 +812,12 @@ scm_read_syntax (int chr, SCM port) { int c; - c = scm_getc (port); + c = scm_getc_unlocked (port); if ('@' == c) p = sym_unsyntax_splicing; else { - scm_ungetc (c, port); + scm_ungetc_unlocked (c, port); p = sym_unsyntax; } break; @@ -857,9 +857,9 @@ scm_read_semicolon_comment (int chr, SCM port) /* We use the get_byte here because there is no need to get the locale correct with comment input. This presumes that newline always represents itself no matter what the encoding is. */ - for (c = scm_get_byte_or_eof (port); + for (c = scm_get_byte_or_eof_unlocked (port); (c != EOF) && (c != '\n'); - c = scm_get_byte_or_eof (port)); + c = scm_get_byte_or_eof_unlocked (port)); return SCM_UNSPECIFIED; } @@ -901,7 +901,7 @@ scm_read_character (scm_t_wchar chr, SCM port) if (bytes_read == 0) { - chr = scm_getc (port); + chr = scm_getc_unlocked (port); if (chr == EOF) scm_i_input_error (FUNC_NAME, port, "unexpected end of file " "while reading character", SCM_EOL); @@ -1028,15 +1028,15 @@ scm_read_srfi4_vector (int chr, SCM port) static SCM scm_read_bytevector (scm_t_wchar chr, SCM port) { - chr = scm_getc (port); + chr = scm_getc_unlocked (port); if (chr != 'u') goto syntax; - chr = scm_getc (port); + chr = scm_getc_unlocked (port); if (chr != '8') goto syntax; - chr = scm_getc (port); + chr = scm_getc_unlocked (port); if (chr != '(') goto syntax; @@ -1056,15 +1056,15 @@ scm_read_guile_bit_vector (scm_t_wchar chr, SCM port) terribly inefficient but who cares? */ SCM s_bits = SCM_EOL; - for (chr = scm_getc (port); + for (chr = scm_getc_unlocked (port); (chr != EOF) && ((chr == '0') || (chr == '1')); - chr = scm_getc (port)) + chr = scm_getc_unlocked (port)) { s_bits = scm_cons ((chr == '0') ? SCM_BOOL_F : SCM_BOOL_T, s_bits); } if (chr != EOF) - scm_ungetc (chr, port); + scm_ungetc_unlocked (chr, port); return scm_bitvector (scm_reverse_x (s_bits, SCM_EOL)); } @@ -1076,7 +1076,7 @@ scm_read_scsh_block_comment (scm_t_wchar chr, SCM port) for (;;) { - int c = scm_getc (port); + int c = scm_getc_unlocked (port); if (c == EOF) scm_i_input_error ("skip_block_comment", port, @@ -1097,30 +1097,30 @@ static SCM scm_read_shebang (scm_t_wchar chr, SCM port) { int c = 0; - if ((c = scm_get_byte_or_eof (port)) != 'r') + if ((c = scm_get_byte_or_eof_unlocked (port)) != 'r') { - scm_ungetc (c, port); + scm_ungetc_unlocked (c, port); return scm_read_scsh_block_comment (chr, port); } - if ((c = scm_get_byte_or_eof (port)) != '6') + if ((c = scm_get_byte_or_eof_unlocked (port)) != '6') { - scm_ungetc (c, port); - scm_ungetc ('r', port); + scm_ungetc_unlocked (c, port); + scm_ungetc_unlocked ('r', port); return scm_read_scsh_block_comment (chr, port); } - if ((c = scm_get_byte_or_eof (port)) != 'r') + if ((c = scm_get_byte_or_eof_unlocked (port)) != 'r') { - scm_ungetc (c, port); - scm_ungetc ('6', port); - scm_ungetc ('r', port); + scm_ungetc_unlocked (c, port); + scm_ungetc_unlocked ('6', port); + scm_ungetc_unlocked ('r', port); return scm_read_scsh_block_comment (chr, port); } - if ((c = scm_get_byte_or_eof (port)) != 's') + if ((c = scm_get_byte_or_eof_unlocked (port)) != 's') { - scm_ungetc (c, port); - scm_ungetc ('r', port); - scm_ungetc ('6', port); - scm_ungetc ('r', port); + scm_ungetc_unlocked (c, port); + scm_ungetc_unlocked ('r', port); + scm_ungetc_unlocked ('6', port); + scm_ungetc_unlocked ('r', port); return scm_read_scsh_block_comment (chr, port); } @@ -1134,7 +1134,7 @@ scm_read_r6rs_block_comment (scm_t_wchar chr, SCM port) nested. So care must be taken. */ int nesting_level = 1; - int a = scm_getc (port); + int a = scm_getc_unlocked (port); if (a == EOF) scm_i_input_error ("scm_read_r6rs_block_comment", port, @@ -1142,7 +1142,7 @@ scm_read_r6rs_block_comment (scm_t_wchar chr, SCM port) while (nesting_level > 0) { - int b = scm_getc (port); + int b = scm_getc_unlocked (port); if (b == EOF) scm_i_input_error ("scm_read_r6rs_block_comment", port, @@ -1174,7 +1174,7 @@ scm_read_commented_expression (scm_t_wchar chr, SCM port) if (EOF == c) scm_i_input_error ("read_commented_expression", port, "no expression after #; comment", SCM_EOL); - scm_ungetc (c, port); + scm_ungetc_unlocked (c, port); scm_read_expression (port); return SCM_UNSPECIFIED; } @@ -1193,7 +1193,7 @@ scm_read_extended_symbol (scm_t_wchar chr, SCM port) buf = scm_i_string_start_writing (buf); - while ((chr = scm_getc (port)) != EOF) + while ((chr = scm_getc_unlocked (port)) != EOF) { if (saw_brace) { @@ -1220,7 +1220,7 @@ scm_read_extended_symbol (scm_t_wchar chr, SCM port) that the extended read syntax would never put a `\' before an `x'. For now, we just ignore other instances of backslash in the string. */ - switch ((chr = scm_getc (port))) + switch ((chr = scm_getc_unlocked (port))) { case EOF: goto done; @@ -1307,7 +1307,7 @@ scm_read_sharp (scm_t_wchar chr, SCM port) { SCM result; - chr = scm_getc (port); + chr = scm_getc_unlocked (port); result = scm_read_sharp_extension (chr, port); if (!scm_is_eq (result, SCM_UNSPECIFIED)) @@ -1339,29 +1339,10 @@ scm_read_sharp (scm_t_wchar chr, SCM port) case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '@': -#if SCM_ENABLE_DEPRECATED - /* See below for 'i' and 'e'. */ - case 'a': - case 'y': - case 'h': - case 'l': -#endif return (scm_i_read_array (port, chr)); case 'i': case 'e': -#if SCM_ENABLE_DEPRECATED - { - /* When next char is '(', it really is an old-style - uniform array. */ - scm_t_wchar next_c = scm_getc (port); - if (next_c != EOF) - scm_ungetc (next_c, port); - if (next_c == '(') - return scm_i_read_array (port, chr); - /* Fall through. */ - } -#endif case 'b': case 'B': case 'o': @@ -1417,7 +1398,7 @@ scm_read_expression (SCM port) { register scm_t_wchar chr; - chr = scm_getc (port); + chr = scm_getc_unlocked (port); switch (chr) { @@ -1495,7 +1476,7 @@ SCM_DEFINE (scm_read, "read", 0, 1, 0, c = flush_ws (port, (char *) NULL); if (EOF == c) return SCM_EOF_VAL; - scm_ungetc (c, port); + scm_ungetc_unlocked (c, port); return (scm_read_expression (port)); } @@ -1607,7 +1588,7 @@ scm_i_scan_for_encoding (SCM port) pt = SCM_PTAB_ENTRY (port); if (pt->rw_active == SCM_PORT_WRITE) - scm_flush (port); + scm_flush_unlocked (port); if (pt->rw_random) pt->rw_active = SCM_PORT_READ; @@ -1615,7 +1596,7 @@ scm_i_scan_for_encoding (SCM port) if (pt->read_pos == pt->read_end) { /* We can use the read buffer, and thus avoid a seek. */ - if (scm_fill_input (port) == EOF) + if (scm_fill_input_unlocked (port) == EOF) return NULL; bytes_read = pt->read_end - pt->read_pos; @@ -1640,7 +1621,7 @@ scm_i_scan_for_encoding (SCM port) if (SCM_FPORTP (port) && !SCM_FDES_RANDOM_P (SCM_FPORT_FDES (port))) return NULL; - bytes_read = scm_c_read (port, header, SCM_ENCODING_SEARCH_SIZE); + bytes_read = scm_c_read_unlocked (port, header, SCM_ENCODING_SEARCH_SIZE); header[bytes_read] = '\0'; scm_seek (port, scm_from_int (0), scm_from_int (SEEK_SET)); } diff --git a/libguile/rw.c b/libguile/rw.c index a9b4a329a..677e0d8df 100644 --- a/libguile/rw.c +++ b/libguile/rw.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2001, 2006, 2009 Free Software Foundation, Inc. +/* Copyright (C) 2001, 2006, 2009, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -248,7 +248,7 @@ SCM_DEFINE (scm_write_string_partial, "write-string/partial", 1, 3, 0, return scm_from_long (write_len); } if (pt->write_pos > pt->write_buf) - scm_flush (port); + scm_flush_unlocked (port); fdes = SCM_FPORT_FDES (port); } { diff --git a/libguile/scmsigs.c b/libguile/scmsigs.c index 723d6a8c5..86fce0fe7 100644 --- a/libguile/scmsigs.c +++ b/libguile/scmsigs.c @@ -150,6 +150,28 @@ struct signal_pipe_data int err; }; +#ifndef HAVE_GC_GET_SUSPEND_SIGNAL +static int +GC_get_suspend_signal (void) +{ +#if defined SIG_SUSPEND + return SIG_SUSPEND; +#elif defined SIGPWR + return SIGPWR; +#elif defined SIGLOST + return SIGLOST; +#elif defined _SIGRTMIN + return _SIGRTMIN + 6; +#elif defined SIGRTMIN + return SIGRTMIN + 6; +#elif defined __GLIBC__ + return 32+6; +#else + return SIGUSR1; +#endif +} +#endif /* HAVE_GC_GET_SUSPEND_SIGNAL */ + static void* read_signal_pipe_data (void * data) { @@ -168,6 +190,11 @@ signal_delivery_thread (void *data) #if HAVE_PTHREAD_SIGMASK /* not on mingw, see notes above */ sigset_t all_sigs; sigfillset (&all_sigs); + /* On libgc 7.1 and earlier, GC_do_blocking doesn't actually do + anything. So in that case, libgc will want to suspend the signal + delivery thread, so we need to allow it to do so by unmasking the + suspend signal. */ + sigdelset (&all_sigs, GC_get_suspend_signal ()); scm_i_pthread_sigmask (SIG_SETMASK, &all_sigs, NULL); #endif diff --git a/libguile/smob.c b/libguile/smob.c index c414913fc..cb6f803a2 100644 --- a/libguile/smob.c +++ b/libguile/smob.c @@ -108,14 +108,14 @@ int scm_smob_print (SCM exp, SCM port, scm_print_state *pstate SCM_UNUSED) { long n = SCM_SMOBNUM (exp); - scm_puts ("#<", port); - scm_puts (SCM_SMOBNAME (n) ? SCM_SMOBNAME (n) : "smob", port); - scm_putc (' ', port); + scm_puts_unlocked ("#<", port); + scm_puts_unlocked (SCM_SMOBNAME (n) ? SCM_SMOBNAME (n) : "smob", port); + scm_putc_unlocked (' ', port); if (scm_smobs[n].size) scm_uintprint (SCM_CELL_WORD_1 (exp), 16, port); else scm_uintprint (SCM_UNPACK (exp), 16, port); - scm_putc ('>', port); + scm_putc_unlocked ('>', port); return 1; } @@ -418,16 +418,13 @@ scm_set_smob_apply (scm_t_bits tc, SCM (*apply) (), } static SCM tramp_weak_map = SCM_BOOL_F; -static scm_i_pthread_mutex_t tramp_lock = SCM_I_PTHREAD_MUTEX_INITIALIZER; SCM scm_i_smob_apply_trampoline (SCM smob) { SCM tramp; - scm_i_pthread_mutex_lock (&tramp_lock); - tramp = scm_hashq_ref (tramp_weak_map, smob, SCM_BOOL_F); - scm_i_pthread_mutex_unlock (&tramp_lock); + tramp = scm_weak_table_refq (tramp_weak_map, smob, SCM_BOOL_F); if (scm_is_true (tramp)) return tramp; @@ -441,15 +438,13 @@ scm_i_smob_apply_trampoline (SCM smob) name = "smob-apply"; objtable = scm_c_make_vector (2, SCM_UNDEFINED); SCM_SIMPLE_VECTOR_SET (objtable, 0, smob); - SCM_SIMPLE_VECTOR_SET (objtable, 1, scm_from_locale_symbol (name)); + SCM_SIMPLE_VECTOR_SET (objtable, 1, scm_from_utf8_symbol (name)); tramp = scm_make_program (SCM_SMOB_DESCRIPTOR (smob).apply_trampoline_objcode, objtable, SCM_BOOL_F); /* Race conditions (between the ref and this set!) cannot cause any harm here. */ - scm_i_pthread_mutex_lock (&tramp_lock); - scm_hashq_set_x (tramp_weak_map, smob, tramp); - scm_i_pthread_mutex_unlock (&tramp_lock); + scm_weak_table_putq_x (tramp_weak_map, smob, tramp); return tramp; } } @@ -475,8 +470,8 @@ scm_make_smob (scm_t_bits tc) static int smob_gc_kind; -/* The generic SMOB mark procedure that gets called for SMOBs allocated with - `scm_i_new_smob_with_mark_proc ()'. */ +/* The generic SMOB mark procedure that gets called for SMOBs allocated + with smob_gc_kind. */ static struct GC_ms_entry * smob_mark (GC_word *addr, struct GC_ms_entry *mark_stack_ptr, struct GC_ms_entry *mark_stack_limit, GC_word env) @@ -484,7 +479,7 @@ smob_mark (GC_word *addr, struct GC_ms_entry *mark_stack_ptr, register SCM cell; register scm_t_bits tc, smobnum; - cell = PTR2SCM (addr); + cell = SCM_PACK_POINTER (addr); if (SCM_TYP7 (cell) != scm_tc7_smob) /* It is likely that the GC passed us a pointer to a free-list element @@ -521,7 +516,7 @@ smob_mark (GC_word *addr, struct GC_ms_entry *mark_stack_ptr, mark_stack_ptr = SCM_I_CURRENT_THREAD->current_mark_stack_ptr; - if (SCM_NIMP (obj)) + if (SCM_HEAP_OBJECT_P (obj)) /* Mark the returned object. */ mark_stack_ptr = GC_MARK_AND_PUSH (SCM2PTR (obj), mark_stack_ptr, @@ -546,7 +541,7 @@ scm_gc_mark (SCM o) #define CURRENT_MARK_LIMIT \ ((struct GC_ms_entry *)(SCM_I_CURRENT_THREAD->current_mark_stack_limit)) - if (SCM_NIMP (o)) + if (SCM_HEAP_OBJECT_P (o)) { /* At this point, the `current_mark_*' fields of the current thread must be defined (they are set in `smob_mark ()'). */ @@ -565,33 +560,15 @@ scm_gc_mark (SCM o) #undef CURRENT_MARK_LIMIT } -/* Return a SMOB with typecode TC. The SMOB type corresponding to TC may - provide a custom mark procedure and it will be honored. */ -SCM -scm_i_new_smob_with_mark_proc (scm_t_bits tc, scm_t_bits data1, - scm_t_bits data2, scm_t_bits data3) -{ - /* Return a double cell. */ - SCM cell = SCM_PACK (GC_generic_malloc (2 * sizeof (scm_t_cell), - smob_gc_kind)); - - SCM_SET_CELL_WORD_3 (cell, data3); - SCM_SET_CELL_WORD_2 (cell, data2); - SCM_SET_CELL_WORD_1 (cell, data1); - SCM_SET_CELL_WORD_0 (cell, tc); - - return cell; -} - /* Finalize SMOB by calling its SMOB type's free function, if any. */ -void -scm_i_finalize_smob (GC_PTR ptr, GC_PTR data) +static void +finalize_smob (GC_PTR ptr, GC_PTR data) { SCM smob; size_t (* free_smob) (SCM); - smob = PTR2SCM (ptr); + smob = SCM_PACK_POINTER (ptr); #if 0 printf ("finalizing SMOB %p (smobnum: %u)\n", ptr, SCM_SMOBNUM (smob)); @@ -602,6 +579,73 @@ scm_i_finalize_smob (GC_PTR ptr, GC_PTR data) free_smob (smob); } +/* Return a SMOB with typecode TC. The SMOB type corresponding to TC may + provide a custom mark procedure and it will be honored. */ +SCM +scm_i_new_smob (scm_t_bits tc, scm_t_bits data) +{ + scm_t_bits smobnum = SCM_TC2SMOBNUM (tc); + SCM ret; + + /* Use the smob_gc_kind if needed to allow the mark procedure to + run. Since the marker only deals with double cells, that case + allocates a double cell. We leave words 2 and 3 to there initial + values, which is 0. */ + if (scm_smobs [smobnum].mark) + ret = SCM_PACK_POINTER (GC_generic_malloc (2 * sizeof (scm_t_cell), smob_gc_kind)); + else + ret = SCM_PACK_POINTER (GC_MALLOC (sizeof (scm_t_cell))); + + SCM_SET_CELL_WORD_1 (ret, data); + SCM_SET_CELL_WORD_0 (ret, tc); + + if (scm_smobs[smobnum].free) + { + GC_finalization_proc prev_finalizer; + GC_PTR prev_finalizer_data; + + GC_REGISTER_FINALIZER_NO_ORDER (SCM_HEAP_OBJECT_BASE (ret), + finalize_smob, NULL, + &prev_finalizer, &prev_finalizer_data); + } + + return ret; +} + +/* Return a SMOB with typecode TC. The SMOB type corresponding to TC may + provide a custom mark procedure and it will be honored. */ +SCM +scm_i_new_double_smob (scm_t_bits tc, scm_t_bits data1, + scm_t_bits data2, scm_t_bits data3) +{ + scm_t_bits smobnum = SCM_TC2SMOBNUM (tc); + SCM ret; + + /* Use the smob_gc_kind if needed to allow the mark procedure to + run. */ + if (scm_smobs [smobnum].mark) + ret = SCM_PACK_POINTER (GC_generic_malloc (2 * sizeof (scm_t_cell), smob_gc_kind)); + else + ret = SCM_PACK_POINTER (GC_MALLOC (2 * sizeof (scm_t_cell))); + + SCM_SET_CELL_WORD_3 (ret, data3); + SCM_SET_CELL_WORD_2 (ret, data2); + SCM_SET_CELL_WORD_1 (ret, data1); + SCM_SET_CELL_WORD_0 (ret, tc); + + if (scm_smobs[smobnum].free) + { + GC_finalization_proc prev_finalizer; + GC_PTR prev_finalizer_data; + + GC_REGISTER_FINALIZER_NO_ORDER (SCM_HEAP_OBJECT_BASE (ret), + finalize_smob, NULL, + &prev_finalizer, &prev_finalizer_data); + } + + return ret; +} + void scm_smob_prehistory () @@ -628,7 +672,7 @@ scm_smob_prehistory () scm_smobs[i].apply_trampoline_objcode = SCM_BOOL_F; } - tramp_weak_map = scm_make_weak_key_hash_table (SCM_UNDEFINED); + tramp_weak_map = scm_c_make_weak_table (0, SCM_WEAK_TABLE_KIND_KEY); } /* diff --git a/libguile/smob.h b/libguile/smob.h index 6a7ceeae6..be404a8f7 100644 --- a/libguile/smob.h +++ b/libguile/smob.h @@ -27,8 +27,6 @@ #include "libguile/__scm.h" #include "libguile/print.h" -#include "libguile/bdw-gc.h" - /* This is the internal representation of a smob type */ @@ -46,78 +44,79 @@ typedef struct scm_smob_descriptor } scm_smob_descriptor; +#define SCM_SMOB_TYPE_MASK 0xffff +#define SCM_SMOB_TYPE_BITS(tc) (tc) +#define SCM_TC2SMOBNUM(x) (0x0ff & ((x) >> 8)) +#define SCM_SMOBNUM(x) (SCM_TC2SMOBNUM (SCM_CELL_TYPE (x))) +/* SCM_SMOBNAME can be 0 if name is missing */ +#define SCM_SMOBNAME(smobnum) (scm_smobs[smobnum].name) +#define SCM_SMOB_PREDICATE(tag, obj) SCM_HAS_TYP16 (obj, tag) +#define SCM_SMOB_DESCRIPTOR(x) (scm_smobs[SCM_SMOBNUM (x)]) +#define SCM_SMOB_APPLICABLE_P(x) (SCM_SMOB_DESCRIPTOR (x).apply) + +/* Maximum number of SMOB types. */ +#define SCM_I_MAX_SMOB_TYPE_COUNT 256 + +SCM_API long scm_numsmob; +SCM_API scm_smob_descriptor scm_smobs[]; + + -SCM_API SCM scm_i_new_smob_with_mark_proc (scm_t_bits tc, - scm_t_bits, scm_t_bits, scm_t_bits); - - - -#define SCM_NEWSMOB(z, tc, data) \ -do \ - { \ - register scm_t_bits _smobnum = SCM_TC2SMOBNUM (tc); \ - z = (scm_smobs[_smobnum].mark \ - ? scm_i_new_smob_with_mark_proc ((tc), (scm_t_bits)(data), \ - 0, 0) \ - : scm_cell (tc, (scm_t_bits)(data))); \ - if (scm_smobs[_smobnum].free) \ - { \ - GC_finalization_proc _prev_finalizer; \ - GC_PTR _prev_finalizer_data; \ - \ - GC_REGISTER_FINALIZER_NO_ORDER (SCM2PTR (z), scm_i_finalize_smob, \ - NULL, \ - &_prev_finalizer, \ - &_prev_finalizer_data); \ - } \ - } \ -while (0) - -#define SCM_RETURN_NEWSMOB(tc, data) \ - do { SCM __SCM_smob_answer; \ - SCM_NEWSMOB (__SCM_smob_answer, (tc), (data)); \ - return __SCM_smob_answer; \ - } while (0) - -#define SCM_NEWSMOB2(z, tc, data1, data2) \ - SCM_NEWSMOB3 (z, tc, data1, data2, 0) - -#define SCM_RETURN_NEWSMOB2(tc, data1, data2) \ - do { SCM __SCM_smob_answer; \ - SCM_NEWSMOB2 (__SCM_smob_answer, (tc), (data1), (data2)); \ - return __SCM_smob_answer; \ - } while (0) - -#define SCM_NEWSMOB3(z, tc, data1, data2, data3) \ -do \ - { \ - register scm_t_bits _smobnum = SCM_TC2SMOBNUM (tc); \ - z = (scm_smobs[_smobnum].mark \ - ? scm_i_new_smob_with_mark_proc (tc, (scm_t_bits)(data1), \ - (scm_t_bits)(data2), \ - (scm_t_bits)(data3)) \ - : scm_double_cell ((tc), (scm_t_bits)(data1), \ - (scm_t_bits)(data2), \ - (scm_t_bits)(data3))); \ - if (scm_smobs[_smobnum].free) \ - { \ - GC_finalization_proc _prev_finalizer; \ - GC_PTR _prev_finalizer_data; \ - \ - GC_REGISTER_FINALIZER_NO_ORDER (SCM2PTR (z), scm_i_finalize_smob, \ - NULL, \ - &_prev_finalizer, \ - &_prev_finalizer_data); \ - } \ - } \ -while (0) - -#define SCM_RETURN_NEWSMOB3(tc, data1, data2, data3) \ - do { SCM __SCM_smob_answer; \ - SCM_NEWSMOB3 (__SCM_smob_answer, (tc), (data1), (data2), (data3)); \ - return __SCM_smob_answer; \ - } while (0) +SCM_API SCM scm_i_new_smob (scm_t_bits tc, scm_t_bits); +SCM_API SCM scm_i_new_double_smob (scm_t_bits tc, scm_t_bits, + scm_t_bits, scm_t_bits); + + +SCM_INLINE SCM scm_new_smob (scm_t_bits tc, scm_t_bits); +SCM_INLINE SCM scm_new_double_smob (scm_t_bits tc, scm_t_bits, + scm_t_bits, scm_t_bits); + +#if SCM_CAN_INLINE || defined SCM_INLINE_C_IMPLEMENTING_INLINES +SCM_INLINE_IMPLEMENTATION SCM +scm_new_smob (scm_t_bits tc, scm_t_bits data) +{ + scm_t_bits smobnum = SCM_TC2SMOBNUM (tc); + + if (SCM_UNLIKELY (scm_smobs[smobnum].mark || scm_smobs[smobnum].free)) + return scm_i_new_smob (tc, data); + else + return scm_cell (tc, data); +} + +SCM_INLINE_IMPLEMENTATION SCM +scm_new_double_smob (scm_t_bits tc, scm_t_bits data1, + scm_t_bits data2, scm_t_bits data3) +{ + scm_t_bits smobnum = SCM_TC2SMOBNUM (tc); + + if (SCM_UNLIKELY (scm_smobs[smobnum].mark || scm_smobs[smobnum].free)) + return scm_i_new_double_smob (tc, data1, data2, data3); + else + return scm_double_cell (tc, data1, data2, data3); +} +#endif + +#define SCM_NEWSMOB(z, tc, data) \ + z = scm_new_smob ((tc), (scm_t_bits)(data)) +#define SCM_RETURN_NEWSMOB(tc, data) \ + return scm_new_smob ((tc), (scm_t_bits)(data)) + +#define SCM_NEWSMOB2(z, tc, data1, data2) \ + z = scm_new_double_smob ((tc), (scm_t_bits)(data1), \ + (scm_t_bits)(data2), 0) +#define SCM_RETURN_NEWSMOB2(tc, data1, data2) \ + return scm_new_double_smob ((tc), (scm_t_bits)(data1), \ + (scm_t_bits)(data2), 0) + +#define SCM_NEWSMOB3(z, tc, data1, data2, data3) \ + z = scm_new_double_smob ((tc), (scm_t_bits)(data1), \ + (scm_t_bits)(data2), (scm_t_bits)(data3)) +#define SCM_RETURN_NEWSMOB3(tc, data1, data2, data3) \ + return scm_new_double_smob ((tc), (scm_t_bits)(data1), \ + (scm_t_bits)(data2), (scm_t_bits)(data3)) + + #define SCM_SMOB_DATA_N(x, n) (SCM_CELL_WORD ((x), (n))) #define SCM_SET_SMOB_DATA_N(x, n, data) (SCM_SET_CELL_WORD ((x), (n), (data))) @@ -158,28 +157,11 @@ while (0) #define SCM_SMOB_OBJECT_LOC(x) (SCM_SMOB_OBJECT_1_LOC (x))) -#define SCM_SMOB_TYPE_MASK 0xffff -#define SCM_SMOB_TYPE_BITS(tc) (tc) -#define SCM_TC2SMOBNUM(x) (0x0ff & ((x) >> 8)) -#define SCM_SMOBNUM(x) (SCM_TC2SMOBNUM (SCM_CELL_TYPE (x))) -/* SCM_SMOBNAME can be 0 if name is missing */ -#define SCM_SMOBNAME(smobnum) (scm_smobs[smobnum].name) -#define SCM_SMOB_PREDICATE(tag, obj) SCM_TYP16_PREDICATE (tag, obj) -#define SCM_SMOB_DESCRIPTOR(x) (scm_smobs[SCM_SMOBNUM (x)]) -#define SCM_SMOB_APPLICABLE_P(x) (SCM_SMOB_DESCRIPTOR (x).apply) #define SCM_SMOB_APPLY_0(x) (scm_call_0 (x)) #define SCM_SMOB_APPLY_1(x, a1) (scm_call_1 (x, a1)) #define SCM_SMOB_APPLY_2(x, a1, a2) (scm_call_2 (x, a1, a2)) #define SCM_SMOB_APPLY_3(x, a1, a2, rst) (scm_call_3 (x, a1, a2, a3)) -/* Maximum number of SMOB types. */ -#define SCM_I_MAX_SMOB_TYPE_COUNT 256 - -SCM_API long scm_numsmob; -SCM_API scm_smob_descriptor scm_smobs[]; - -SCM_API void scm_i_finalize_smob (GC_PTR obj, GC_PTR data); - SCM_API SCM scm_mark0 (SCM ptr); diff --git a/libguile/snarf.h b/libguile/snarf.h index 1c072babb..3931570f4 100644 --- a/libguile/snarf.h +++ b/libguile/snarf.h @@ -119,9 +119,9 @@ SCM_SNARF_HERE( \ ) \ SCM_SNARF_INIT( \ /* Initialize the foreign. */ \ - scm_i_paste (FNAME, __raw_objtable)[2] = scm_i_paste (FNAME, __subr_foreign); \ + scm_i_paste (FNAME, __raw_objtable)[1] = scm_i_paste (FNAME, __subr_foreign); \ /* Initialize the procedure name (an interned symbol). */ \ - scm_i_paste (FNAME, __raw_objtable)[3] = scm_i_paste (FNAME, __name); \ + scm_i_paste (FNAME, __raw_objtable)[2] = scm_i_paste (FNAME, __name); \ /* Initialize the objcode trampoline. */ \ SCM_SET_CELL_OBJECT (scm_i_paste (FNAME, __subr), 1, \ scm_subr_objcode_trampoline (REQ, OPT, VAR)); \ @@ -209,11 +209,11 @@ SCM_SNARF_INIT( \ # define SCM_SYMBOL(c_name, scheme_name) \ SCM_SNARF_HERE(static SCM c_name) \ -SCM_SNARF_INIT(c_name = scm_from_locale_symbol (scheme_name)) +SCM_SNARF_INIT(c_name = scm_from_utf8_symbol (scheme_name)) # define SCM_GLOBAL_SYMBOL(c_name, scheme_name) \ SCM_SNARF_HERE(SCM c_name) \ -SCM_SNARF_INIT(c_name = scm_from_locale_symbol (scheme_name)) +SCM_SNARF_INIT(c_name = scm_from_utf8_symbol (scheme_name)) #endif /* !SCM_SUPPORT_STATIC_ALLOCATION */ @@ -366,12 +366,11 @@ SCM_SNARF_INIT(scm_set_smob_apply((tag), (c_name), (req), (opt), (rest));) /* for primitive-generics, add a foreign to the end */ #define SCM_STATIC_SUBR_OBJVECT(c_name, foreign) \ - static SCM_ALIGNED (8) SCM c_name[4] = \ + static SCM_ALIGNED (8) SCM c_name[3] = \ { \ SCM_PACK (scm_tc7_vector | (2 << 8)), \ - SCM_PACK (0), \ foreign, \ - SCM_BOOL_F, /* the name */ \ + SCM_BOOL_F /* the name */ \ } #define SCM_STATIC_PROGRAM(c_name, objcode, objtable, freevars) \ diff --git a/libguile/socket.c b/libguile/socket.c index 7d0049b1c..d085d330e 100644 --- a/libguile/socket.c +++ b/libguile/socket.c @@ -39,10 +39,6 @@ #include "libguile/validate.h" #include "libguile/socket.h" -#if SCM_ENABLE_DEPRECATED == 1 -# include "libguile/deprecation.h" -#endif - #ifdef __MINGW32__ #include "win32-socket.h" #include <netdb.h> @@ -1414,33 +1410,12 @@ SCM_DEFINE (scm_recv, "recv!", 2, 1, 0, flg = scm_to_int (flags); fd = SCM_FPORT_FDES (sock); -#if SCM_ENABLE_DEPRECATED == 1 - if (SCM_UNLIKELY (scm_is_string (buf))) - { - SCM msg; - char *dest; - size_t len; - - scm_c_issue_deprecation_warning - ("Passing a string to `recv!' is deprecated, " - "use a bytevector instead."); - - len = scm_i_string_length (buf); - msg = scm_i_make_string (len, &dest, 0); - SCM_SYSCALL (rv = recv (fd, dest, len, flg)); - scm_string_copy_x (buf, scm_from_int (0), - msg, scm_from_int (0), scm_from_size_t (len)); - } - else -#endif - { - SCM_VALIDATE_BYTEVECTOR (1, buf); + SCM_VALIDATE_BYTEVECTOR (1, buf); - SCM_SYSCALL (rv = recv (fd, - SCM_BYTEVECTOR_CONTENTS (buf), - SCM_BYTEVECTOR_LENGTH (buf), - flg)); - } + SCM_SYSCALL (rv = recv (fd, + SCM_BYTEVECTOR_CONTENTS (buf), + SCM_BYTEVECTOR_LENGTH (buf), + flg)); if (SCM_UNLIKELY (rv == -1)) SCM_SYSERROR; @@ -1480,35 +1455,12 @@ SCM_DEFINE (scm_send, "send", 2, 1, 0, fd = SCM_FPORT_FDES (sock); -#if SCM_ENABLE_DEPRECATED == 1 - if (SCM_UNLIKELY (scm_is_string (message))) - { - scm_c_issue_deprecation_warning - ("Passing a string to `send' is deprecated, " - "use a bytevector instead."); - - /* If the string is wide, see if it can be coerced into a narrow - string. */ - if (!scm_i_is_narrow_string (message) - || !scm_i_try_narrow_string (message)) - SCM_MISC_ERROR ("the message string is not 8-bit: ~s", - scm_list_1 (message)); - - SCM_SYSCALL (rv = send (fd, - scm_i_string_chars (message), - scm_i_string_length (message), - flg)); - } - else -#endif - { - SCM_VALIDATE_BYTEVECTOR (1, message); + SCM_VALIDATE_BYTEVECTOR (1, message); - SCM_SYSCALL (rv = send (fd, - SCM_BYTEVECTOR_CONTENTS (message), - SCM_BYTEVECTOR_LENGTH (message), - flg)); - } + SCM_SYSCALL (rv = send (fd, + SCM_BYTEVECTOR_CONTENTS (message), + SCM_BYTEVECTOR_LENGTH (message), + flg)); if (rv == -1) SCM_SYSERROR; @@ -1566,52 +1518,28 @@ SCM_DEFINE (scm_recvfrom, "recvfrom!", 2, 3, 0, ((struct sockaddr *) &addr)->sa_family = AF_UNSPEC; -#if SCM_ENABLE_DEPRECATED == 1 - if (SCM_UNLIKELY (scm_is_string (buf))) - { - char *cbuf; - - scm_c_issue_deprecation_warning - ("Passing a string to `recvfrom!' is deprecated, " - "use a bytevector instead."); - - scm_i_get_substring_spec (scm_i_string_length (buf), - start, &offset, end, &cend); + SCM_VALIDATE_BYTEVECTOR (1, buf); - buf = scm_i_string_start_writing (buf); - cbuf = scm_i_string_writable_chars (buf); + if (SCM_UNBNDP (start)) + offset = 0; + else + offset = scm_to_size_t (start); - SCM_SYSCALL (rv = recvfrom (fd, cbuf + offset, - cend - offset, flg, - (struct sockaddr *) &addr, &addr_size)); - scm_i_string_stop_writing (); - } + if (SCM_UNBNDP (end)) + cend = SCM_BYTEVECTOR_LENGTH (buf); else -#endif { - SCM_VALIDATE_BYTEVECTOR (1, buf); - - if (SCM_UNBNDP (start)) - offset = 0; - else - offset = scm_to_size_t (start); - - if (SCM_UNBNDP (end)) - cend = SCM_BYTEVECTOR_LENGTH (buf); - else - { - cend = scm_to_size_t (end); - if (SCM_UNLIKELY (cend >= SCM_BYTEVECTOR_LENGTH (buf) - || cend < offset)) - scm_out_of_range (FUNC_NAME, end); - } - - SCM_SYSCALL (rv = recvfrom (fd, - SCM_BYTEVECTOR_CONTENTS (buf) + offset, - cend - offset, flg, - (struct sockaddr *) &addr, &addr_size)); + cend = scm_to_size_t (end); + if (SCM_UNLIKELY (cend >= SCM_BYTEVECTOR_LENGTH (buf) + || cend < offset)) + scm_out_of_range (FUNC_NAME, end); } + SCM_SYSCALL (rv = recvfrom (fd, + SCM_BYTEVECTOR_CONTENTS (buf) + offset, + cend - offset, flg, + (struct sockaddr *) &addr, &addr_size)); + if (rv == -1) SCM_SYSERROR; @@ -1681,35 +1609,12 @@ SCM_DEFINE (scm_sendto, "sendto", 3, 1, 1, flg = SCM_NUM2ULONG (5, SCM_CAR (args_and_flags)); } -#if SCM_ENABLE_DEPRECATED == 1 - if (SCM_UNLIKELY (scm_is_string (message))) - { - scm_c_issue_deprecation_warning - ("Passing a string to `sendto' is deprecated, " - "use a bytevector instead."); - - /* If the string is wide, see if it can be coerced into a narrow - string. */ - if (!scm_i_is_narrow_string (message) - || !scm_i_try_narrow_string (message)) - SCM_MISC_ERROR ("the message string is not 8-bit: ~s", - scm_list_1 (message)); - - SCM_SYSCALL (rv = sendto (fd, - scm_i_string_chars (message), - scm_i_string_length (message), - flg, soka, size)); - } - else -#endif - { - SCM_VALIDATE_BYTEVECTOR (1, message); + SCM_VALIDATE_BYTEVECTOR (1, message); - SCM_SYSCALL (rv = sendto (fd, - SCM_BYTEVECTOR_CONTENTS (message), - SCM_BYTEVECTOR_LENGTH (message), - flg, soka, size)); - } + SCM_SYSCALL (rv = sendto (fd, + SCM_BYTEVECTOR_CONTENTS (message), + SCM_BYTEVECTOR_LENGTH (message), + flg, soka, size)); if (rv == -1) { diff --git a/libguile/srcprop.c b/libguile/srcprop.c index dc333d46c..f63f1bc61 100644 --- a/libguile/srcprop.c +++ b/libguile/srcprop.c @@ -33,7 +33,6 @@ #include "libguile/hash.h" #include "libguile/ports.h" #include "libguile/root.h" -#include "libguile/weaks.h" #include "libguile/gc.h" #include "libguile/validate.h" @@ -61,7 +60,6 @@ SCM_GLOBAL_SYMBOL (scm_sym_line, "line"); SCM_GLOBAL_SYMBOL (scm_sym_column, "column"); static SCM scm_source_whash; -static scm_i_pthread_mutex_t source_lock = SCM_I_PTHREAD_MUTEX_INITIALIZER; /* @@ -97,11 +95,11 @@ static int srcprops_print (SCM obj, SCM port, scm_print_state *pstate) { int writingp = SCM_WRITINGP (pstate); - scm_puts ("#<srcprops ", port); + scm_puts_unlocked ("#<srcprops ", port); SCM_SET_WRITINGP (pstate, 1); scm_iprin1 (scm_srcprops_to_alist (obj), port, pstate); SCM_SET_WRITINGP (pstate, writingp); - scm_putc ('>', port); + scm_putc_unlocked ('>', port); return 1; } @@ -167,9 +165,7 @@ SCM_DEFINE (scm_source_properties, "source-properties", 1, 0, 0, SCM p; SCM_VALIDATE_NIM (1, obj); - scm_i_pthread_mutex_lock (&source_lock); - p = scm_hashq_ref (scm_source_whash, obj, SCM_EOL); - scm_i_pthread_mutex_unlock (&source_lock); + p = scm_weak_table_refq (scm_source_whash, obj, SCM_EOL); if (SRCPROPSP (p)) return scm_srcprops_to_alist (p); @@ -189,9 +185,7 @@ SCM_DEFINE (scm_set_source_properties_x, "set-source-properties!", 2, 0, 0, { SCM_VALIDATE_NIM (1, obj); - scm_i_pthread_mutex_lock (&source_lock); - scm_hashq_set_x (scm_source_whash, obj, alist); - scm_i_pthread_mutex_unlock (&source_lock); + scm_weak_table_putq_x (scm_source_whash, obj, alist); return alist; } @@ -205,9 +199,7 @@ scm_i_has_source_properties (SCM obj) SCM_VALIDATE_NIM (1, obj); - scm_i_pthread_mutex_lock (&source_lock); - ret = scm_is_true (scm_hashq_ref (scm_source_whash, obj, SCM_BOOL_F)); - scm_i_pthread_mutex_unlock (&source_lock); + ret = scm_is_true (scm_weak_table_refq (scm_source_whash, obj, SCM_BOOL_F)); return ret; } @@ -220,14 +212,12 @@ scm_i_set_source_properties_x (SCM obj, long line, int col, SCM fname) { SCM_VALIDATE_NIM (1, obj); - scm_i_pthread_mutex_lock (&source_lock); - scm_hashq_set_x (scm_source_whash, obj, - scm_make_srcprops (line, col, fname, - SCM_COPY_SOURCE_P - ? scm_copy_tree (obj) - : SCM_UNDEFINED, - SCM_EOL)); - scm_i_pthread_mutex_unlock (&source_lock); + scm_weak_table_putq_x (scm_source_whash, obj, + scm_make_srcprops (line, col, fname, + SCM_COPY_SOURCE_P + ? scm_copy_tree (obj) + : SCM_UNDEFINED, + SCM_EOL)); } #undef FUNC_NAME @@ -240,9 +230,7 @@ SCM_DEFINE (scm_source_property, "source-property", 2, 0, 0, SCM p; SCM_VALIDATE_NIM (1, obj); - scm_i_pthread_mutex_lock (&source_lock); - p = scm_hashq_ref (scm_source_whash, obj, SCM_EOL); - scm_i_pthread_mutex_unlock (&source_lock); + p = scm_weak_table_refq (scm_source_whash, obj, SCM_EOL); if (!SRCPROPSP (p)) goto alist; @@ -257,7 +245,7 @@ SCM_DEFINE (scm_source_property, "source-property", 2, 0, 0, p = SRCPROPALIST (p); alist: p = scm_assoc (key, p); - return (SCM_NIMP (p) ? SCM_CDR (p) : SCM_BOOL_F); + return (scm_is_pair (p) ? SCM_CDR (p) : SCM_BOOL_F); } return SCM_UNBNDP (p) ? SCM_BOOL_F : p; } @@ -272,44 +260,44 @@ SCM_DEFINE (scm_set_source_property_x, "set-source-property!", 3, 0, 0, SCM p; SCM_VALIDATE_NIM (1, obj); - scm_i_pthread_mutex_lock (&source_lock); - p = scm_hashq_ref (scm_source_whash, obj, SCM_EOL); + scm_i_pthread_mutex_lock (&scm_i_misc_mutex); + p = scm_weak_table_refq (scm_source_whash, obj, SCM_EOL); if (scm_is_eq (scm_sym_line, key)) { if (SRCPROPSP (p)) SETSRCPROPLINE (p, scm_to_int (datum)); else - scm_hashq_set_x (scm_source_whash, obj, - scm_make_srcprops (scm_to_int (datum), 0, - SCM_UNDEFINED, SCM_UNDEFINED, p)); + scm_weak_table_putq_x (scm_source_whash, obj, + scm_make_srcprops (scm_to_int (datum), 0, + SCM_UNDEFINED, SCM_UNDEFINED, p)); } else if (scm_is_eq (scm_sym_column, key)) { if (SRCPROPSP (p)) SETSRCPROPCOL (p, scm_to_int (datum)); else - scm_hashq_set_x (scm_source_whash, obj, - scm_make_srcprops (0, scm_to_int (datum), - SCM_UNDEFINED, SCM_UNDEFINED, p)); + scm_weak_table_putq_x (scm_source_whash, obj, + scm_make_srcprops (0, scm_to_int (datum), + SCM_UNDEFINED, SCM_UNDEFINED, p)); } else if (scm_is_eq (scm_sym_copy, key)) { if (SRCPROPSP (p)) SETSRCPROPCOPY (p, datum); else - scm_hashq_set_x (scm_source_whash, obj, - scm_make_srcprops (0, 0, SCM_UNDEFINED, datum, p)); + scm_weak_table_putq_x (scm_source_whash, obj, + scm_make_srcprops (0, 0, SCM_UNDEFINED, datum, p)); } else { if (SRCPROPSP (p)) SETSRCPROPALIST (p, scm_acons (key, datum, SRCPROPALIST (p))); else - scm_hashq_set_x (scm_source_whash, obj, - scm_acons (key, datum, p)); + scm_weak_table_putq_x (scm_source_whash, obj, + scm_acons (key, datum, p)); } - scm_i_pthread_mutex_unlock (&source_lock); + scm_i_pthread_mutex_unlock (&scm_i_misc_mutex); return SCM_UNSPECIFIED; } @@ -325,12 +313,10 @@ SCM_DEFINE (scm_cons_source, "cons-source", 3, 0, 0, { SCM p, z; z = scm_cons (x, y); - scm_i_pthread_mutex_lock (&source_lock); /* Copy source properties possibly associated with xorig. */ - p = scm_hashq_ref (scm_source_whash, xorig, SCM_BOOL_F); + p = scm_weak_table_refq (scm_source_whash, xorig, SCM_BOOL_F); if (scm_is_true (p)) - scm_hashq_set_x (scm_source_whash, z, p); - scm_i_pthread_mutex_unlock (&source_lock); + scm_weak_table_putq_x (scm_source_whash, z, p); return z; } #undef FUNC_NAME @@ -342,7 +328,7 @@ scm_init_srcprop () scm_tc16_srcprops = scm_make_smob_type ("srcprops", 0); scm_set_smob_print (scm_tc16_srcprops, srcprops_print); - scm_source_whash = scm_make_weak_key_hash_table (scm_from_int (2047)); + scm_source_whash = scm_c_make_weak_table (2047, SCM_WEAK_TABLE_KIND_KEY); scm_c_define ("source-whash", scm_source_whash); scm_last_alist_filename = scm_cons (SCM_EOL, diff --git a/libguile/srfi-14.c b/libguile/srfi-14.c index e2f66681a..09323704d 100644 --- a/libguile/srfi-14.c +++ b/libguile/srfi-14.c @@ -597,27 +597,27 @@ charset_print (SCM charset, SCM port, scm_print_state *pstate SCM_UNUSED) p = SCM_CHARSET_DATA (charset); - scm_puts ("#<charset {", port); + scm_puts_unlocked ("#<charset {", port); for (i = 0; i < p->len; i++) { if (first) first = 0; else - scm_puts (" ", port); + scm_puts_unlocked (" ", port); scm_write (SCM_MAKE_CHAR (p->ranges[i].lo), port); if (p->ranges[i].lo != p->ranges[i].hi) { - scm_puts ("..", port); + scm_puts_unlocked ("..", port); scm_write (SCM_MAKE_CHAR (p->ranges[i].hi), port); } if (i >= max_ranges_to_print) { /* Too many to print here. Quit early. */ - scm_puts (" ...", port); + scm_puts_unlocked (" ...", port); break; } } - scm_puts ("}>", port); + scm_puts_unlocked ("}>", port); return 1; } @@ -630,16 +630,16 @@ charset_cursor_print (SCM cursor, SCM port, cur = (scm_t_char_set_cursor *) SCM_SMOB_DATA (cursor); - scm_puts ("#<charset-cursor ", port); + scm_puts_unlocked ("#<charset-cursor ", port); if (cur->range == (size_t) (-1)) - scm_puts ("(empty)", port); + scm_puts_unlocked ("(empty)", port); else { scm_write (scm_from_size_t (cur->range), port); - scm_puts (":", port); + scm_puts_unlocked (":", port); scm_write (scm_from_int32 (cur->n), port); } - scm_puts (">", port); + scm_puts_unlocked (">", port); return 1; } diff --git a/libguile/srfi-14.h b/libguile/srfi-14.h index 4b1a4b298..dc9718d70 100644 --- a/libguile/srfi-14.h +++ b/libguile/srfi-14.h @@ -3,7 +3,7 @@ /* srfi-14.c --- SRFI-14 procedures for Guile * - * Copyright (C) 2001, 2004, 2006, 2008 Free Software Foundation, Inc. + * Copyright (C) 2001, 2004, 2006, 2008, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -45,7 +45,7 @@ typedef struct #define SCM_CHARSET_GET(cs,idx) \ scm_i_charset_get((scm_t_char_set *)SCM_SMOB_DATA(cs),idx) -#define SCM_CHARSETP(x) (!SCM_IMP (x) && (SCM_TYP16 (x) == scm_tc16_charset)) +#define SCM_CHARSETP(x) (SCM_HAS_TYP16 (x, scm_tc16_charset)) /* Smob type code for character sets. */ SCM_API int scm_tc16_charset; diff --git a/libguile/srfi-4.c b/libguile/srfi-4.c index af8126d03..ff0c414d7 100644 --- a/libguile/srfi-4.c +++ b/libguile/srfi-4.c @@ -1,6 +1,6 @@ /* srfi-4.c --- Uniform numeric vector datatypes. * - * Copyright (C) 2001, 2004, 2006, 2009, 2010 Free Software Foundation, Inc. + * Copyright (C) 2001, 2004, 2006, 2009, 2010, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -113,7 +113,8 @@ #define DEFINE_SRFI_4_C_FUNCS(TAG, tag, ctype, width) \ SCM scm_take_##tag##vector (ctype *data, size_t n) \ { \ - return scm_c_take_typed_bytevector ((scm_t_int8*)data, n, ETYPE (TAG)); \ + return scm_c_take_typed_bytevector ((scm_t_int8*)data, n, ETYPE (TAG), \ + SCM_BOOL_F); \ } \ const ctype* scm_array_handle_##tag##_elements (scm_t_array_handle *h) \ { \ diff --git a/libguile/srfi-4.h b/libguile/srfi-4.h index b55fd1d09..0e5afc35a 100644 --- a/libguile/srfi-4.h +++ b/libguile/srfi-4.h @@ -2,7 +2,7 @@ #define SCM_SRFI_4_H /* srfi-4.c --- Homogeneous numeric vector datatypes. * - * Copyright (C) 2001, 2004, 2006, 2008, 2009, 2010 Free Software Foundation, Inc. + * Copyright (C) 2001, 2004, 2006, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -279,16 +279,6 @@ SCM_INTERNAL const char *scm_i_uniform_vector_tag (SCM uvec); SCM_INTERNAL scm_i_t_array_ref scm_i_uniform_vector_ref_proc (SCM uvec); SCM_INTERNAL scm_i_t_array_set scm_i_uniform_vector_set_proc (SCM uvec); -#if SCM_ENABLE_DEPRECATED - -/* Deprecated because we want people to use the scm_t_array_handle - interface. -*/ - -SCM_DEPRECATED size_t scm_uniform_element_size (SCM obj); - -#endif - SCM_INTERNAL void scm_init_srfi_4 (void); #endif /* SCM_SRFI_4_H */ diff --git a/libguile/stackchk.c b/libguile/stackchk.c index 6cfb783b1..208ba97ed 100644 --- a/libguile/stackchk.c +++ b/libguile/stackchk.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995,1996,1997, 2000, 2001, 2006, 2008, 2010 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996,1997, 2000, 2001, 2006, 2008, 2010, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -34,7 +34,6 @@ /* {Stack Checking} */ -#ifdef STACK_CHECKING int scm_stack_checking_enabled_p; SCM_SYMBOL (scm_stack_overflow_key, "stack-overflow"); @@ -65,8 +64,6 @@ scm_report_stack_overflow () scm_dynwind_end (); } -#endif - long scm_stack_size (SCM_STACKITEM *start) { @@ -89,11 +86,11 @@ scm_stack_report () scm_uintprint ((scm_stack_size (thread->continuation_base) * sizeof (SCM_STACKITEM)), 16, port); - scm_puts (" of stack: 0x", port); + scm_puts_unlocked (" of stack: 0x", port); scm_uintprint ((scm_t_bits) thread->continuation_base, 16, port); - scm_puts (" - 0x", port); + scm_puts_unlocked (" - 0x", port); scm_uintprint ((scm_t_bits) &stack, 16, port); - scm_puts ("\n", port); + scm_puts_unlocked ("\n", port); } diff --git a/libguile/stackchk.h b/libguile/stackchk.h index aa6a1d493..1ed170fef 100644 --- a/libguile/stackchk.h +++ b/libguile/stackchk.h @@ -3,7 +3,7 @@ #ifndef SCM_STACKCHK_H #define SCM_STACKCHK_H -/* Copyright (C) 1995,1996,1998,2000, 2003, 2006, 2008, 2009, 2010 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996,1998,2000, 2003, 2006, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -34,7 +34,7 @@ */ #define SCM_STACK_CHECKING_P SCM_STACK_LIMIT -#if defined BUILDING_LIBGUILE && defined STACK_CHECKING +#if defined BUILDING_LIBGUILE #include "libguile/private-options.h" # if SCM_STACK_GROWS_UP # define SCM_STACK_OVERFLOW_P(s)\ diff --git a/libguile/strings.c b/libguile/strings.c index 666a9516b..b9963010f 100644 --- a/libguile/strings.c +++ b/libguile/strings.c @@ -126,7 +126,7 @@ make_stringbuf (size_t len) lenhist[1000]++; #endif - buf = PTR2SCM (scm_gc_malloc_pointerless (STRINGBUF_HEADER_BYTES + len + 1, + buf = SCM_PACK_POINTER (scm_gc_malloc_pointerless (STRINGBUF_HEADER_BYTES + len + 1, "string")); SCM_SET_CELL_TYPE (buf, STRINGBUF_TAG); @@ -153,7 +153,7 @@ make_wide_stringbuf (size_t len) #endif raw_len = (len + 1) * sizeof (scm_t_wchar); - buf = PTR2SCM (scm_gc_malloc_pointerless (STRINGBUF_HEADER_BYTES + raw_len, + buf = SCM_PACK_POINTER (scm_gc_malloc_pointerless (STRINGBUF_HEADER_BYTES + raw_len, "string")); SCM_SET_CELL_TYPE (buf, STRINGBUF_TAG | STRINGBUF_F_WIDE); @@ -240,7 +240,7 @@ scm_i_pthread_mutex_t stringbuf_write_mutex = SCM_I_PTHREAD_MUTEX_INITIALIZER; #define SET_STRING_STRINGBUF(str,buf) (SCM_SET_CELL_OBJECT_1(str,buf)) #define SET_STRING_START(str,start) (SCM_SET_CELL_WORD_2(str,start)) -#define IS_STRING(str) (SCM_NIMP(str) && SCM_TYP7(str) == STRING_TAG) +#define IS_STRING(str) (SCM_HAS_TYP7 (str, STRING_TAG)) /* Read-only strings. */ @@ -1446,6 +1446,23 @@ scm_decoding_error (const char *subr, int err, const char *message, SCM port) /* String conversion to/from C. */ +static void +decoding_error (const char *func_name, int errno_save, + const char *str, size_t len) +{ + /* Raise an error and pass the raw C string as a bytevector to the `throw' + handler. */ + SCM bv; + signed char *buf; + + buf = scm_gc_malloc_pointerless (len, "bytevector"); + memcpy (buf, str, len); + bv = scm_c_take_gc_bytevector (buf, len, SCM_BOOL_F); + + scm_decoding_error (func_name, errno_save, + "input locale conversion error", bv); +} + SCM scm_from_stringn (const char *str, size_t len, const char *encoding, scm_t_string_failed_conversion_handler handler) @@ -1481,19 +1498,7 @@ scm_from_stringn (const char *str, size_t len, const char *encoding, NULL, &u32len); if (SCM_UNLIKELY (u32 == NULL)) - { - /* Raise an error and pass the raw C string as a bytevector to the `throw' - handler. */ - SCM bv; - signed char *buf; - - buf = scm_gc_malloc_pointerless (len, "bytevector"); - memcpy (buf, str, len); - bv = scm_c_take_gc_bytevector (buf, len); - - scm_decoding_error (__func__, errno, - "input locale conversion error", bv); - } + decoding_error (__func__, errno, str, len); i = 0; while (i < u32len) @@ -1567,7 +1572,81 @@ scm_from_utf8_string (const char *str) SCM scm_from_utf8_stringn (const char *str, size_t len) { - return scm_from_stringn (str, len, "UTF-8", SCM_FAILED_CONVERSION_ERROR); + size_t i, char_len; + const scm_t_uint8 *ustr = (const scm_t_uint8 *) str; + int ascii = 1, narrow = 1; + SCM res; + + if (len == (size_t) -1) + len = strlen (str); + + i = 0; + char_len = 0; + + while (i < len) + { + if (ustr[i] <= 127) + { + char_len++; + i++; + } + else + { + ucs4_t c; + int nbytes; + + ascii = 0; + + nbytes = u8_mbtouc (&c, ustr + i, len - i); + + if (nbytes < 0) + /* Bad UTF-8. */ + decoding_error (__func__, errno, str, len); + + if (c > 255) + narrow = 0; + + char_len++; + i += nbytes; + } + } + + if (ascii) + { + char *dst; + res = scm_i_make_string (char_len, &dst, 0); + memcpy (dst, str, len); + } + else if (narrow) + { + char *dst; + size_t j; + ucs4_t c; + + res = scm_i_make_string (char_len, &dst, 0); + + for (i = 0, j = 0; i < len; i++, j++) + { + i += u8_mbtouc_unsafe (&c, ustr + i, len - i); + dst[j] = (signed char) c; + } + } + else + { + scm_t_wchar *dst; + size_t j; + ucs4_t c; + + res = scm_i_make_wide_string (char_len, &dst, 0); + + for (i = 0, j = 0; i < len; i++, j++) + { + i += u8_mbtouc_unsafe (&c, ustr + i, len - i); + dst[j] = c; + } + } + + return res; } SCM @@ -2131,66 +2210,6 @@ scm_i_get_substring_spec (size_t len, *cend = scm_to_unsigned_integer (end, *cstart, len); } -#if SCM_ENABLE_DEPRECATED - -/* When these definitions are removed, it becomes reasonable to use - read-only strings for string literals. For that, change the reader - to create string literals with scm_c_substring_read_only instead of - with scm_c_substring_copy. -*/ - -int -scm_i_deprecated_stringp (SCM str) -{ - scm_c_issue_deprecation_warning - ("SCM_STRINGP is deprecated. Use scm_is_string instead."); - - return scm_is_string (str); -} - -char * -scm_i_deprecated_string_chars (SCM str) -{ - char *chars; - - scm_c_issue_deprecation_warning - ("SCM_STRING_CHARS is deprecated. See the manual for alternatives."); - - /* We don't accept shared substrings here since they are not - null-terminated. - */ - if (IS_SH_STRING (str)) - scm_misc_error (NULL, - "SCM_STRING_CHARS does not work with shared substrings", - SCM_EOL); - - /* We explicitly test for read-only strings to produce a better - error message. - */ - - if (IS_RO_STRING (str)) - scm_misc_error (NULL, - "SCM_STRING_CHARS does not work with read-only strings", - SCM_EOL); - - /* The following is still wrong, of course... - */ - str = scm_i_string_start_writing (str); - chars = scm_i_string_writable_chars (str); - scm_i_string_stop_writing (); - return chars; -} - -size_t -scm_i_deprecated_string_length (SCM str) -{ - scm_c_issue_deprecation_warning - ("SCM_STRING_LENGTH is deprecated. Use scm_c_string_length instead."); - return scm_c_string_length (str); -} - -#endif - static SCM string_handle_ref (scm_t_array_handle *h, size_t index) { diff --git a/libguile/strings.h b/libguile/strings.h index b1fc51a38..0c163db5a 100644 --- a/libguile/strings.h +++ b/libguile/strings.h @@ -235,21 +235,6 @@ SCM_API SCM scm_sys_stringbuf_hist (void); -/* deprecated stuff */ - -#if SCM_ENABLE_DEPRECATED - -SCM_DEPRECATED int scm_i_deprecated_stringp (SCM obj); -SCM_DEPRECATED char *scm_i_deprecated_string_chars (SCM str); -SCM_DEPRECATED size_t scm_i_deprecated_string_length (SCM str); - -#define SCM_STRINGP(x) scm_i_deprecated_stringp(x) -#define SCM_STRING_CHARS(x) scm_i_deprecated_string_chars(x) -#define SCM_STRING_LENGTH(x) scm_i_deprecated_string_length(x) -#define SCM_STRING_UCHARS(str) ((unsigned char *)SCM_STRING_CHARS (str)) - -#endif - SCM_INTERNAL void scm_init_strings (void); #endif /* SCM_STRINGS_H */ diff --git a/libguile/strports.c b/libguile/strports.c index b7fec4703..fc52a86e1 100644 --- a/libguile/strports.c +++ b/libguile/strports.c @@ -207,7 +207,7 @@ st_seek (SCM port, scm_t_off offset, int whence) st_flush (port); if (pt->rw_active == SCM_PORT_READ) - scm_end_input (port); + scm_end_input_unlocked (port); switch (whence) { @@ -277,17 +277,14 @@ scm_mkstrport (SCM pos, SCM str, long modes, const char *caller) { SCM z, buf; scm_t_port *pt; - size_t str_len, c_pos; + const char *encoding; + size_t read_buf_size, str_len, c_pos; char *c_buf; if (!((modes & SCM_WRTNG) || (modes & SCM_RDNG))) scm_misc_error ("scm_mkstrport", "port must read or write", SCM_EOL); - scm_dynwind_begin (0); - scm_i_dynwind_pthread_mutex_lock (&scm_i_port_table_mutex); - - z = scm_new_port_table_entry (scm_tc16_strport); - pt = SCM_PTAB_ENTRY(z); + encoding = scm_i_default_port_encoding (); if (scm_is_false (str)) { @@ -297,8 +294,8 @@ scm_mkstrport (SCM pos, SCM str, long modes, const char *caller) c_buf = (char *) SCM_BYTEVECTOR_CONTENTS (buf); /* Reset `read_buf_size'. It will contain the actual number of - bytes written to PT. */ - pt->read_buf_size = 0; + bytes written to the port. */ + read_buf_size = 0; c_pos = 0; } else @@ -308,8 +305,8 @@ scm_mkstrport (SCM pos, SCM str, long modes, const char *caller) SCM_ASSERT (scm_is_string (str), str, SCM_ARG1, caller); - /* Create a copy of STR in the encoding of PT. */ - copy = scm_to_stringn (str, &str_len, pt->encoding, + /* Create a copy of STR in ENCODING. */ + copy = scm_to_stringn (str, &str_len, encoding, SCM_FAILED_CONVERSION_ERROR); buf = scm_c_make_bytevector (str_len); c_buf = (char *) SCM_BYTEVECTOR_CONTENTS (buf); @@ -317,26 +314,26 @@ scm_mkstrport (SCM pos, SCM str, long modes, const char *caller) free (copy); c_pos = scm_to_unsigned_integer (pos, 0, str_len); - pt->read_buf_size = str_len; + read_buf_size = str_len; } - SCM_SETSTREAM (z, SCM_UNPACK (buf)); - SCM_SET_CELL_TYPE (z, scm_tc16_strport | modes); + z = scm_c_make_port_with_encoding (scm_tc16_strport, modes, + encoding, + SCM_FAILED_CONVERSION_ERROR, + (scm_t_bits)buf); + pt = SCM_PTAB_ENTRY (z); pt->write_buf = pt->read_buf = (unsigned char *) c_buf; pt->read_pos = pt->write_pos = pt->read_buf + c_pos; + pt->read_buf_size = read_buf_size; pt->write_buf_size = str_len; pt->write_end = pt->read_end = pt->read_buf + pt->read_buf_size; - pt->rw_random = 1; - scm_dynwind_end (); - /* Ensure WRITE_POS is writable. */ if ((modes & SCM_WRTNG) && pt->write_pos == pt->write_end) st_flush (z); - scm_i_set_conversion_strategy_x (z, SCM_FAILED_CONVERSION_ERROR); return z; } diff --git a/libguile/strports.h b/libguile/strports.h index 3a9c3ec01..b4bafdfc0 100644 --- a/libguile/strports.h +++ b/libguile/strports.h @@ -3,7 +3,7 @@ #ifndef SCM_STRPORTS_H #define SCM_STRPORTS_H -/* Copyright (C) 1995,1996,2000,2001,2002, 2006, 2008, 2010 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996,2000,2001,2002, 2006, 2008, 2010, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -28,8 +28,7 @@ -#define SCM_STRPORTP(x) (!SCM_IMP (x) && \ - (SCM_TYP16 (x) == scm_tc16_strport)) +#define SCM_STRPORTP(x) (SCM_HAS_TYP16 (x, scm_tc16_strport)) #define SCM_OPSTRPORTP(x) (SCM_STRPORTP (x) && \ (SCM_CELL_WORD_0 (x) & SCM_OPN)) #define SCM_OPINSTRPORTP(x) (SCM_OPSTRPORTP (x) && \ diff --git a/libguile/struct.c b/libguile/struct.c index 4a2a9d750..d022cce78 100644 --- a/libguile/struct.c +++ b/libguile/struct.c @@ -24,12 +24,13 @@ #include <alloca.h> #include <assert.h> +#define SCM_BUILDING_DEPRECATED_CODE + #include "libguile/_scm.h" #include "libguile/async.h" #include "libguile/chars.h" #include "libguile/eval.h" #include "libguile/alist.h" -#include "libguile/weaks.h" #include "libguile/hashtab.h" #include "libguile/ports.h" #include "libguile/strings.h" @@ -447,7 +448,7 @@ scm_i_alloc_struct (scm_t_bits *vtable_data, int n_words) /* Register a finalizer for the newly created instance. */ GC_finalization_proc prev_finalizer; GC_PTR prev_finalizer_data; - GC_REGISTER_FINALIZER_NO_ORDER (SCM2PTR (ret), + GC_REGISTER_FINALIZER_NO_ORDER (SCM_HEAP_OBJECT_BASE (ret), struct_finalizer_trampoline, NULL, &prev_finalizer, @@ -570,6 +571,7 @@ SCM_DEFINE (scm_make_struct, "make-struct", 2, 0, 1, +#if SCM_ENABLE_DEPRECATED == 1 SCM_DEFINE (scm_make_vtable_vtable, "make-vtable-vtable", 2, 0, 1, (SCM user_fields, SCM tail_array_size, SCM init), "Return a new, self-describing vtable structure.\n\n" @@ -664,7 +666,38 @@ SCM_DEFINE (scm_make_vtable_vtable, "make-vtable-vtable", 2, 0, 1, return obj; } #undef FUNC_NAME +#endif + +SCM +scm_i_make_vtable_vtable (SCM user_fields) +#define FUNC_NAME s_scm_make_vtable_vtable +{ + SCM fields, layout, obj; + size_t basic_size; + scm_t_bits v; + + SCM_VALIDATE_STRING (1, user_fields); + fields = scm_string_append (scm_list_2 (required_vtable_fields, + user_fields)); + layout = scm_make_struct_layout (fields); + if (!scm_is_valid_vtable_layout (layout)) + SCM_MISC_ERROR ("invalid user fields", scm_list_1 (user_fields)); + + basic_size = scm_i_symbol_length (layout) / 2; + + obj = scm_i_alloc_struct (NULL, basic_size); + /* Make it so that the vtable of OBJ is itself. */ + SCM_SET_CELL_WORD_0 (obj, (scm_t_bits) SCM_STRUCT_DATA (obj) | scm_tc3_struct); + + v = SCM_UNPACK (layout); + scm_struct_init (obj, layout, 0, 1, &v); + SCM_SET_VTABLE_FLAGS (obj, + SCM_VTABLE_FLAG_VTABLE | SCM_VTABLE_FLAG_VALIDATED); + + return obj; +} +#undef FUNC_NAME SCM_DEFINE (scm_make_vtable, "make-vtable", 1, 1, 0, (SCM fields, SCM printer), @@ -982,22 +1015,22 @@ scm_print_struct (SCM exp, SCM port, scm_print_state *pstate) { SCM vtable = SCM_STRUCT_VTABLE (exp); SCM name = scm_struct_vtable_name (vtable); - scm_puts ("#<", port); + scm_puts_unlocked ("#<", port); if (scm_is_true (name)) { scm_display (name, port); - scm_putc (' ', port); + scm_putc_unlocked (' ', port); } else { if (SCM_VTABLE_FLAG_IS_SET (vtable, SCM_VTABLE_FLAG_VTABLE)) - scm_puts ("vtable:", port); + scm_puts_unlocked ("vtable:", port); else - scm_puts ("struct:", port); + scm_puts_unlocked ("struct:", port); scm_uintprint (SCM_UNPACK (vtable), 16, port); - scm_putc (' ', port); + scm_putc_unlocked (' ', port); scm_write (SCM_VTABLE_LAYOUT (vtable), port); - scm_putc (' ', port); + scm_putc_unlocked (' ', port); } scm_uintprint (SCM_UNPACK (exp), 16, port); /* hackety hack */ @@ -1005,19 +1038,19 @@ scm_print_struct (SCM exp, SCM port, scm_print_state *pstate) { if (scm_is_true (SCM_STRUCT_PROCEDURE (exp))) { - scm_puts (" proc: ", port); + scm_puts_unlocked (" proc: ", port); if (scm_is_true (scm_procedure_p (SCM_STRUCT_PROCEDURE (exp)))) scm_write (SCM_STRUCT_PROCEDURE (exp), port); else - scm_puts ("(not a procedure?)", port); + scm_puts_unlocked ("(not a procedure?)", port); } if (SCM_STRUCT_SETTER_P (exp)) { - scm_puts (" setter: ", port); + scm_puts_unlocked (" setter: ", port); scm_write (SCM_STRUCT_SETTER (exp), port); } } - scm_putc ('>', port); + scm_putc_unlocked ('>', port); } } @@ -1035,11 +1068,12 @@ scm_init_struct () GC_REGISTER_DISPLACEMENT (2 * sizeof (scm_t_bits)); required_vtable_fields = scm_from_locale_string (SCM_VTABLE_BASE_LAYOUT); + scm_c_define ("standard-vtable-fields", required_vtable_fields); required_applicable_fields = scm_from_locale_string (SCM_APPLICABLE_BASE_LAYOUT); required_applicable_with_setter_fields = scm_from_locale_string (SCM_APPLICABLE_WITH_SETTER_BASE_LAYOUT); - scm_standard_vtable_vtable = - scm_make_vtable_vtable (scm_nullstr, SCM_INUM0, SCM_EOL); + scm_standard_vtable_vtable = scm_i_make_vtable_vtable (scm_nullstr); + scm_c_define ("<standard-vtable>", scm_standard_vtable_vtable); scm_applicable_struct_vtable_vtable = scm_make_struct (scm_standard_vtable_vtable, SCM_INUM0, diff --git a/libguile/struct.h b/libguile/struct.h index c3c7d8f12..3e2bc5353 100644 --- a/libguile/struct.h +++ b/libguile/struct.h @@ -180,7 +180,10 @@ SCM_API SCM scm_c_make_struct (SCM vtable, size_t n_tail, size_t n_inits, SCM_API SCM scm_c_make_structv (SCM vtable, size_t n_tail, size_t n_inits, scm_t_bits init[]); SCM_API SCM scm_make_vtable (SCM fields, SCM printer); -SCM_API SCM scm_make_vtable_vtable (SCM extra_fields, SCM tail_array_size, SCM init); +SCM_INTERNAL SCM scm_i_make_vtable_vtable (SCM extra_fields); +#if SCM_ENABLE_DEPRECATED == 1 +SCM_DEPRECATED SCM scm_make_vtable_vtable (SCM extra_fields, SCM tail_array_size, SCM init); +#endif SCM_API SCM scm_struct_ref (SCM handle, SCM pos); SCM_API SCM scm_struct_set_x (SCM handle, SCM pos, SCM val); SCM_API SCM scm_struct_vtable (SCM handle); diff --git a/libguile/symbols.c b/libguile/symbols.c index 59aca002e..9cb300ab0 100644 --- a/libguile/symbols.c +++ b/libguile/symbols.c @@ -23,6 +23,8 @@ # include <config.h> #endif +#include <unistr.h> + #include "libguile/_scm.h" #include "libguile/chars.h" #include "libguile/eval.h" @@ -33,8 +35,7 @@ #include "libguile/fluids.h" #include "libguile/strings.h" #include "libguile/vectors.h" -#include "libguile/hashtab.h" -#include "libguile/weaks.h" +#include "libguile/weak-set.h" #include "libguile/modules.h" #include "libguile/read.h" #include "libguile/srfi-13.h" @@ -52,7 +53,6 @@ static SCM symbols; -static scm_i_pthread_mutex_t symbols_lock = SCM_I_PTHREAD_MUTEX_INITIALIZER; #ifdef GUILE_DEBUG SCM_DEFINE (scm_sys_symbols, "%symbols", 0, 0, 0, @@ -104,21 +104,13 @@ static SCM lookup_interned_symbol (SCM name, unsigned long raw_hash) { struct string_lookup_data data; - SCM handle; data.string = name; data.string_hash = raw_hash; - scm_i_pthread_mutex_lock (&symbols_lock); - handle = scm_hash_fn_get_handle_by_hash (symbols, raw_hash, - string_lookup_predicate_fn, - &data); - scm_i_pthread_mutex_unlock (&symbols_lock); - - if (scm_is_true (handle)) - return SCM_CAR (handle); - else - return SCM_BOOL_F; + return scm_c_weak_set_lookup (symbols, raw_hash, + string_lookup_predicate_fn, + &data, SCM_BOOL_F); } struct latin1_lookup_data @@ -144,63 +136,104 @@ lookup_interned_latin1_symbol (const char *str, size_t len, unsigned long raw_hash) { struct latin1_lookup_data data; - SCM handle; data.str = str; data.len = len; data.string_hash = raw_hash; - scm_i_pthread_mutex_lock (&symbols_lock); - handle = scm_hash_fn_get_handle_by_hash (symbols, raw_hash, - latin1_lookup_predicate_fn, - &data); - scm_i_pthread_mutex_unlock (&symbols_lock); - - if (scm_is_true (handle)) - return SCM_CAR (handle); - else - return SCM_BOOL_F; + return scm_c_weak_set_lookup (symbols, raw_hash, + latin1_lookup_predicate_fn, + &data, SCM_BOOL_F); } -static unsigned long -symbol_lookup_hash_fn (SCM obj, unsigned long max, void *closure) +struct utf8_lookup_data { - return scm_i_symbol_hash (obj) % max; -} + const char *str; + size_t len; + unsigned long string_hash; +}; -static SCM -symbol_lookup_assoc_fn (SCM obj, SCM alist, void *closure) +static int +utf8_string_equals_wide_string (const scm_t_uint8 *narrow, size_t nlen, + const scm_t_wchar *wide, size_t wlen) { - for (; !scm_is_null (alist); alist = SCM_CDR (alist)) + size_t byte_idx = 0, char_idx = 0; + + while (byte_idx < nlen && char_idx < wlen) { - SCM sym = SCM_CAAR (alist); - - if (scm_i_symbol_hash (sym) == scm_i_symbol_hash (obj) - && scm_is_true (scm_string_equal_p (scm_symbol_to_string (sym), - scm_symbol_to_string (obj)))) - return SCM_CAR (alist); + ucs4_t c; + int nbytes; + + nbytes = u8_mbtouc (&c, narrow + byte_idx, nlen - byte_idx); + if (nbytes == 0) + break; + else if (nbytes < 0) + /* Bad UTF-8. */ + return 0; + else if (c != wide[char_idx]) + return 0; + + byte_idx += nbytes; + char_idx++; } - return SCM_BOOL_F; + return byte_idx == nlen && char_idx == wlen; } -/* Intern SYMBOL, an uninterned symbol. Might return a different - symbol, if another one was interned at the same time. */ -static SCM -intern_symbol (SCM symbol) +static int +utf8_lookup_predicate_fn (SCM sym, void *closure) { - SCM handle; + struct utf8_lookup_data *data = closure; - scm_i_pthread_mutex_lock (&symbols_lock); - handle = scm_hash_fn_create_handle_x (symbols, symbol, SCM_UNDEFINED, - symbol_lookup_hash_fn, - symbol_lookup_assoc_fn, - NULL); - scm_i_pthread_mutex_unlock (&symbols_lock); + if (scm_i_symbol_hash (sym) != data->string_hash) + return 0; + + if (scm_i_is_narrow_symbol (sym)) + return (scm_i_symbol_length (sym) == data->len + && strncmp (scm_i_symbol_chars (sym), data->str, data->len) == 0); + else + return utf8_string_equals_wide_string ((const scm_t_uint8 *) data->str, + data->len, + scm_i_symbol_wide_chars (sym), + scm_i_symbol_length (sym)); +} - return SCM_CAR (handle); +static SCM +lookup_interned_utf8_symbol (const char *str, size_t len, + unsigned long raw_hash) +{ + struct utf8_lookup_data data; + + data.str = str; + data.len = len; + data.string_hash = raw_hash; + + return scm_c_weak_set_lookup (symbols, raw_hash, + utf8_lookup_predicate_fn, + &data, SCM_BOOL_F); } +static int +symbol_lookup_predicate_fn (SCM sym, void *closure) +{ + SCM other = SCM_PACK_POINTER (closure); + + if (scm_i_symbol_hash (sym) == scm_i_symbol_hash (other) + && scm_i_symbol_length (sym) == scm_i_symbol_length (other)) + { + if (scm_i_is_narrow_symbol (sym)) + return scm_i_is_narrow_symbol (other) + && (strncmp (scm_i_symbol_chars (sym), + scm_i_symbol_chars (other), + scm_i_symbol_length (other)) == 0); + else + return scm_is_true + (scm_string_equal_p (scm_symbol_to_string (sym), + scm_symbol_to_string (other))); + } + return 0; +} + static SCM scm_i_str2symbol (SCM str) { @@ -215,7 +248,12 @@ scm_i_str2symbol (SCM str) /* The symbol was not found, create it. */ symbol = scm_i_make_symbol (str, 0, raw_hash, scm_cons (SCM_BOOL_F, SCM_EOL)); - return intern_symbol (symbol); + + /* Might return a different symbol, if another one was interned at + the same time. */ + return scm_c_weak_set_add_x (symbols, raw_hash, + symbol_lookup_predicate_fn, + SCM_UNPACK_POINTER (symbol), symbol); } } @@ -490,14 +528,27 @@ scm_from_utf8_symbol (const char *sym) SCM scm_from_utf8_symboln (const char *sym, size_t len) { - SCM str = scm_from_utf8_stringn (sym, len); - return scm_i_str2symbol (str); + unsigned long hash; + SCM ret; + + if (len == (size_t) -1) + len = strlen (sym); + hash = scm_i_utf8_string_hash (sym, len); + + ret = lookup_interned_utf8_symbol (sym, len, hash); + if (scm_is_false (ret)) + { + SCM str = scm_from_utf8_stringn (sym, len); + ret = scm_i_str2symbol (str); + } + + return ret; } void scm_symbols_prehistory () { - symbols = scm_make_weak_key_hash_table (scm_from_int (2139)); + symbols = scm_c_make_weak_set (5000); } diff --git a/libguile/symbols.h b/libguile/symbols.h index 6106f9ef1..f345e7033 100644 --- a/libguile/symbols.h +++ b/libguile/symbols.h @@ -3,7 +3,7 @@ #ifndef SCM_SYMBOLS_H #define SCM_SYMBOLS_H -/* Copyright (C) 1995,1996,1997,1998,2000,2001, 2003, 2004, 2006, 2008, 2010 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996,1997,1998,2000,2001, 2003, 2004, 2006, 2008, 2010, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -26,8 +26,7 @@ #include "libguile/__scm.h" -#define scm_is_symbol(x) (!SCM_IMP (x) \ - && (SCM_TYP7 (x) == scm_tc7_symbol)) +#define scm_is_symbol(x) (SCM_HAS_TYP7 (x, scm_tc7_symbol)) #define scm_i_symbol_hash(x) ((unsigned long) SCM_CELL_WORD_2 (x)) #define scm_i_symbol_is_interned(x) \ (!(SCM_CELL_WORD_0 (x) & SCM_I_F_SYMBOL_UNINTERNED)) @@ -91,7 +90,7 @@ SCM_API SCM scm_take_utf8_symboln (char *sym, size_t len); /* internal functions. */ SCM_INTERNAL unsigned long scm_i_hash_symbol (SCM obj, unsigned long n, - void *closure); + void *closure); SCM_INTERNAL void scm_symbols_prehistory (void); SCM_INTERNAL void scm_init_symbols (void); diff --git a/libguile/tags.h b/libguile/tags.h index 26ec16425..54b74e0a2 100644 --- a/libguile/tags.h +++ b/libguile/tags.h @@ -3,7 +3,7 @@ #ifndef SCM_TAGS_H #define SCM_TAGS_H -/* Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2008,2009,2010 +/* Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2008,2009,2010,2011 * Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or @@ -113,6 +113,11 @@ typedef union SCM { struct { scm_t_bits n; } n; } SCM; # define SCM_PACK(x) ((SCM) (x)) #endif +/* Packing SCM objects into and out of pointers. + */ +#define SCM_UNPACK_POINTER(x) ((scm_t_bits *) (SCM_UNPACK (x))) +#define SCM_PACK_POINTER(x) (SCM_PACK ((scm_t_bits) (x))) + /* SCM values can not be compared by using the operator ==. Use the following * macro instead, which is the equivalent of the scheme predicate 'eq?'. @@ -123,51 +128,57 @@ typedef union SCM { struct { scm_t_bits n; } n; } SCM; /* Representation of scheme objects: * - * Guile's type system is designed to work on systems where scm_t_bits and SCM - * variables consist of at least 32 bits. The objects that a SCM variable can - * represent belong to one of the following two major categories: - * - * - Immediates -- meaning that the SCM variable contains an entire Scheme - * object. That means, all the object's data (including the type tagging - * information that is required to identify the object's type) must fit into - * 32 bits. - * - * - Non-immediates -- meaning that the SCM variable holds a pointer into the - * heap of cells (see below). On systems where a pointer needs more than 32 - * bits this means that scm_t_bits and SCM variables need to be large enough - * to hold such pointers. In contrast to immediates, the object's data of - * a non-immediate can consume arbitrary amounts of memory: The heap cell - * being pointed to consists of at least two scm_t_bits variables and thus - * can be used to hold pointers to malloc'ed memory of any size. - * - * The 'heap' is the memory area that is under control of Guile's garbage - * collector. It holds 'single-cells' or 'double-cells', which consist of - * either two or four scm_t_bits variables, respectively. It is guaranteed - * that the address of a cell on the heap is 8-byte aligned. That is, since - * non-immediates hold a cell address, the three least significant bits of a - * non-immediate can be used to store additional information. The bits are - * used to store information about the object's type and thus are called - * tc3-bits, where tc stands for type-code. - * - * For a given SCM value, the distinction whether it holds an immediate or - * non-immediate object is based on the tc3-bits (see above) of its scm_t_bits + * Guile's type system is designed to work on systems where scm_t_bits + * and SCM variables consist of at least 32 bits. The objects that a + * SCM variable can represent belong to one of the following two major + * categories: + * + * - Immediates -- meaning that the SCM variable contains an entire + * Scheme object. That means, all the object's data (including the + * type tagging information that is required to identify the object's + * type) must fit into 32 bits. + * + * - Heap objects -- meaning that the SCM variable holds a pointer into + * the heap. On systems where a pointer needs more than 32 bits this + * means that scm_t_bits and SCM variables need to be large enough to + * hold such pointers. In contrast to immediates, the data associated + * with a heap object can consume arbitrary amounts of memory. + * + * The 'heap' is the memory area that is under control of Guile's + * garbage collector. It holds allocated memory of various sizes. The + * impact on the runtime type system is that Guile needs to be able to + * determine the type of an object given the pointer. Usually the way + * that Guile does this is by storing a "type tag" in the first word of + * the object. + * + * Some objects are common enough that they get special treatment. + * Since Guile guarantees that the address of a GC-allocated object on + * the heap is 8-byte aligned, Guile can play tricks with the lower 3 + * bits. That is, since heap objects encode a pointer to an + * 8-byte-aligned pointer, the three least significant bits of a SCM can + * be used to store additional information. The bits are used to store + * information about the object's type and thus are called tc3-bits, + * where tc stands for type-code. + * + * For a given SCM value, the distinction whether it holds an immediate + * or heap object is based on the tc3-bits (see above) of its scm_t_bits * equivalent: If the tc3-bits equal #b000, then the SCM value holds a - * non-immediate, and the scm_t_bits variable's value is just the pointer to - * the heap cell. + * heap object, and the scm_t_bits variable's value is just the pointer + * to the heap cell. * * Summarized, the data of a scheme object that is represented by a SCM - * variable consists of a) the SCM variable itself, b) in case of - * non-immediates the data of the single-cell or double-cell the SCM object - * points to, c) in case of non-immediates potentially additional data outside - * of the heap (like for example malloc'ed data), and d) in case of - * non-immediates potentially additional data inside of the heap, since data - * stored in b) and c) may hold references to other cells. + * variable consists of a) the SCM variable itself, b) in case of heap + * objects memory that the SCM object points to, c) in case of heap + * objects potentially additional data outside of the heap (like for + * example malloc'ed data), and d) in case of heap objects potentially + * additional data inside of the heap, since data stored in b) and c) + * may hold references to other cells. * * * Immediates * * Operations on immediate objects can typically be processed faster than on - * non-immediates. The reason is that the object's data can be extracted + * heap objects. The reason is that the object's data can be extracted * directly from the SCM variable (or rather a corresponding scm_t_bits * variable), instead of having to perform additional memory accesses to * obtain the object's data from the heap. In order to get the best possible @@ -201,69 +212,56 @@ typedef union SCM { struct { scm_t_bits n; } n; } SCM; * special objects listed above. * * - * Non-Immediates - * - * All object types not mentioned above in the list of immedate objects are - * represented as non-immediates. Whether a non-immediate scheme object is - * represented by a single-cell or a double-cell depends on the object's type, - * namely on the set of attributes that have to be stored with objects of that - * type. Every non-immediate type is allowed to define its own layout and - * interpretation of the data stored in its cell (with some restrictions, see - * below). - * - * One of the design goals of guile's type system is to make it possible to - * store a scheme pair with as little memory usage as possible. The minimum - * amount of memory that is required to store two scheme objects (car and cdr - * of a pair) is the amount of memory required by two scm_t_bits or SCM - * variables. Therefore pairs in guile are stored in single-cells. - * - * Another design goal for the type system is to store procedure objects - * created by lambda expresssions (closures) and class instances (goops - * objects) with as little memory usage as possible. Closures are represented - * by a reference to the function code and a reference to the closure's - * environment. Class instances are represented by a reference to the - * instance's class definition and a reference to the instance's data. Thus, - * closures as well as class instances also can be stored in single-cells. - * - * Certain other non-immediate types also store their data in single-cells. - * By design decision, the heap is split into areas for single-cells and - * double-cells, but not into areas for single-cells-holding-pairs and areas - * for single-cells-holding-non-pairs. Any single-cell on the heap therefore - * can hold pairs (consisting of two scm_t_bits variables representing two - * scheme objects - the car and cdr of the pair) and non-pairs (consisting of - * two scm_t_bits variables that hold bit patterns as defined by the layout of - * the corresponding object's type). + * Heap Objects + * + * All object types not mentioned above in the list of immedate objects + * are represented as heap objects. The amount of memory referenced by + * a heap object depends on the object's type, namely on the set of + * attributes that have to be stored with objects of that type. Every + * heap object type is allowed to define its own layout and + * interpretation of the data stored in its cell (with some + * restrictions, see below). + * + * One of the design goals of guile's type system is to make it possible + * to store a scheme pair with as little memory usage as possible. The + * minimum amount of memory that is required to store two scheme objects + * (car and cdr of a pair) is the amount of memory required by two + * scm_t_bits or SCM variables. Therefore pairs in guile are stored in + * two words, and are tagged with a bit pattern in the SCM value, not + * with a type tag on the heap. * * * Garbage collection * - * During garbage collection, unreachable cells on the heap will be freed. - * That is, the garbage collector will detect cells which have no SCM variable - * pointing towards them. In order to properly release all memory belonging - * to the object to which a cell belongs, the gc needs to be able to interpret - * the cell contents in the correct way. That means that the gc needs to be - * able to determine the object type associated with a cell only from the cell - * itself. - * - * Consequently, if the gc detects an unreachable single-cell, those two - * scm_t_bits variables must provide enough information to determine whether - * they belong to a pair (i. e. both scm_t_bits variables represent valid - * scheme objects), to a closure, a class instance or if they belong to any - * other non-immediate. Guile's type system is designed to make it possible - * to determine a the type to which a cell belongs in the majority of cases - * from the cell's first scm_t_bits variable. (Given a SCM variable X holding - * a non-immediate object, the macro SCM_CELL_TYPE(X) will deliver the - * corresponding cell's first scm_t_bits variable.) - * - * If the cell holds a scheme pair, then we already know that the first - * scm_t_bits variable of the cell will hold a scheme object with one of the - * following tc3-codes: #b000 (non-immediate), #b010 (small integer), #b110 - * (small integer), #b100 (non-integer immediate). All these tc3-codes have - * in common, that their least significant bit is #b0. This fact is used by - * the garbage collector to identify cells that hold pairs. The remaining - * tc3-codes are assigned as follows: #b001 (class instance or, more - * precisely, a struct, of which a class instance is a special case), #b011 - * (closure), #b101/#b111 (all remaining non-immediate types). + * During garbage collection, unreachable objects on the heap will be + * freed. To determine the set of reachable objects, by default, the GC + * just traces all words in all heap objects. It is possible to + * register custom tracing ("marking") procedures. + * + * If an object is unreachable, by default, the GC just notes this fact + * and moves on. Later allocations will clear out the memory associated + * with the object, and re-use it. It is possible to register custom + * finalizers, however. + * + * + * Run-time type introspection + * + * Guile's type system is designed to make it possible to determine a + * the type of a heap object from the object's first scm_t_bits + * variable. (Given a SCM variable X holding a heap object, the macro + * SCM_CELL_TYPE(X) will deliver the corresponding object's first + * scm_t_bits variable.) + * + * If the object holds a scheme pair, then we already know that the + * first scm_t_bits variable of the cell will hold a scheme object with + * one of the following tc3-codes: #b000 (heap object), #b010 (small + * integer), #b110 (small integer), #b100 (non-integer immediate). All + * these tc3-codes have in common, that their least significant bit is + * #b0. This fact is used by the garbage collector to identify cells + * that hold pairs. The remaining tc3-codes are assigned as follows: + * #b001 (class instance or, more precisely, a struct, of which a class + * instance is a special case), #b011 (closure), #b101/#b111 (all + * remaining heap object types). * * * Summary of type codes of scheme objects (SCM variables) @@ -274,7 +272,7 @@ typedef union SCM { struct { scm_t_bits n; } n; } SCM; * of the SCM variables corresponding scm_t_bits value. * * Note that (as has been explained above) tc1==1 can only occur in the first - * scm_t_bits variable of a cell belonging to a non-immediate object that is + * scm_t_bits variable of a cell belonging to a heap object that is * not a pair. For an explanation of the tc tags with tc1==1, see the next * section with the summary of the type codes on the heap. * @@ -283,13 +281,13 @@ typedef union SCM { struct { scm_t_bits n; } n; } SCM; * (1: This can never be the case for a scheme object.) * * tc2: - * 00: Either a non-immediate or some non-integer immediate + * 00: Either a heap object or some non-integer immediate * (01: This can never be the case for a scheme object.) * 10: Small integer * (11: This can never be the case for a scheme object.) * * tc3: - * 000: a non-immediate object (pair, closure, class instance etc.) + * 000: a heap object (pair, closure, class instance etc.) * (001: This can never be the case for a scheme object.) * 010: an even small integer (least significant bit is 0). * (011: This can never be the case for a scheme object.) @@ -298,8 +296,8 @@ typedef union SCM { struct { scm_t_bits n; } n; } SCM; * 110: an odd small integer (least significant bit is 1). * (111: This can never be the case for a scheme object.) * - * The remaining bits of the non-immediate objects form the pointer to the - * heap cell. The remaining bits of the small integers form the integer's + * The remaining bits of the heap objects form the pointer to the heap + * cell. The remaining bits of the small integers form the integer's * value and sign. Thus, the only scheme objects for which a further * subdivision is of interest are the ones with tc3==100. * @@ -321,19 +319,19 @@ typedef union SCM { struct { scm_t_bits n; } n; } SCM; * * tc2: * 00: the cell belongs to a pair with no short integer in its car. - * 01: the cell belongs to a non-pair (struct or some other non-immediate). + * 01: the cell belongs to a non-pair (struct or some other heap object). * 10: the cell belongs to a pair with a short integer in its car. - * 11: the cell belongs to a non-pair (closure or some other non-immediate). + * 11: the cell belongs to a non-pair (closure or some other heap object). * * tc3: - * 000: the cell belongs to a pair with a non-immediate in its car. + * 000: the cell belongs to a pair with a heap object in its car. * 001: the cell belongs to a struct * 010: the cell belongs to a pair with an even short integer in its car. * 011: the cell belongs to a closure * 100: the cell belongs to a pair with a non-integer immediate in its car. - * 101: the cell belongs to some other non-immediate. + * 101: the cell belongs to some other heap object. * 110: the cell belongs to a pair with an odd short integer in its car. - * 111: the cell belongs to some other non-immediate. + * 111: the cell belongs to some other heap object. * * tc7 (for tc3==1x1): * See below for the list of types. Note the special case of scm_tc7_vector @@ -352,11 +350,12 @@ typedef union SCM { struct { scm_t_bits n; } n; } SCM; -/* Checking if a SCM variable holds an immediate or a non-immediate object: +/* Checking if a SCM variable holds an immediate or a heap object: * This check can either be performed by checking for tc3==000 or tc3==00x, * since for a SCM variable it is known that tc1==0. */ #define SCM_IMP(x) (6 & SCM_UNPACK (x)) #define SCM_NIMP(x) (!SCM_IMP (x)) +#define SCM_HEAP_OBJECT_P(x) (SCM_NIMP (x)) /* Checking if a SCM variable holds an immediate integer: See numbers.h for * the definition of the following macros: SCM_I_FIXNUM_BIT, @@ -364,7 +363,7 @@ typedef union SCM { struct { scm_t_bits n; } n; } SCM; /* Checking if a SCM variable holds a pair (for historical reasons, in Guile * also known as a cons-cell): This is done by first checking that the SCM - * variable holds a non-immediate, and second, by checking that tc1==0 holds + * variable holds a heap object, and second, by checking that tc1==0 holds * for the SCM_CELL_TYPE of the SCM variable. */ @@ -392,11 +391,26 @@ typedef union SCM { struct { scm_t_bits n; } n; } SCM; #define scm_tc3_tc7_2 7 +/* As we have seen, heap objects have a tag in their three lowest bits. + If you have a heap object and want the pointer to the start of the + object, perhaps for GC purposes, you need to mask off the low bits, + which is what SCM_HEAP_OBJECT_BASE does. + + Note that you can avoid this macro if you know the specific type of + the object (pair, struct, or other). + */ +#define SCM_HEAP_OBJECT_BASE(x) ((scm_t_bits*)((SCM_UNPACK (x)) & ~7)) + + /* Definitions for tc7: */ #define SCM_ITAG7(x) (127 & SCM_UNPACK (x)) #define SCM_TYP7(x) (0x7f & SCM_CELL_TYPE (x)) #define SCM_TYP7S(x) ((0x7f & ~2) & SCM_CELL_TYPE (x)) +#define SCM_HAS_HEAP_TYPE(x, type, tag) \ + (SCM_NIMP (x) && type (x) == (tag)) +#define SCM_HAS_TYP7(x, tag) (SCM_HAS_HEAP_TYPE (x, SCM_TYP7, tag)) +#define SCM_HAS_TYP7S(x, tag) (SCM_HAS_HEAP_TYPE (x, SCM_TYP7S, tag)) #define scm_tc7_symbol 5 #define scm_tc7_variable 7 @@ -424,8 +438,8 @@ typedef union SCM { struct { scm_t_bits n; } n; } SCM; #define scm_tc7_with_fluids 63 #define scm_tc7_unused_19 69 #define scm_tc7_program 79 -#define scm_tc7_unused_9 85 -#define scm_tc7_unused_10 87 +#define scm_tc7_weak_set 85 +#define scm_tc7_weak_table 87 #define scm_tc7_unused_20 93 #define scm_tc7_unused_11 95 #define scm_tc7_unused_12 101 @@ -447,7 +461,8 @@ typedef union SCM { struct { scm_t_bits n; } n; } SCM; /* Definitions for tc16: */ #define SCM_TYP16(x) (0xffff & SCM_CELL_TYPE (x)) -#define SCM_TYP16_PREDICATE(tag, x) (!SCM_IMP (x) && SCM_TYP16 (x) == (tag)) +#define SCM_HAS_TYP16(x, tag) (SCM_HAS_HEAP_TYPE (x, SCM_TYP16, tag)) +#define SCM_TYP16_PREDICATE(tag, x) (SCM_HAS_TYP16 (x, tag)) @@ -621,7 +636,7 @@ enum scm_tc8_tags case scm_tc2_int + 112: case scm_tc2_int + 116: case scm_tc3_imm24 + 112:\ case scm_tc2_int + 120: case scm_tc2_int + 124: case scm_tc3_imm24 + 120 -/* For cons pairs with non-immediate values in the SCM_CAR +/* For cons pairs with heap objects in the SCM_CAR */ #define scm_tcs_cons_nimcar \ scm_tc3_cons + 0:\ @@ -663,13 +678,6 @@ enum scm_tc8_tags -#if (SCM_ENABLE_DEPRECATED == 1) - -#define SCM_CELLP(x) (((sizeof (scm_t_cell) - 1) & SCM_UNPACK (x)) == 0) -#define SCM_NCELLP(x) (!SCM_CELLP (x)) - -#endif - #endif /* SCM_TAGS_H */ /* diff --git a/libguile/threads.c b/libguile/threads.c index f71c83c5a..aeadcfe6d 100644 --- a/libguile/threads.c +++ b/libguile/threads.c @@ -56,7 +56,6 @@ #include "libguile/init.h" #include "libguile/scmsigs.h" #include "libguile/strings.h" -#include "libguile/weaks.h" #include <full-read.h> @@ -368,11 +367,11 @@ thread_print (SCM exp, SCM port, scm_print_state *pstate SCM_UNUSED) else id = u.um; - scm_puts ("#<thread ", port); + scm_puts_unlocked ("#<thread ", port); scm_uintprint (id, 10, port); - scm_puts (" (", port); + scm_puts_unlocked (" (", port); scm_uintprint ((scm_t_bits)t, 16, port); - scm_puts (")>", port); + scm_puts_unlocked (")>", port); return 1; } @@ -631,10 +630,6 @@ do_thread_exit (void *v) { scm_i_thread *t = (scm_i_thread *) v; - /* Ensure the signal handling thread has been launched, because we might be - shutting it down. This needs to be done in Guile mode. */ - scm_i_ensure_signal_delivery_thread (); - if (!scm_is_false (t->cleanup_handler)) { SCM ptr = t->cleanup_handler; @@ -655,9 +650,9 @@ do_thread_exit (void *v) while (!scm_is_null (t->mutexes)) { - SCM mutex = SCM_WEAK_PAIR_CAR (t->mutexes); + SCM mutex = scm_c_weak_vector_ref (scm_car (t->mutexes), 0); - if (!SCM_UNBNDP (mutex)) + if (scm_is_true (mutex)) { fat_mutex *m = SCM_MUTEX_DATA (mutex); @@ -671,7 +666,7 @@ do_thread_exit (void *v) scm_i_pthread_mutex_unlock (&m->lock); } - t->mutexes = SCM_WEAK_PAIR_CDR (t->mutexes); + t->mutexes = scm_cdr (t->mutexes); } scm_i_pthread_mutex_unlock (&t->admin_mutex); @@ -835,7 +830,7 @@ scm_init_guile () else { fprintf (stderr, "Failed to get stack base for current thread.\n"); - exit (1); + exit (EXIT_FAILURE); } } @@ -1276,9 +1271,9 @@ static int fat_mutex_print (SCM mx, SCM port, scm_print_state *pstate SCM_UNUSED) { fat_mutex *m = SCM_MUTEX_DATA (mx); - scm_puts ("#<mutex ", port); + scm_puts_unlocked ("#<mutex ", port); scm_uintprint ((scm_t_bits)m, 16, port); - scm_puts (">", port); + scm_puts_unlocked (">", port); return 1; } @@ -1381,7 +1376,8 @@ fat_mutex_lock (SCM mutex, scm_t_timespec *timeout, SCM owner, int *ret) The weak pair itself is eventually removed when MUTEX is unlocked. Note that `t->mutexes' lists mutexes currently held by T, so it should be small. */ - t->mutexes = scm_weak_car_pair (mutex, t->mutexes); + t->mutexes = scm_cons (scm_make_weak_vector (SCM_INUM1, mutex), + t->mutexes); scm_i_pthread_mutex_unlock (&t->admin_mutex); } @@ -1525,6 +1521,25 @@ typedef struct { #define SCM_CONDVARP(x) SCM_SMOB_PREDICATE (scm_tc16_condvar, x) #define SCM_CONDVAR_DATA(x) ((fat_cond *) SCM_SMOB_DATA (x)) +static void +remove_mutex_from_thread (SCM mutex, scm_i_thread *t) +{ + SCM walk, prev; + + for (prev = SCM_BOOL_F, walk = t->mutexes; scm_is_pair (walk); + walk = SCM_CDR (walk)) + { + if (scm_is_eq (mutex, scm_c_weak_vector_ref (SCM_CAR (walk), 0))) + { + if (scm_is_pair (prev)) + SCM_SETCDR (prev, SCM_CDR (walk)); + else + t->mutexes = SCM_CDR (walk); + break; + } + } +} + static int fat_mutex_unlock (SCM mutex, SCM cond, const scm_t_timespec *waittime, int relock) @@ -1569,7 +1584,7 @@ fat_mutex_unlock (SCM mutex, SCM cond, if (m->level == 0) { /* Change the owner of MUTEX. */ - t->mutexes = scm_delq_x (mutex, t->mutexes); + remove_mutex_from_thread (mutex, t); m->owner = unblock_from_queue (m->waiting); } @@ -1603,7 +1618,7 @@ fat_mutex_unlock (SCM mutex, SCM cond, } t->block_asyncs--; - scm_async_click (); + scm_async_tick (); scm_remember_upto_here_2 (cond, mutex); @@ -1617,7 +1632,7 @@ fat_mutex_unlock (SCM mutex, SCM cond, if (m->level == 0) { /* Change the owner of MUTEX. */ - t->mutexes = scm_delq_x (mutex, t->mutexes); + remove_mutex_from_thread (mutex, t); m->owner = unblock_from_queue (m->waiting); } @@ -1713,9 +1728,9 @@ static int fat_cond_print (SCM cv, SCM port, scm_print_state *pstate SCM_UNUSED) { fat_cond *c = SCM_CONDVAR_DATA (cv); - scm_puts ("#<condition-variable ", port); + scm_puts_unlocked ("#<condition-variable ", port); scm_uintprint ((scm_t_bits)c, 16, port); - scm_puts (">", port); + scm_puts_unlocked (">", port); return 1; } diff --git a/libguile/threads.h b/libguile/threads.h index ec129bc72..54d64141b 100644 --- a/libguile/threads.h +++ b/libguile/threads.h @@ -143,9 +143,6 @@ SCM_INTERNAL void scm_init_thread_procs (void); SCM_INTERNAL void scm_init_threads_default_dynamic_state (void); -#define SCM_THREAD_SWITCHING_CODE \ - do { } while (0) - SCM_API SCM scm_call_with_new_thread (SCM thunk, SCM handler); SCM_API SCM scm_yield (void); SCM_API SCM scm_cancel_thread (SCM t); diff --git a/libguile/throw.c b/libguile/throw.c index 9c293516d..29ccc8aba 100644 --- a/libguile/throw.c +++ b/libguile/throw.c @@ -322,16 +322,22 @@ scm_handle_by_proc_catching_all (void *handler_data, SCM tag, SCM throw_args) int scm_exit_status (SCM args) { - if (!SCM_NULL_OR_NIL_P (args)) + if (scm_is_pair (args)) { SCM cqa = SCM_CAR (args); if (scm_is_integer (cqa)) return (scm_to_int (cqa)); else if (scm_is_false (cqa)) - return 1; + return EXIT_FAILURE; + else + return EXIT_SUCCESS; } - return 0; + else if (scm_is_null (args)) + return EXIT_SUCCESS; + else + /* A type error. Strictly speaking we shouldn't get here. */ + return EXIT_FAILURE; } @@ -364,7 +370,7 @@ handler_message (void *handler_data, SCM tag, SCM args) if (should_print_backtrace (tag, stack)) { - scm_puts ("Backtrace:\n", p); + scm_puts_unlocked ("Backtrace:\n", p); scm_display_backtrace_with_highlights (stack, p, SCM_BOOL_F, SCM_BOOL_F, SCM_EOL); diff --git a/libguile/validate.h b/libguile/validate.h index b0e502a1c..6dea795e5 100644 --- a/libguile/validate.h +++ b/libguile/validate.h @@ -3,7 +3,7 @@ #ifndef SCM_VALIDATE_H #define SCM_VALIDATE_H -/* Copyright (C) 1999,2000,2001, 2002, 2004, 2006, 2007, 2009 Free Software Foundation, Inc. +/* Copyright (C) 1999,2000,2001, 2002, 2004, 2006, 2007, 2009, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -354,7 +354,7 @@ #define SCM_VALIDATE_ARRAY(pos, v) \ do { \ - SCM_ASSERT (!SCM_IMP (v) \ + SCM_ASSERT (SCM_HEAP_OBJECT_P (v) \ && scm_is_true (scm_array_p (v, SCM_UNDEFINED)), \ v, pos, FUNC_NAME); \ } while (0) diff --git a/libguile/values.c b/libguile/values.c index ab7773141..005be5063 100644 --- a/libguile/values.c +++ b/libguile/values.c @@ -60,9 +60,9 @@ print_values (SCM obj, SCM pwps) SCM port = SCM_PORT_WITH_PS_PORT (pwps); scm_print_state *ps = SCM_PRINT_STATE (SCM_PORT_WITH_PS_PS (pwps)); - scm_puts ("#<values ", port); + scm_puts_unlocked ("#<values ", port); scm_iprin1 (values, port, ps); - scm_puts (">", port); + scm_puts_unlocked (">", port); return SCM_UNSPECIFIED; } diff --git a/libguile/variable.c b/libguile/variable.c index a9cc60e20..7b3f3356c 100644 --- a/libguile/variable.c +++ b/libguile/variable.c @@ -36,11 +36,11 @@ void scm_i_variable_print (SCM exp, SCM port, scm_print_state *pstate) { - scm_puts ("#<variable ", port); + scm_puts_unlocked ("#<variable ", port); scm_uintprint (SCM_UNPACK (exp), 16, port); - scm_puts (" value: ", port); + scm_puts_unlocked (" value: ", port); scm_iprin1 (SCM_VARIABLE_REF (exp), port, pstate); - scm_putc('>', port); + scm_putc_unlocked('>', port); } diff --git a/libguile/variable.h b/libguile/variable.h index 20daf853f..c024c8519 100644 --- a/libguile/variable.h +++ b/libguile/variable.h @@ -3,7 +3,7 @@ #ifndef SCM_VARIABLE_H #define SCM_VARIABLE_H -/* Copyright (C) 1995,1996,2000,2001, 2006, 2008 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996,2000,2001, 2006, 2008, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -30,7 +30,7 @@ /* Variables */ -#define SCM_VARIABLEP(X) (!SCM_IMP (X) && SCM_TYP7(X) == scm_tc7_variable) +#define SCM_VARIABLEP(X) (SCM_HAS_TYP7 (X, scm_tc7_variable)) #define SCM_VARIABLE_REF(V) SCM_CELL_OBJECT_1 (V) #define SCM_VARIABLE_SET(V, X) SCM_SET_CELL_OBJECT_1 (V, X) #define SCM_VARIABLE_LOC(V) (SCM_CELL_OBJECT_LOC ((V), 1)) diff --git a/libguile/vectors.c b/libguile/vectors.c index 2805278f0..1640725e5 100644 --- a/libguile/vectors.c +++ b/libguile/vectors.c @@ -67,9 +67,7 @@ scm_vector_elements (SCM vec, scm_t_array_handle *h, size_t *lenp, ssize_t *incp) { if (SCM_I_WVECTP (vec)) - /* FIXME: We should check each (weak) element of the vector for NULL and - convert it to SCM_BOOL_F. */ - abort (); + scm_wrong_type_arg_msg (NULL, 0, vec, "non-weak vector"); scm_generalized_vector_get_handle (vec, h); if (lenp) @@ -86,9 +84,7 @@ scm_vector_writable_elements (SCM vec, scm_t_array_handle *h, size_t *lenp, ssize_t *incp) { if (SCM_I_WVECTP (vec)) - /* FIXME: We should check each (weak) element of the vector for NULL and - convert it to SCM_BOOL_F. */ - abort (); + scm_wrong_type_arg_msg (NULL, 0, vec, "non-weak vector"); scm_generalized_vector_get_handle (vec, h); if (lenp) @@ -123,7 +119,7 @@ scm_vector_length (SCM v) return scm_from_size_t (dim->ubnd - dim->lbnd + 1); } else - SCM_WTA_DISPATCH_1 (g_vector_length, v, 1, NULL); + return scm_wta_dispatch_1 (g_vector_length, v, 1, "vector-length"); } size_t @@ -205,43 +201,33 @@ scm_vector_ref (SCM v, SCM k) SCM scm_c_vector_ref (SCM v, size_t k) { - if (SCM_I_IS_VECTOR (v)) + if (SCM_I_IS_NONWEAK_VECTOR (v)) { - register SCM elt; - if (k >= SCM_I_VECTOR_LENGTH (v)) scm_out_of_range (NULL, scm_from_size_t (k)); - elt = (SCM_I_VECTOR_ELTS(v))[k]; - - if (SCM_UNPACK (elt) == 0 && SCM_I_WVECTP (v)) - /* ELT was a weak pointer and got nullified by the GC. */ - return SCM_BOOL_F; - - return elt; + return SCM_SIMPLE_VECTOR_REF (v, k); } + else if (SCM_I_WVECTP (v)) + return scm_c_weak_vector_ref (v, k); else if (SCM_I_ARRAYP (v) && SCM_I_ARRAY_NDIM (v) == 1) { scm_t_array_dim *dim = SCM_I_ARRAY_DIMS (v); SCM vv = SCM_I_ARRAY_V (v); - if (SCM_I_IS_VECTOR (vv)) - { - register SCM elt; - - if (k >= dim->ubnd - dim->lbnd + 1) - scm_out_of_range (NULL, scm_from_size_t (k)); - k = SCM_I_ARRAY_BASE (v) + k*dim->inc; - elt = (SCM_I_VECTOR_ELTS (vv))[k]; - - if (SCM_UNPACK (elt) == 0 && (SCM_I_WVECTP (vv))) - /* ELT was a weak pointer and got nullified by the GC. */ - return SCM_BOOL_F; - - return elt; - } - scm_wrong_type_arg_msg (NULL, 0, v, "non-uniform vector"); + + k = SCM_I_ARRAY_BASE (v) + k*dim->inc; + if (k >= dim->ubnd - dim->lbnd + 1) + scm_out_of_range (NULL, scm_from_size_t (k)); + + if (SCM_I_IS_NONWEAK_VECTOR (vv)) + return SCM_SIMPLE_VECTOR_REF (vv, k); + else if (SCM_I_WVECTP (vv)) + return scm_c_weak_vector_ref (vv, k); + else + scm_wrong_type_arg_msg (NULL, 0, v, "non-uniform vector"); } else - SCM_WTA_DISPATCH_2 (g_vector_ref, v, scm_from_size_t (k), 2, NULL); + return scm_wta_dispatch_2 (g_vector_ref, v, scm_from_size_t (k), 2, + "vector-ref"); } SCM_GPROC (s_vector_set_x, "vector-set!", 3, 0, 0, scm_vector_set_x, g_vector_set_x); @@ -269,46 +255,37 @@ scm_vector_set_x (SCM v, SCM k, SCM obj) void scm_c_vector_set_x (SCM v, size_t k, SCM obj) { - if (SCM_I_IS_VECTOR (v)) + if (SCM_I_IS_NONWEAK_VECTOR (v)) { if (k >= SCM_I_VECTOR_LENGTH (v)) - scm_out_of_range (NULL, scm_from_size_t (k)); - (SCM_I_VECTOR_WELTS(v))[k] = obj; - if (SCM_I_WVECTP (v)) - { - /* Make it a weak pointer. */ - GC_PTR link = (GC_PTR) & ((SCM_I_VECTOR_WELTS (v))[k]); - SCM_I_REGISTER_DISAPPEARING_LINK (link, - (GC_PTR) SCM2PTR (obj)); - } + scm_out_of_range (NULL, scm_from_size_t (k)); + SCM_SIMPLE_VECTOR_SET (v, k, obj); } + else if (SCM_I_WVECTP (v)) + scm_c_weak_vector_set_x (v, k, obj); else if (SCM_I_ARRAYP (v) && SCM_I_ARRAY_NDIM (v) == 1) { scm_t_array_dim *dim = SCM_I_ARRAY_DIMS (v); SCM vv = SCM_I_ARRAY_V (v); - if (SCM_I_IS_VECTOR (vv)) - { - if (k >= dim->ubnd - dim->lbnd + 1) - scm_out_of_range (NULL, scm_from_size_t (k)); - k = SCM_I_ARRAY_BASE (v) + k*dim->inc; - (SCM_I_VECTOR_WELTS (vv))[k] = obj; - - if (SCM_I_WVECTP (vv)) - { - /* Make it a weak pointer. */ - GC_PTR link = (GC_PTR) & ((SCM_I_VECTOR_WELTS (vv))[k]); - SCM_I_REGISTER_DISAPPEARING_LINK (link, - (GC_PTR) SCM2PTR (obj)); - } - } + + k = SCM_I_ARRAY_BASE (v) + k*dim->inc; + if (k >= dim->ubnd - dim->lbnd + 1) + scm_out_of_range (NULL, scm_from_size_t (k)); + + if (SCM_I_IS_NONWEAK_VECTOR (vv)) + SCM_SIMPLE_VECTOR_SET (vv, k, obj); + else if (SCM_I_WVECTP (vv)) + scm_c_weak_vector_set_x (vv, k, obj); else scm_wrong_type_arg_msg (NULL, 0, v, "non-uniform vector"); } else { if (SCM_UNPACK (g_vector_set_x)) - scm_apply_generic (g_vector_set_x, - scm_list_3 (v, scm_from_size_t (k), obj)); + scm_wta_dispatch_n (g_vector_set_x, + scm_list_3 (v, scm_from_size_t (k), obj), + 0, + "vector-set!"); else scm_wrong_type_arg_msg (NULL, 0, v, "vector"); } @@ -336,28 +313,17 @@ SCM scm_c_make_vector (size_t k, SCM fill) #define FUNC_NAME s_scm_make_vector { - SCM *vector; - - vector = (SCM *) - scm_gc_malloc ((k + SCM_I_VECTOR_HEADER_SIZE) * sizeof (SCM), - "vector"); + SCM vector; + unsigned long int j; - if (k > 0) - { - SCM *base; - unsigned long int j; - - SCM_ASSERT_RANGE (1, scm_from_ulong (k), k <= VECTOR_MAX_LENGTH); + SCM_ASSERT_RANGE (1, scm_from_size_t (k), k <= VECTOR_MAX_LENGTH); - base = vector + SCM_I_VECTOR_HEADER_SIZE; - for (j = 0; j != k; ++j) - base[j] = fill; - } + vector = scm_words ((k << 8) | scm_tc7_vector, k + 1); - ((scm_t_bits *) vector)[0] = (k << 8) | scm_tc7_vector; - ((scm_t_bits *) vector)[1] = 0; + for (j = 0; j < k; ++j) + SCM_SIMPLE_VECTOR_SET (vector, j, fill); - return PTR2SCM (vector); + return vector; } #undef FUNC_NAME @@ -386,72 +352,6 @@ SCM_DEFINE (scm_vector_copy, "vector-copy", 1, 0, 0, #undef FUNC_NAME -/* Weak vectors. */ - -/* Allocate memory for the elements of a weak vector on behalf of the - caller. */ -static SCM -make_weak_vector (scm_t_bits type, size_t c_size) -{ - SCM *vector; - size_t total_size; - - total_size = (c_size + SCM_I_VECTOR_HEADER_SIZE) * sizeof (SCM); - vector = (SCM *) scm_gc_malloc_pointerless (total_size, "weak vector"); - - ((scm_t_bits *) vector)[0] = (c_size << 8) | scm_tc7_wvect; - ((scm_t_bits *) vector)[1] = type; - - return PTR2SCM (vector); -} - -/* Return a new weak vector. The allocated vector will be of the given weak - vector subtype. It will contain SIZE elements which are initialized with - the FILL object, or, if FILL is undefined, with an unspecified object. */ -SCM -scm_i_make_weak_vector (scm_t_bits type, SCM size, SCM fill) -{ - SCM wv, *base; - size_t c_size, j; - - if (SCM_UNBNDP (fill)) - fill = SCM_UNSPECIFIED; - - c_size = scm_to_unsigned_integer (size, 0, VECTOR_MAX_LENGTH); - wv = make_weak_vector (type, c_size); - base = SCM_I_WVECT_GC_WVELTS (wv); - - for (j = 0; j != c_size; ++j) - base[j] = fill; - - return wv; -} - -/* Return a new weak vector with type TYPE and whose content are taken from - list LST. */ -SCM -scm_i_make_weak_vector_from_list (scm_t_bits type, SCM lst) -{ - SCM wv, *elt; - long c_size; - - c_size = scm_ilength (lst); - SCM_ASSERT (c_size >= 0, lst, SCM_ARG2, "scm_i_make_weak_vector_from_list"); - - wv = make_weak_vector(type, (size_t) c_size); - - for (elt = SCM_I_WVECT_GC_WVELTS (wv); - scm_is_pair (lst); - lst = SCM_CDR (lst), elt++) - { - *elt = SCM_CAR (lst); - } - - return wv; -} - - - SCM_DEFINE (scm_vector_to_list, "vector->list", 1, 0, 0, (SCM v), "Return a newly allocated list composed of the elements of @var{v}.\n" diff --git a/libguile/vectors.h b/libguile/vectors.h index 3746e9026..4fe72b0a4 100644 --- a/libguile/vectors.h +++ b/libguile/vectors.h @@ -3,7 +3,7 @@ #ifndef SCM_VECTORS_H #define SCM_VECTORS_H -/* Copyright (C) 1995,1996,1998,2000,2001,2002,2004,2005, 2006, 2008, 2009 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996,1998,2000,2001,2002,2004,2005, 2006, 2008, 2009, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -63,31 +63,14 @@ SCM_API SCM *scm_vector_writable_elements (SCM vec, /* Internals */ -/* Vectors have a 2-word header: 1 for the type tag, and 1 for the weak - vector extra data (see below.) */ -#define SCM_I_VECTOR_HEADER_SIZE 2U - -#define SCM_I_IS_VECTOR(x) (!SCM_IMP(x) && (SCM_TYP7S(x)==scm_tc7_vector)) -#define SCM_I_IS_NONWEAK_VECTOR(x) (!SCM_IMP(x) && (SCM_TYP7(x)==scm_tc7_vector)) +#define SCM_I_IS_VECTOR(x) (SCM_HAS_TYP7S (x, scm_tc7_vector)) +#define SCM_I_IS_NONWEAK_VECTOR(x) (SCM_HAS_TYP7 (x, scm_tc7_vector)) #define SCM_I_VECTOR_ELTS(x) ((const SCM *) SCM_I_VECTOR_WELTS (x)) -#define SCM_I_VECTOR_WELTS(x) (SCM_CELL_OBJECT_LOC (x, SCM_I_VECTOR_HEADER_SIZE)) +#define SCM_I_VECTOR_WELTS(x) (SCM_CELL_OBJECT_LOC (x, 1)) #define SCM_I_VECTOR_LENGTH(x) (((size_t) SCM_CELL_WORD_0 (x)) >> 8) SCM_INTERNAL SCM scm_i_vector_equal_p (SCM x, SCM y); -/* Weak vectors share implementation details with ordinary vectors, - but no one else should. */ - -#define SCM_I_WVECTP(x) (!SCM_IMP (x) && \ - SCM_TYP7 (x) == scm_tc7_wvect) -#define SCM_I_WVECT_LENGTH SCM_I_VECTOR_LENGTH -#define SCM_I_WVECT_VELTS SCM_I_VECTOR_ELTS -#define SCM_I_WVECT_GC_WVELTS SCM_I_VECTOR_WELTS -#define SCM_I_WVECT_EXTRA(x) (SCM_CELL_WORD_1 (x)) -#define SCM_I_SET_WVECT_EXTRA(x, t) (SCM_SET_CELL_WORD_1 ((x),(t))) - -SCM_INTERNAL SCM scm_i_make_weak_vector (scm_t_bits type, SCM size, SCM fill); -SCM_INTERNAL SCM scm_i_make_weak_vector_from_list (scm_t_bits type, SCM lst); SCM_INTERNAL void scm_init_vectors (void); diff --git a/libguile/vm-i-scheme.c b/libguile/vm-i-scheme.c index 2d8501253..f4fa44630 100644 --- a/libguile/vm-i-scheme.c +++ b/libguile/vm-i-scheme.c @@ -444,10 +444,57 @@ VM_DEFINE_FUNCTION (162, logxor, "logxor", 2) /* + * Strings + */ + +VM_DEFINE_FUNCTION (163, string_length, "string-length", 1) +{ + ARGS1 (str); + if (SCM_LIKELY (scm_is_string (str))) + RETURN (SCM_I_MAKINUM (scm_i_string_length (str))); + else + { + SYNC_REGISTER (); + RETURN (scm_string_length (str)); + } +} + +VM_DEFINE_FUNCTION (164, string_ref, "string-ref", 2) +{ + scm_t_signed_bits i = 0; + ARGS2 (str, idx); + if (SCM_LIKELY (scm_is_string (str) + && SCM_I_INUMP (idx) + && ((i = SCM_I_INUM (idx)) >= 0) + && i < scm_i_string_length (str))) + RETURN (SCM_MAKE_CHAR (scm_i_string_ref (str, i))); + else + { + SYNC_REGISTER (); + RETURN (scm_string_ref (str, idx)); + } +} + +/* No string-set! instruction, as there is no good fast path there. */ + + +/* * Vectors and arrays */ -VM_DEFINE_FUNCTION (163, vector_ref, "vector-ref", 2) +VM_DEFINE_FUNCTION (165, vector_length, "vector-length", 1) +{ + ARGS1 (vect); + if (SCM_LIKELY (SCM_I_IS_VECTOR (vect))) + RETURN (SCM_I_MAKINUM (SCM_I_VECTOR_LENGTH (vect))); + else + { + SYNC_REGISTER (); + RETURN (scm_vector_length (vect)); + } +} + +VM_DEFINE_FUNCTION (166, vector_ref, "vector-ref", 2) { scm_t_signed_bits i = 0; ARGS2 (vect, idx); @@ -463,7 +510,7 @@ VM_DEFINE_FUNCTION (163, vector_ref, "vector-ref", 2) } } -VM_DEFINE_INSTRUCTION (164, vector_set, "vector-set", 0, 3, 0) +VM_DEFINE_INSTRUCTION (167, vector_set, "vector-set", 0, 3, 0) { scm_t_signed_bits i = 0; SCM vect, idx, val; @@ -481,7 +528,7 @@ VM_DEFINE_INSTRUCTION (164, vector_set, "vector-set", 0, 3, 0) NEXT; } -VM_DEFINE_INSTRUCTION (165, make_array, "make-array", 3, -1, 1) +VM_DEFINE_INSTRUCTION (168, make_array, "make-array", 3, -1, 1) { scm_t_uint32 len; SCM shape, ret; @@ -510,20 +557,20 @@ VM_DEFINE_INSTRUCTION (165, make_array, "make-array", 3, -1, 1) goto vm_error_not_a_struct; \ } -VM_DEFINE_FUNCTION (166, struct_p, "struct?", 1) +VM_DEFINE_FUNCTION (169, struct_p, "struct?", 1) { ARGS1 (obj); RETURN (scm_from_bool (SCM_STRUCTP (obj))); } -VM_DEFINE_FUNCTION (167, struct_vtable, "struct-vtable", 1) +VM_DEFINE_FUNCTION (170, struct_vtable, "struct-vtable", 1) { ARGS1 (obj); VM_VALIDATE_STRUCT (obj, "struct_vtable"); RETURN (SCM_STRUCT_VTABLE (obj)); } -VM_DEFINE_INSTRUCTION (168, make_struct, "make-struct", 2, -1, 1) +VM_DEFINE_INSTRUCTION (171, make_struct, "make-struct", 2, -1, 1) { unsigned h = FETCH (); unsigned l = FETCH (); @@ -556,7 +603,7 @@ VM_DEFINE_INSTRUCTION (168, make_struct, "make-struct", 2, -1, 1) NEXT; } -VM_DEFINE_FUNCTION (169, struct_ref, "struct-ref", 2) +VM_DEFINE_FUNCTION (172, struct_ref, "struct-ref", 2) { ARGS2 (obj, pos); @@ -586,7 +633,7 @@ VM_DEFINE_FUNCTION (169, struct_ref, "struct-ref", 2) RETURN (scm_struct_ref (obj, pos)); } -VM_DEFINE_FUNCTION (170, struct_set, "struct-set", 3) +VM_DEFINE_FUNCTION (173, struct_set, "struct-set", 3) { ARGS3 (obj, pos, val); @@ -620,7 +667,7 @@ VM_DEFINE_FUNCTION (170, struct_set, "struct-set", 3) /* * GOOPS support */ -VM_DEFINE_FUNCTION (171, class_of, "class-of", 1) +VM_DEFINE_FUNCTION (174, class_of, "class-of", 1) { ARGS1 (obj); if (SCM_INSTANCEP (obj)) @@ -630,7 +677,7 @@ VM_DEFINE_FUNCTION (171, class_of, "class-of", 1) } /* FIXME: No checking whatsoever. */ -VM_DEFINE_FUNCTION (172, slot_ref, "slot-ref", 2) +VM_DEFINE_FUNCTION (175, slot_ref, "slot-ref", 2) { size_t slot; ARGS2 (instance, idx); @@ -639,7 +686,7 @@ VM_DEFINE_FUNCTION (172, slot_ref, "slot-ref", 2) } /* FIXME: No checking whatsoever. */ -VM_DEFINE_INSTRUCTION (173, slot_set, "slot-set", 0, 3, 0) +VM_DEFINE_INSTRUCTION (176, slot_set, "slot-set", 0, 3, 0) { SCM instance, idx, val; size_t slot; @@ -682,21 +729,21 @@ VM_DEFINE_INSTRUCTION (173, slot_set, "slot-set", 0, 3, 0) #define ALIGNED_P(ptr, type) \ ((scm_t_uintptr) (ptr) % alignof (type) == 0) -VM_DEFINE_FUNCTION (174, bv_u16_ref, "bv-u16-ref", 3) +VM_DEFINE_FUNCTION (177, bv_u16_ref, "bv-u16-ref", 3) BV_REF_WITH_ENDIANNESS (u16, u16) -VM_DEFINE_FUNCTION (175, bv_s16_ref, "bv-s16-ref", 3) +VM_DEFINE_FUNCTION (178, bv_s16_ref, "bv-s16-ref", 3) BV_REF_WITH_ENDIANNESS (s16, s16) -VM_DEFINE_FUNCTION (176, bv_u32_ref, "bv-u32-ref", 3) +VM_DEFINE_FUNCTION (179, bv_u32_ref, "bv-u32-ref", 3) BV_REF_WITH_ENDIANNESS (u32, u32) -VM_DEFINE_FUNCTION (177, bv_s32_ref, "bv-s32-ref", 3) +VM_DEFINE_FUNCTION (180, bv_s32_ref, "bv-s32-ref", 3) BV_REF_WITH_ENDIANNESS (s32, s32) -VM_DEFINE_FUNCTION (178, bv_u64_ref, "bv-u64-ref", 3) +VM_DEFINE_FUNCTION (181, bv_u64_ref, "bv-u64-ref", 3) BV_REF_WITH_ENDIANNESS (u64, u64) -VM_DEFINE_FUNCTION (179, bv_s64_ref, "bv-s64-ref", 3) +VM_DEFINE_FUNCTION (182, bv_s64_ref, "bv-s64-ref", 3) BV_REF_WITH_ENDIANNESS (s64, s64) -VM_DEFINE_FUNCTION (180, bv_f32_ref, "bv-f32-ref", 3) +VM_DEFINE_FUNCTION (183, bv_f32_ref, "bv-f32-ref", 3) BV_REF_WITH_ENDIANNESS (f32, ieee_single) -VM_DEFINE_FUNCTION (181, bv_f64_ref, "bv-f64-ref", 3) +VM_DEFINE_FUNCTION (184, bv_f64_ref, "bv-f64-ref", 3) BV_REF_WITH_ENDIANNESS (f64, ieee_double) #undef BV_REF_WITH_ENDIANNESS @@ -774,33 +821,33 @@ BV_REF_WITH_ENDIANNESS (f64, ieee_double) RETURN (scm_bytevector_ ## fn_stem ## _native_ref (bv, idx)); \ } -VM_DEFINE_FUNCTION (182, bv_u8_ref, "bv-u8-ref", 2) +VM_DEFINE_FUNCTION (185, bv_u8_ref, "bv-u8-ref", 2) BV_FIXABLE_INT_REF (u8, u8, uint8, 1) -VM_DEFINE_FUNCTION (183, bv_s8_ref, "bv-s8-ref", 2) +VM_DEFINE_FUNCTION (186, bv_s8_ref, "bv-s8-ref", 2) BV_FIXABLE_INT_REF (s8, s8, int8, 1) -VM_DEFINE_FUNCTION (184, bv_u16_native_ref, "bv-u16-native-ref", 2) +VM_DEFINE_FUNCTION (187, bv_u16_native_ref, "bv-u16-native-ref", 2) BV_FIXABLE_INT_REF (u16, u16_native, uint16, 2) -VM_DEFINE_FUNCTION (185, bv_s16_native_ref, "bv-s16-native-ref", 2) +VM_DEFINE_FUNCTION (188, bv_s16_native_ref, "bv-s16-native-ref", 2) BV_FIXABLE_INT_REF (s16, s16_native, int16, 2) -VM_DEFINE_FUNCTION (186, bv_u32_native_ref, "bv-u32-native-ref", 2) +VM_DEFINE_FUNCTION (189, bv_u32_native_ref, "bv-u32-native-ref", 2) #if SIZEOF_VOID_P > 4 BV_FIXABLE_INT_REF (u32, u32_native, uint32, 4) #else BV_INT_REF (u32, uint32, 4) #endif -VM_DEFINE_FUNCTION (187, bv_s32_native_ref, "bv-s32-native-ref", 2) +VM_DEFINE_FUNCTION (190, bv_s32_native_ref, "bv-s32-native-ref", 2) #if SIZEOF_VOID_P > 4 BV_FIXABLE_INT_REF (s32, s32_native, int32, 4) #else BV_INT_REF (s32, int32, 4) #endif -VM_DEFINE_FUNCTION (188, bv_u64_native_ref, "bv-u64-native-ref", 2) +VM_DEFINE_FUNCTION (191, bv_u64_native_ref, "bv-u64-native-ref", 2) BV_INT_REF (u64, uint64, 8) -VM_DEFINE_FUNCTION (189, bv_s64_native_ref, "bv-s64-native-ref", 2) +VM_DEFINE_FUNCTION (192, bv_s64_native_ref, "bv-s64-native-ref", 2) BV_INT_REF (s64, int64, 8) -VM_DEFINE_FUNCTION (190, bv_f32_native_ref, "bv-f32-native-ref", 2) +VM_DEFINE_FUNCTION (193, bv_f32_native_ref, "bv-f32-native-ref", 2) BV_FLOAT_REF (f32, ieee_single, float, 4) -VM_DEFINE_FUNCTION (191, bv_f64_native_ref, "bv-f64-native-ref", 2) +VM_DEFINE_FUNCTION (194, bv_f64_native_ref, "bv-f64-native-ref", 2) BV_FLOAT_REF (f64, ieee_double, double, 8) #undef BV_FIXABLE_INT_REF @@ -823,21 +870,21 @@ BV_FLOAT_REF (f64, ieee_double, double, 8) } \ } -VM_DEFINE_INSTRUCTION (192, bv_u16_set, "bv-u16-set", 0, 4, 0) +VM_DEFINE_INSTRUCTION (195, bv_u16_set, "bv-u16-set", 0, 4, 0) BV_SET_WITH_ENDIANNESS (u16, u16) -VM_DEFINE_INSTRUCTION (193, bv_s16_set, "bv-s16-set", 0, 4, 0) +VM_DEFINE_INSTRUCTION (196, bv_s16_set, "bv-s16-set", 0, 4, 0) BV_SET_WITH_ENDIANNESS (s16, s16) -VM_DEFINE_INSTRUCTION (194, bv_u32_set, "bv-u32-set", 0, 4, 0) +VM_DEFINE_INSTRUCTION (197, bv_u32_set, "bv-u32-set", 0, 4, 0) BV_SET_WITH_ENDIANNESS (u32, u32) -VM_DEFINE_INSTRUCTION (195, bv_s32_set, "bv-s32-set", 0, 4, 0) +VM_DEFINE_INSTRUCTION (198, bv_s32_set, "bv-s32-set", 0, 4, 0) BV_SET_WITH_ENDIANNESS (s32, s32) -VM_DEFINE_INSTRUCTION (196, bv_u64_set, "bv-u64-set", 0, 4, 0) +VM_DEFINE_INSTRUCTION (199, bv_u64_set, "bv-u64-set", 0, 4, 0) BV_SET_WITH_ENDIANNESS (u64, u64) -VM_DEFINE_INSTRUCTION (197, bv_s64_set, "bv-s64-set", 0, 4, 0) +VM_DEFINE_INSTRUCTION (200, bv_s64_set, "bv-s64-set", 0, 4, 0) BV_SET_WITH_ENDIANNESS (s64, s64) -VM_DEFINE_INSTRUCTION (198, bv_f32_set, "bv-f32-set", 0, 4, 0) +VM_DEFINE_INSTRUCTION (201, bv_f32_set, "bv-f32-set", 0, 4, 0) BV_SET_WITH_ENDIANNESS (f32, ieee_single) -VM_DEFINE_INSTRUCTION (199, bv_f64_set, "bv-f64-set", 0, 4, 0) +VM_DEFINE_INSTRUCTION (202, bv_f64_set, "bv-f64-set", 0, 4, 0) BV_SET_WITH_ENDIANNESS (f64, ieee_double) #undef BV_SET_WITH_ENDIANNESS @@ -917,33 +964,33 @@ BV_SET_WITH_ENDIANNESS (f64, ieee_double) NEXT; \ } -VM_DEFINE_INSTRUCTION (200, bv_u8_set, "bv-u8-set", 0, 3, 0) +VM_DEFINE_INSTRUCTION (203, bv_u8_set, "bv-u8-set", 0, 3, 0) BV_FIXABLE_INT_SET (u8, u8, uint8, 0, SCM_T_UINT8_MAX, 1) -VM_DEFINE_INSTRUCTION (201, bv_s8_set, "bv-s8-set", 0, 3, 0) +VM_DEFINE_INSTRUCTION (204, bv_s8_set, "bv-s8-set", 0, 3, 0) BV_FIXABLE_INT_SET (s8, s8, int8, SCM_T_INT8_MIN, SCM_T_INT8_MAX, 1) -VM_DEFINE_INSTRUCTION (202, bv_u16_native_set, "bv-u16-native-set", 0, 3, 0) +VM_DEFINE_INSTRUCTION (205, bv_u16_native_set, "bv-u16-native-set", 0, 3, 0) BV_FIXABLE_INT_SET (u16, u16_native, uint16, 0, SCM_T_UINT16_MAX, 2) -VM_DEFINE_INSTRUCTION (203, bv_s16_native_set, "bv-s16-native-set", 0, 3, 0) +VM_DEFINE_INSTRUCTION (206, bv_s16_native_set, "bv-s16-native-set", 0, 3, 0) BV_FIXABLE_INT_SET (s16, s16_native, int16, SCM_T_INT16_MIN, SCM_T_INT16_MAX, 2) -VM_DEFINE_INSTRUCTION (204, bv_u32_native_set, "bv-u32-native-set", 0, 3, 0) +VM_DEFINE_INSTRUCTION (207, bv_u32_native_set, "bv-u32-native-set", 0, 3, 0) #if SIZEOF_VOID_P > 4 BV_FIXABLE_INT_SET (u32, u32_native, uint32, 0, SCM_T_UINT32_MAX, 4) #else BV_INT_SET (u32, uint32, 4) #endif -VM_DEFINE_INSTRUCTION (205, bv_s32_native_set, "bv-s32-native-set", 0, 3, 0) +VM_DEFINE_INSTRUCTION (208, bv_s32_native_set, "bv-s32-native-set", 0, 3, 0) #if SIZEOF_VOID_P > 4 BV_FIXABLE_INT_SET (s32, s32_native, int32, SCM_T_INT32_MIN, SCM_T_INT32_MAX, 4) #else BV_INT_SET (s32, int32, 4) #endif -VM_DEFINE_INSTRUCTION (206, bv_u64_native_set, "bv-u64-native-set", 0, 3, 0) +VM_DEFINE_INSTRUCTION (209, bv_u64_native_set, "bv-u64-native-set", 0, 3, 0) BV_INT_SET (u64, uint64, 8) -VM_DEFINE_INSTRUCTION (207, bv_s64_native_set, "bv-s64-native-set", 0, 3, 0) +VM_DEFINE_INSTRUCTION (210, bv_s64_native_set, "bv-s64-native-set", 0, 3, 0) BV_INT_SET (s64, int64, 8) -VM_DEFINE_INSTRUCTION (208, bv_f32_native_set, "bv-f32-native-set", 0, 3, 0) +VM_DEFINE_INSTRUCTION (211, bv_f32_native_set, "bv-f32-native-set", 0, 3, 0) BV_FLOAT_SET (f32, ieee_single, float, 4) -VM_DEFINE_INSTRUCTION (209, bv_f64_native_set, "bv-f64-native-set", 0, 3, 0) +VM_DEFINE_INSTRUCTION (212, bv_f64_native_set, "bv-f64-native-set", 0, 3, 0) BV_FLOAT_SET (f64, ieee_double, double, 8) #undef BV_FIXABLE_INT_SET diff --git a/libguile/vm-i-system.c b/libguile/vm-i-system.c index 474fe7883..8981042f8 100644 --- a/libguile/vm-i-system.c +++ b/libguile/vm-i-system.c @@ -787,7 +787,7 @@ VM_DEFINE_INSTRUCTION (53, call, "call", 1, -1, 1) sp[-nargs] = SCM_STRUCT_PROCEDURE (program); goto vm_call; } - else if (SCM_NIMP (program) && SCM_TYP7 (program) == scm_tc7_smob + else if (SCM_HAS_TYP7 (program, scm_tc7_smob) && SCM_SMOB_APPLICABLE_P (program)) { SYNC_REGISTER (); @@ -835,7 +835,7 @@ VM_DEFINE_INSTRUCTION (54, tail_call, "tail-call", 1, -1, 1) sp[-nargs] = SCM_STRUCT_PROCEDURE (program); goto vm_tail_call; } - else if (SCM_NIMP (program) && SCM_TYP7 (program) == scm_tc7_smob + else if (SCM_HAS_TYP7 (program, scm_tc7_smob) && SCM_SMOB_APPLICABLE_P (program)) { SYNC_REGISTER (); @@ -1096,7 +1096,7 @@ VM_DEFINE_INSTRUCTION (62, mv_call, "mv-call", 4, -1, 1) sp[-nargs] = SCM_STRUCT_PROCEDURE (program); goto vm_mv_call; } - else if (SCM_NIMP (program) && SCM_TYP7 (program) == scm_tc7_smob + else if (SCM_HAS_TYP7 (program, scm_tc7_smob) && SCM_SMOB_APPLICABLE_P (program)) { SYNC_REGISTER (); diff --git a/libguile/vm.c b/libguile/vm.c index 49df5cbee..859658816 100644 --- a/libguile/vm.c +++ b/libguile/vm.c @@ -83,9 +83,9 @@ static SCM sym_debug; void scm_i_vm_cont_print (SCM x, SCM port, scm_print_state *pstate) { - scm_puts ("#<vm-continuation ", port); + scm_puts_unlocked ("#<vm-continuation ", port); scm_uintprint (SCM_UNPACK (x), 16, port); - scm_puts (">", port); + scm_puts_unlocked (">", port); } /* In theory, a number of vm instances can be active in the call trace, and we @@ -228,8 +228,8 @@ vm_dispatch_hook (SCM vm, int hook_num) frame = (scm_t_cell *) ROUND_UP ((scm_t_uintptr) frame, 8UL); frame->word_0 = SCM_PACK (scm_tc7_frame); - frame->word_1 = PTR2SCM (&c_frame); - args[0] = PTR2SCM (frame); + frame->word_1 = SCM_PACK_POINTER (&c_frame); + args[0] = SCM_PACK_POINTER (frame); scm_c_run_hookn (hook, args, 1); @@ -351,22 +351,22 @@ scm_i_vm_print (SCM x, SCM port, scm_print_state *pstate) vm = SCM_VM_DATA (x); - scm_puts ("#<vm ", port); + scm_puts_unlocked ("#<vm ", port); switch (vm->engine) { case SCM_VM_REGULAR_ENGINE: - scm_puts ("regular-engine ", port); + scm_puts_unlocked ("regular-engine ", port); break; case SCM_VM_DEBUG_ENGINE: - scm_puts ("debug-engine ", port); + scm_puts_unlocked ("debug-engine ", port); break; default: - scm_puts ("unknown-engine ", port); + scm_puts_unlocked ("unknown-engine ", port); } scm_uintprint (SCM_UNPACK (x), 16, port); - scm_puts (">", port); + scm_puts_unlocked (">", port); } static SCM @@ -391,7 +391,8 @@ really_make_boot_program (long nargs) bp->metalen = 0; u8vec = scm_c_take_gc_bytevector ((scm_t_int8*)bp, - sizeof (struct scm_objcode) + sizeof (text)); + sizeof (struct scm_objcode) + sizeof (text), + SCM_BOOL_F); ret = scm_make_program (scm_bytecode_to_native_objcode (u8vec), SCM_BOOL_F, SCM_BOOL_F); SCM_SET_CELL_WORD_0 (ret, SCM_CELL_WORD_0 (ret) | SCM_F_PROGRAM_IS_BOOT); @@ -503,7 +504,7 @@ make_vm (void) /* Keep a pointer to VP so that `vm_stack_mark ()' can know what the stack top is. */ - *vp->stack_base = PTR2SCM (vp); + *vp->stack_base = SCM_PACK_POINTER (vp); vp->stack_base++; vp->stack_size--; #else diff --git a/libguile/vm.h b/libguile/vm.h index d354a53c0..2479ee4a4 100644 --- a/libguile/vm.h +++ b/libguile/vm.h @@ -55,7 +55,7 @@ struct scm_vm { SCM_API SCM scm_the_vm_fluid; -#define SCM_VM_P(x) (SCM_NIMP (x) && SCM_TYP7 (x) == scm_tc7_vm) +#define SCM_VM_P(x) (SCM_HAS_TYP7 (x, scm_tc7_vm)) #define SCM_VM_DATA(vm) ((struct scm_vm *) SCM_CELL_WORD_1 (vm)) #define SCM_VALIDATE_VM(pos,x) SCM_MAKE_VALIDATE (pos, x, VM_P) @@ -96,7 +96,7 @@ struct scm_vm_cont { scm_t_uint32 flags; }; -#define SCM_VM_CONT_P(OBJ) (SCM_NIMP (OBJ) && SCM_TYP7 (OBJ) == scm_tc7_vm_cont) +#define SCM_VM_CONT_P(OBJ) (SCM_HAS_TYP7 (OBJ, scm_tc7_vm_cont)) #define SCM_VM_CONT_DATA(CONT) ((struct scm_vm_cont *) SCM_CELL_WORD_1 (CONT)) #define SCM_VM_CONT_PARTIAL_P(CONT) (SCM_VM_CONT_DATA (CONT)->flags & SCM_F_VM_CONT_PARTIAL) #define SCM_VM_CONT_REWINDABLE_P(CONT) (SCM_VM_CONT_DATA (CONT)->flags & SCM_F_VM_CONT_REWINDABLE) diff --git a/libguile/vports.c b/libguile/vports.c index 5178d79c7..62f552ad7 100644 --- a/libguile/vports.c +++ b/libguile/vports.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995,1996,1998,1999,2000,2001, 2002, 2003, 2006, 2009, 2010 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996,1998,1999,2000,2001, 2002, 2003, 2006, 2009, 2010, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -114,7 +114,7 @@ sf_fill_input (SCM port) return *pt->read_buf; } else - scm_ungetc (SCM_CHAR (ans), port); + scm_ungetc_unlocked (SCM_CHAR (ans), port); return SCM_CHAR (ans); } @@ -198,7 +198,6 @@ SCM_DEFINE (scm_make_soft_port, "make-soft-port", 2, 0, 0, #define FUNC_NAME s_scm_make_soft_port { int vlen; - scm_t_port *pt; SCM z; SCM_VALIDATE_VECTOR (1, pv); @@ -206,14 +205,10 @@ SCM_DEFINE (scm_make_soft_port, "make-soft-port", 2, 0, 0, SCM_ASSERT ((vlen == 5) || (vlen == 6), pv, 1, FUNC_NAME); SCM_VALIDATE_STRING (2, modes); - scm_i_scm_pthread_mutex_lock (&scm_i_port_table_mutex); - z = scm_new_port_table_entry (scm_tc16_sfport); - pt = SCM_PTAB_ENTRY (z); - scm_port_non_buffer (pt); - SCM_SET_CELL_TYPE (z, scm_tc16_sfport | scm_i_mode_bits (modes)); - - SCM_SETSTREAM (z, SCM_UNPACK (pv)); - scm_i_pthread_mutex_unlock (&scm_i_port_table_mutex); + z = scm_c_make_port (scm_tc16_sfport, scm_i_mode_bits (modes), + SCM_UNPACK (pv)); + scm_port_non_buffer (SCM_PTAB_ENTRY (z)); + return z; } #undef FUNC_NAME diff --git a/libguile/weak-set.c b/libguile/weak-set.c new file mode 100644 index 000000000..57e9e5001 --- /dev/null +++ b/libguile/weak-set.c @@ -0,0 +1,891 @@ +/* Copyright (C) 2011 Free Software Foundation, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 3 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + + + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <assert.h> + +#include "libguile/_scm.h" +#include "libguile/hash.h" +#include "libguile/eval.h" +#include "libguile/ports.h" +#include "libguile/bdw-gc.h" + +#include "libguile/validate.h" +#include "libguile/weak-set.h" + + +/* Weak Sets + + This file implements weak sets. One example of a weak set is the + symbol table, where you want all instances of the `foo' symbol to map + to one object. So when you load a file and it wants a symbol with + the characters "foo", you one up in the table, using custom hash and + equality predicates. Only if one is not found will you bother to + cons one up and intern it. + + Another use case for weak sets is the set of open ports. Guile needs + to be able to flush them all when the process exits, but the set + shouldn't prevent the GC from collecting the port (and thus closing + it). + + Weak sets are implemented using an open-addressed hash table. + Basically this means that there is an array of entries, and the item + is expected to be found the slot corresponding to its hash code, + modulo the length of the array. + + Collisions are handled using linear probing with the Robin Hood + technique. See Pedro Celis' paper, "Robin Hood Hashing": + + http://www.cs.uwaterloo.ca/research/tr/1986/CS-86-14.pdf + + The vector of entries is allocated as an "atomic" piece of memory, so + that the GC doesn't trace it. When an item is added to the set, a + disappearing link is registered to its location. If the item is + collected, then that link will be zeroed out. + + An entry is not just an item, though; the hash code is also stored in + the entry. We munge hash codes so that they are never 0. In this + way we can detect removed entries (key of zero but nonzero hash + code), and can then reshuffle elements as needed to maintain the + robin hood ordering. + + Compared to buckets-and-chains hash tables, open addressing has the + advantage that it is very cache-friendly. It also uses less memory. + + Implementation-wise, there are two things to note. + + 1. We assume that hash codes are evenly distributed across the + range of unsigned longs. The actual hash code stored in the + entry is left-shifted by 1 bit (losing 1 bit of hash precision), + and then or'd with 1. In this way we ensure that the hash field + of an occupied entry is nonzero. To map to an index, we + right-shift the hash by one, divide by the size, and take the + remainder. + + 2. Since the "keys" (the objects in the set) are stored in an + atomic region with disappearing links, they need to be accessed + with the GC alloc lock. `copy_weak_entry' will do that for + you. The hash code itself can be read outside the lock, + though. +*/ + + +typedef struct { + unsigned long hash; + scm_t_bits key; +} scm_t_weak_entry; + + +struct weak_entry_data { + scm_t_weak_entry *in; + scm_t_weak_entry *out; +}; + +static void* +do_copy_weak_entry (void *data) +{ + struct weak_entry_data *e = data; + + e->out->hash = e->in->hash; + e->out->key = e->in->key; + + return NULL; +} + +static void +copy_weak_entry (scm_t_weak_entry *src, scm_t_weak_entry *dst) +{ + struct weak_entry_data data; + + data.in = src; + data.out = dst; + + GC_call_with_alloc_lock (do_copy_weak_entry, &data); +} + + +typedef struct { + scm_t_weak_entry *entries; /* the data */ + scm_i_pthread_mutex_t lock; /* the lock */ + unsigned long size; /* total number of slots. */ + unsigned long n_items; /* number of items in set */ + unsigned long lower; /* when to shrink */ + unsigned long upper; /* when to grow */ + int size_index; /* index into hashset_size */ + int min_size_index; /* minimum size_index */ +} scm_t_weak_set; + + +#define SCM_WEAK_SET_P(x) (SCM_HAS_TYP7 (x, scm_tc7_weak_set)) +#define SCM_VALIDATE_WEAK_SET(pos, arg) \ + SCM_MAKE_VALIDATE_MSG (pos, arg, WEAK_SET_P, "weak-set") +#define SCM_WEAK_SET(x) ((scm_t_weak_set *) SCM_CELL_WORD_1 (x)) + + +static unsigned long +hash_to_index (unsigned long hash, unsigned long size) +{ + return (hash >> 1) % size; +} + +static unsigned long +entry_distance (unsigned long hash, unsigned long k, unsigned long size) +{ + unsigned long origin = hash_to_index (hash, size); + + if (k >= origin) + return k - origin; + else + /* The other key was displaced and wrapped around. */ + return size - origin + k; +} + +static void +move_weak_entry (scm_t_weak_entry *from, scm_t_weak_entry *to) +{ + if (from->hash) + { + scm_t_weak_entry copy; + + copy_weak_entry (from, ©); + to->hash = copy.hash; + to->key = copy.key; + + if (copy.key && SCM_HEAP_OBJECT_P (SCM_PACK (copy.key))) + { +#ifdef HAVE_GC_MOVE_DISAPPEARING_LINK + GC_move_disappearing_link ((GC_PTR) &from->key, (GC_PTR) &to->key); +#else + GC_unregister_disappearing_link ((GC_PTR) &from->key); + SCM_I_REGISTER_DISAPPEARING_LINK ((GC_PTR) &to->key, + (GC_PTR) to->key); +#endif + } + } + else + { + to->hash = 0; + to->key = 0; + } +} + +static void +rob_from_rich (scm_t_weak_set *set, unsigned long k) +{ + unsigned long empty, size; + + size = set->size; + + /* If we are to free up slot K in the set, we need room to do so. */ + assert (set->n_items < size); + + empty = k; + do + empty = (empty + 1) % size; + /* Here we access key outside the lock. Is this a problem? At first + glance, I wouldn't think so. */ + while (set->entries[empty].key); + + do + { + unsigned long last = empty ? (empty - 1) : (size - 1); + move_weak_entry (&set->entries[last], &set->entries[empty]); + empty = last; + } + while (empty != k); + + /* Just for sanity. */ + set->entries[empty].hash = 0; + set->entries[empty].key = 0; +} + +static void +give_to_poor (scm_t_weak_set *set, unsigned long k) +{ + /* Slot K was just freed up; possibly shuffle others down. */ + unsigned long size = set->size; + + while (1) + { + unsigned long next = (k + 1) % size; + unsigned long hash; + scm_t_weak_entry copy; + + hash = set->entries[next].hash; + + if (!hash || hash_to_index (hash, size) == next) + break; + + copy_weak_entry (&set->entries[next], ©); + + if (!copy.key) + /* Lost weak reference. */ + { + give_to_poor (set, next); + set->n_items--; + continue; + } + + move_weak_entry (&set->entries[next], &set->entries[k]); + + k = next; + } + + /* We have shuffled down any entries that should be shuffled down; now + free the end. */ + set->entries[k].hash = 0; + set->entries[k].key = 0; +} + + + + +/* Growing or shrinking is triggered when the load factor + * + * L = N / S (N: number of items in set, S: bucket vector length) + * + * passes an upper limit of 0.9 or a lower limit of 0.2. + * + * The implementation stores the upper and lower number of items which + * trigger a resize in the hashset object. + * + * Possible hash set sizes (primes) are stored in the array + * hashset_size. + */ + +static unsigned long hashset_size[] = { + 31, 61, 113, 223, 443, 883, 1759, 3517, 7027, 14051, 28099, 56197, 112363, + 224717, 449419, 898823, 1797641, 3595271, 7190537, 14381041, 28762081, + 57524111, 115048217, 230096423 +}; + +#define HASHSET_SIZE_N (sizeof(hashset_size)/sizeof(unsigned long)) + +static void +resize_set (scm_t_weak_set *set) +{ + scm_t_weak_entry *old_entries, *new_entries; + int i; + unsigned long old_size, new_size, old_k; + + old_entries = set->entries; + old_size = set->size; + + if (set->n_items < set->lower) + { + /* rehashing is not triggered when i <= min_size */ + i = set->size_index; + do + --i; + while (i > set->min_size_index + && set->n_items < hashset_size[i] / 4); + } + else + { + i = set->size_index + 1; + if (i >= HASHSET_SIZE_N) + /* The biggest size currently is 230096423, which for a 32-bit + machine will occupy 1.5GB of memory at a load of 80%. There + is probably something better to do here, but if you have a + weak map of that size, you are hosed in any case. */ + abort (); + } + + new_size = hashset_size[i]; + new_entries = scm_gc_malloc_pointerless (new_size * sizeof(scm_t_weak_entry), + "weak set"); + memset (new_entries, 0, new_size * sizeof(scm_t_weak_entry)); + + set->size_index = i; + set->size = new_size; + if (i <= set->min_size_index) + set->lower = 0; + else + set->lower = new_size / 5; + set->upper = 9 * new_size / 10; + set->n_items = 0; + set->entries = new_entries; + + for (old_k = 0; old_k < old_size; old_k++) + { + scm_t_weak_entry copy; + unsigned long new_k, distance; + + if (!old_entries[old_k].hash) + continue; + + copy_weak_entry (&old_entries[old_k], ©); + + if (!copy.key) + continue; + + new_k = hash_to_index (copy.hash, new_size); + + for (distance = 0; ; distance++, new_k = (new_k + 1) % new_size) + { + unsigned long other_hash = new_entries[new_k].hash; + + if (!other_hash) + /* Found an empty entry. */ + break; + + /* Displace the entry if our distance is less, otherwise keep + looking. */ + if (entry_distance (other_hash, new_k, new_size) < distance) + { + rob_from_rich (set, new_k); + break; + } + } + + set->n_items++; + new_entries[new_k].hash = copy.hash; + new_entries[new_k].key = copy.key; + + if (SCM_HEAP_OBJECT_P (SCM_PACK (copy.key))) + SCM_I_REGISTER_DISAPPEARING_LINK ((GC_PTR) &new_entries[new_k].key, + (GC_PTR) new_entries[new_k].key); + } +} + +/* Run after GC via do_vacuum_weak_set, this function runs over the + whole table, removing lost weak references, reshuffling the set as it + goes. It might resize the set if it reaps enough entries. */ +static void +vacuum_weak_set (scm_t_weak_set *set) +{ + scm_t_weak_entry *entries = set->entries; + unsigned long size = set->size; + unsigned long k; + + for (k = 0; k < size; k++) + { + unsigned long hash = entries[k].hash; + + if (hash) + { + scm_t_weak_entry copy; + + copy_weak_entry (&entries[k], ©); + + if (!copy.key) + /* Lost weak reference; reshuffle. */ + { + give_to_poor (set, k); + set->n_items--; + } + } + } + + if (set->n_items < set->lower) + resize_set (set); +} + + + + +static SCM +weak_set_lookup (scm_t_weak_set *set, unsigned long hash, + scm_t_set_predicate_fn pred, void *closure, + SCM dflt) +{ + unsigned long k, distance, size; + scm_t_weak_entry *entries; + + size = set->size; + entries = set->entries; + + hash = (hash << 1) | 0x1; + k = hash_to_index (hash, size); + + for (distance = 0; distance < size; distance++, k = (k + 1) % size) + { + unsigned long other_hash; + + retry: + other_hash = entries[k].hash; + + if (!other_hash) + /* Not found. */ + return dflt; + + if (hash == other_hash) + { + scm_t_weak_entry copy; + + copy_weak_entry (&entries[k], ©); + + if (!copy.key) + /* Lost weak reference; reshuffle. */ + { + give_to_poor (set, k); + set->n_items--; + goto retry; + } + + if (pred (SCM_PACK (copy.key), closure)) + /* Found. */ + return SCM_PACK (copy.key); + } + + /* If the entry's distance is less, our key is not in the set. */ + if (entry_distance (other_hash, k, size) < distance) + return dflt; + } + + /* If we got here, then we were unfortunate enough to loop through the + whole set. Shouldn't happen, but hey. */ + return dflt; +} + + +static SCM +weak_set_add_x (scm_t_weak_set *set, unsigned long hash, + scm_t_set_predicate_fn pred, void *closure, + SCM obj) +{ + unsigned long k, distance, size; + scm_t_weak_entry *entries; + + size = set->size; + entries = set->entries; + + hash = (hash << 1) | 0x1; + k = hash_to_index (hash, size); + + for (distance = 0; ; distance++, k = (k + 1) % size) + { + unsigned long other_hash; + + retry: + other_hash = entries[k].hash; + + if (!other_hash) + /* Found an empty entry. */ + break; + + if (other_hash == hash) + { + scm_t_weak_entry copy; + + copy_weak_entry (&entries[k], ©); + + if (!copy.key) + /* Lost weak reference; reshuffle. */ + { + give_to_poor (set, k); + set->n_items--; + goto retry; + } + + if (pred (SCM_PACK (copy.key), closure)) + /* Found an entry with this key. */ + return SCM_PACK (copy.key); + } + + if (set->n_items > set->upper) + /* Full set, time to resize. */ + { + resize_set (set); + return weak_set_add_x (set, hash >> 1, pred, closure, obj); + } + + /* Displace the entry if our distance is less, otherwise keep + looking. */ + if (entry_distance (other_hash, k, size) < distance) + { + rob_from_rich (set, k); + break; + } + } + + set->n_items++; + entries[k].hash = hash; + entries[k].key = SCM_UNPACK (obj); + + if (SCM_HEAP_OBJECT_P (obj)) + SCM_I_REGISTER_DISAPPEARING_LINK ((GC_PTR) &entries[k].key, + (GC_PTR) SCM_HEAP_OBJECT_BASE (obj)); + + return obj; +} + + +static void +weak_set_remove_x (scm_t_weak_set *set, unsigned long hash, + scm_t_set_predicate_fn pred, void *closure) +{ + unsigned long k, distance, size; + scm_t_weak_entry *entries; + + size = set->size; + entries = set->entries; + + hash = (hash << 1) | 0x1; + k = hash_to_index (hash, size); + + for (distance = 0; distance < size; distance++, k = (k + 1) % size) + { + unsigned long other_hash; + + retry: + other_hash = entries[k].hash; + + if (!other_hash) + /* Not found. */ + return; + + if (other_hash == hash) + { + scm_t_weak_entry copy; + + copy_weak_entry (&entries[k], ©); + + if (!copy.key) + /* Lost weak reference; reshuffle. */ + { + give_to_poor (set, k); + set->n_items--; + goto retry; + } + + if (pred (SCM_PACK (copy.key), closure)) + /* Found an entry with this key. */ + { + entries[k].hash = 0; + entries[k].key = 0; + + if (SCM_HEAP_OBJECT_P (SCM_PACK (copy.key))) + GC_unregister_disappearing_link ((GC_PTR) &entries[k].key); + + if (--set->n_items < set->lower) + resize_set (set); + else + give_to_poor (set, k); + + return; + } + } + + /* If the entry's distance is less, our key is not in the set. */ + if (entry_distance (other_hash, k, size) < distance) + return; + } +} + + + +static SCM +make_weak_set (unsigned long k) +{ + scm_t_weak_set *set; + + int i = 0, n = k ? k : 31; + while (i + 1 < HASHSET_SIZE_N && n > hashset_size[i]) + ++i; + n = hashset_size[i]; + + set = scm_gc_malloc (sizeof (*set), "weak-set"); + set->entries = scm_gc_malloc_pointerless (n * sizeof(scm_t_weak_entry), + "weak-set"); + memset (set->entries, 0, n * sizeof(scm_t_weak_entry)); + set->n_items = 0; + set->size = n; + set->lower = 0; + set->upper = 9 * n / 10; + set->size_index = i; + set->min_size_index = i; + scm_i_pthread_mutex_init (&set->lock, NULL); + + return scm_cell (scm_tc7_weak_set, (scm_t_bits)set); +} + +void +scm_i_weak_set_print (SCM exp, SCM port, scm_print_state *pstate) +{ + scm_puts_unlocked ("#<", port); + scm_puts_unlocked ("weak-set ", port); + scm_uintprint (SCM_WEAK_SET (exp)->n_items, 10, port); + scm_putc_unlocked ('/', port); + scm_uintprint (SCM_WEAK_SET (exp)->size, 10, port); + scm_puts_unlocked (">", port); +} + +static void +do_vacuum_weak_set (SCM set) +{ + scm_t_weak_set *s; + + s = SCM_WEAK_SET (set); + + if (scm_i_pthread_mutex_trylock (&s->lock) == 0) + { + vacuum_weak_set (s); + scm_i_pthread_mutex_unlock (&s->lock); + } + + return; +} + +/* The before-gc C hook only runs if GC_set_start_callback is available, + so if not, fall back on a finalizer-based implementation. */ +static int +weak_gc_callback (void **weak) +{ + void *val = weak[0]; + void (*callback) (SCM) = weak[1]; + + if (!val) + return 0; + + callback (SCM_PACK_POINTER (val)); + + return 1; +} + +#ifdef HAVE_GC_SET_START_CALLBACK +static void* +weak_gc_hook (void *hook_data, void *fn_data, void *data) +{ + if (!weak_gc_callback (fn_data)) + scm_c_hook_remove (&scm_before_gc_c_hook, weak_gc_hook, fn_data); + + return NULL; +} +#else +static void +weak_gc_finalizer (void *ptr, void *data) +{ + if (weak_gc_callback (ptr)) + GC_REGISTER_FINALIZER_NO_ORDER (ptr, weak_gc_finalizer, data, NULL, NULL); +} +#endif + +static void +scm_c_register_weak_gc_callback (SCM obj, void (*callback) (SCM)) +{ + void **weak = GC_MALLOC_ATOMIC (sizeof (void*) * 2); + + weak[0] = SCM_UNPACK_POINTER (obj); + weak[1] = (void*)callback; + GC_GENERAL_REGISTER_DISAPPEARING_LINK (weak, SCM_HEAP_OBJECT_BASE (obj)); + +#ifdef HAVE_GC_SET_START_CALLBACK + scm_c_hook_add (&scm_after_gc_c_hook, weak_gc_hook, weak, 0); +#else + GC_REGISTER_FINALIZER_NO_ORDER (weak, weak_gc_finalizer, NULL, NULL, NULL); +#endif +} + +SCM +scm_c_make_weak_set (unsigned long k) +{ + SCM ret; + + ret = make_weak_set (k); + + scm_c_register_weak_gc_callback (ret, do_vacuum_weak_set); + + return ret; +} + +SCM +scm_weak_set_p (SCM obj) +{ + return scm_from_bool (SCM_WEAK_SET_P (obj)); +} + +SCM +scm_weak_set_clear_x (SCM set) +{ + scm_t_weak_set *s = SCM_WEAK_SET (set); + + scm_i_pthread_mutex_lock (&s->lock); + + memset (s->entries, 0, sizeof (scm_t_weak_entry) * s->size); + s->n_items = 0; + + scm_i_pthread_mutex_unlock (&s->lock); + + return SCM_UNSPECIFIED; +} + +SCM +scm_c_weak_set_lookup (SCM set, unsigned long raw_hash, + scm_t_set_predicate_fn pred, + void *closure, SCM dflt) +{ + SCM ret; + scm_t_weak_set *s = SCM_WEAK_SET (set); + + scm_i_pthread_mutex_lock (&s->lock); + + ret = weak_set_lookup (s, raw_hash, pred, closure, dflt); + + scm_i_pthread_mutex_unlock (&s->lock); + + return ret; +} + +SCM +scm_c_weak_set_add_x (SCM set, unsigned long raw_hash, + scm_t_set_predicate_fn pred, + void *closure, SCM obj) +{ + SCM ret; + scm_t_weak_set *s = SCM_WEAK_SET (set); + + scm_i_pthread_mutex_lock (&s->lock); + + ret = weak_set_add_x (s, raw_hash, pred, closure, obj); + + scm_i_pthread_mutex_unlock (&s->lock); + + return ret; +} + +void +scm_c_weak_set_remove_x (SCM set, unsigned long raw_hash, + scm_t_set_predicate_fn pred, + void *closure) +{ + scm_t_weak_set *s = SCM_WEAK_SET (set); + + scm_i_pthread_mutex_lock (&s->lock); + + weak_set_remove_x (s, raw_hash, pred, closure); + + scm_i_pthread_mutex_unlock (&s->lock); +} + +static int +eq_predicate (SCM x, void *closure) +{ + return scm_is_eq (x, SCM_PACK_POINTER (closure)); +} + +SCM +scm_weak_set_add_x (SCM set, SCM obj) +{ + return scm_c_weak_set_add_x (set, scm_ihashq (obj, -1), + eq_predicate, SCM_UNPACK_POINTER (obj), obj); +} + +SCM +scm_weak_set_remove_x (SCM set, SCM obj) +{ + scm_c_weak_set_remove_x (set, scm_ihashq (obj, -1), + eq_predicate, SCM_UNPACK_POINTER (obj)); + + return SCM_UNSPECIFIED; +} + +SCM +scm_c_weak_set_fold (scm_t_set_fold_fn proc, void *closure, + SCM init, SCM set) +{ + scm_t_weak_set *s; + scm_t_weak_entry *entries; + unsigned long k, size; + + s = SCM_WEAK_SET (set); + + scm_i_pthread_mutex_lock (&s->lock); + + size = s->size; + entries = s->entries; + + for (k = 0; k < size; k++) + { + if (entries[k].hash) + { + scm_t_weak_entry copy; + + copy_weak_entry (&entries[k], ©); + + if (copy.key) + { + /* Release set lock while we call the function. */ + scm_i_pthread_mutex_unlock (&s->lock); + init = proc (closure, SCM_PACK (copy.key), init); + scm_i_pthread_mutex_lock (&s->lock); + } + } + } + + scm_i_pthread_mutex_unlock (&s->lock); + + return init; +} + +static SCM +fold_trampoline (void *closure, SCM item, SCM init) +{ + return scm_call_2 (SCM_PACK_POINTER (closure), item, init); +} + +SCM +scm_weak_set_fold (SCM proc, SCM init, SCM set) +{ + return scm_c_weak_set_fold (fold_trampoline, SCM_UNPACK_POINTER (proc), init, set); +} + +static SCM +for_each_trampoline (void *closure, SCM item, SCM seed) +{ + scm_call_1 (SCM_PACK_POINTER (closure), item); + return seed; +} + +SCM +scm_weak_set_for_each (SCM proc, SCM set) +{ + scm_c_weak_set_fold (for_each_trampoline, SCM_UNPACK_POINTER (proc), SCM_BOOL_F, set); + + return SCM_UNSPECIFIED; +} + +static SCM +map_trampoline (void *closure, SCM item, SCM seed) +{ + return scm_cons (scm_call_1 (SCM_PACK_POINTER (closure), item), seed); +} + +SCM +scm_weak_set_map_to_list (SCM proc, SCM set) +{ + return scm_c_weak_set_fold (map_trampoline, SCM_UNPACK_POINTER (proc), SCM_EOL, set); +} + + +void +scm_init_weak_set () +{ +#include "libguile/weak-set.x" +} + +/* + Local Variables: + c-file-style: "gnu" + End: +*/ diff --git a/libguile/weak-set.h b/libguile/weak-set.h new file mode 100644 index 000000000..86781c78a --- /dev/null +++ b/libguile/weak-set.h @@ -0,0 +1,69 @@ +/* classes: h_files */ + +#ifndef SCM_WEAK_SET_H +#define SCM_WEAK_SET_H + +/* Copyright (C) 2011 Free Software Foundation, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 3 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + + + +#include "libguile/__scm.h" + + + +/* The weak set API is currently only used internally. We could make it + public later, after some API review. */ + +/* Function that returns nonzero if the given object is the one we are + looking for. */ +typedef int (*scm_t_set_predicate_fn) (SCM obj, void *closure); + +/* Function to fold over the elements of a set. */ +typedef SCM (*scm_t_set_fold_fn) (void *closure, SCM key, SCM result); + +SCM_INTERNAL SCM scm_c_make_weak_set (unsigned long k); +SCM_INTERNAL SCM scm_weak_set_p (SCM h); +SCM_INTERNAL SCM scm_c_weak_set_lookup (SCM set, unsigned long raw_hash, + scm_t_set_predicate_fn pred, + void *closure, SCM dflt); +SCM_INTERNAL SCM scm_c_weak_set_add_x (SCM set, unsigned long raw_hash, + scm_t_set_predicate_fn pred, + void *closure, SCM obj); +SCM_INTERNAL void scm_c_weak_set_remove_x (SCM set, unsigned long raw_hash, + scm_t_set_predicate_fn pred, + void *closure); +SCM_INTERNAL SCM scm_weak_set_add_x (SCM set, SCM obj); +SCM_INTERNAL SCM scm_weak_set_remove_x (SCM set, SCM obj); +SCM_INTERNAL SCM scm_weak_set_clear_x (SCM set); +SCM_INTERNAL SCM scm_c_weak_set_fold (scm_t_set_fold_fn proc, void *closure, + SCM init, SCM set); +SCM_INTERNAL SCM scm_weak_set_fold (SCM proc, SCM init, SCM set); +SCM_INTERNAL SCM scm_weak_set_for_each (SCM proc, SCM set); +SCM_INTERNAL SCM scm_weak_set_map_to_list (SCM proc, SCM set); + +SCM_INTERNAL void scm_i_weak_set_print (SCM exp, SCM port, scm_print_state *pstate); +SCM_INTERNAL void scm_init_weak_set (void); + +#endif /* SCM_WEAK_SET_H */ + +/* + Local Variables: + c-file-style: "gnu" + End: +*/ diff --git a/libguile/weak-table.c b/libguile/weak-table.c new file mode 100644 index 000000000..47d65e69c --- /dev/null +++ b/libguile/weak-table.c @@ -0,0 +1,1160 @@ +/* Copyright (C) 2011 Free Software Foundation, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 3 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + + + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <assert.h> + +#include "libguile/bdw-gc.h" +#include <gc/gc_mark.h> + +#include "libguile/_scm.h" +#include "libguile/hash.h" +#include "libguile/eval.h" +#include "libguile/ports.h" + +#include "libguile/validate.h" +#include "libguile/weak-table.h" + + +/* Weak Tables + + This file implements weak hash tables. Weak hash tables are + generally used when you want to augment some object with additional + data, but when you don't have space to store the data in the object. + For example, procedure properties are implemented with weak tables. + + Weak tables are implemented using an open-addressed hash table. + Basically this means that there is an array of entries, and the item + is expected to be found the slot corresponding to its hash code, + modulo the length of the array. + + Collisions are handled using linear probing with the Robin Hood + technique. See Pedro Celis' paper, "Robin Hood Hashing": + + http://www.cs.uwaterloo.ca/research/tr/1986/CS-86-14.pdf + + The vector of entries is allocated in such a way that the GC doesn't + trace the weak values. For doubly-weak tables, this means that the + entries are allocated as an "atomic" piece of memory. Key-weak and + value-weak tables use a special GC kind with a custom mark procedure. + When items are added weakly into table, a disappearing link is + registered to their locations. If the referent is collected, then + that link will be zeroed out. + + An entry in the table consists of the key and the value, together + with the hash code of the key. We munge hash codes so that they are + never 0. In this way we can detect removed entries (key of zero but + nonzero hash code), and can then reshuffle elements as needed to + maintain the robin hood ordering. + + Compared to buckets-and-chains hash tables, open addressing has the + advantage that it is very cache-friendly. It also uses less memory. + + Implementation-wise, there are two things to note. + + 1. We assume that hash codes are evenly distributed across the + range of unsigned longs. The actual hash code stored in the + entry is left-shifted by 1 bit (losing 1 bit of hash precision), + and then or'd with 1. In this way we ensure that the hash field + of an occupied entry is nonzero. To map to an index, we + right-shift the hash by one, divide by the size, and take the + remainder. + + 2. Since the weak references are stored in an atomic region with + disappearing links, they need to be accessed with the GC alloc + lock. `copy_weak_entry' will do that for you. The hash code + itself can be read outside the lock, though. + */ + + +typedef struct { + unsigned long hash; + scm_t_bits key; + scm_t_bits value; +} scm_t_weak_entry; + + +struct weak_entry_data { + scm_t_weak_entry *in; + scm_t_weak_entry *out; +}; + +static void* +do_copy_weak_entry (void *data) +{ + struct weak_entry_data *e = data; + + e->out->hash = e->in->hash; + e->out->key = e->in->key; + e->out->value = e->in->value; + + return NULL; +} + +static void +copy_weak_entry (scm_t_weak_entry *src, scm_t_weak_entry *dst) +{ + struct weak_entry_data data; + + data.in = src; + data.out = dst; + + GC_call_with_alloc_lock (do_copy_weak_entry, &data); +} + +static void +register_disappearing_links (scm_t_weak_entry *entry, + SCM k, SCM v, + scm_t_weak_table_kind kind) +{ + if (SCM_UNPACK (k) && SCM_HEAP_OBJECT_P (k) + && (kind == SCM_WEAK_TABLE_KIND_KEY + || kind == SCM_WEAK_TABLE_KIND_BOTH)) + SCM_I_REGISTER_DISAPPEARING_LINK ((GC_PTR) &entry->key, + (GC_PTR) SCM_HEAP_OBJECT_BASE (k)); + + if (SCM_UNPACK (v) && SCM_HEAP_OBJECT_P (v) + && (kind == SCM_WEAK_TABLE_KIND_VALUE + || kind == SCM_WEAK_TABLE_KIND_BOTH)) + SCM_I_REGISTER_DISAPPEARING_LINK ((GC_PTR) &entry->value, + (GC_PTR) SCM_HEAP_OBJECT_BASE (v)); +} + +static void +unregister_disappearing_links (scm_t_weak_entry *entry, + scm_t_weak_table_kind kind) +{ + if (kind == SCM_WEAK_TABLE_KIND_KEY || kind == SCM_WEAK_TABLE_KIND_BOTH) + GC_unregister_disappearing_link ((GC_PTR) &entry->key); + + if (kind == SCM_WEAK_TABLE_KIND_VALUE || kind == SCM_WEAK_TABLE_KIND_BOTH) + GC_unregister_disappearing_link ((GC_PTR) &entry->value); +} + +static void +move_disappearing_links (scm_t_weak_entry *from, scm_t_weak_entry *to, + SCM key, SCM value, scm_t_weak_table_kind kind) +{ + if ((kind == SCM_WEAK_TABLE_KIND_KEY || kind == SCM_WEAK_TABLE_KIND_BOTH) + && SCM_HEAP_OBJECT_P (key)) + { +#ifdef HAVE_GC_MOVE_DISAPPEARING_LINK + GC_move_disappearing_link ((GC_PTR) &from->key, (GC_PTR) &to->key); +#else + GC_unregister_disappearing_link (&from->key); + SCM_I_REGISTER_DISAPPEARING_LINK (&to->key, SCM_HEAP_OBJECT_BASE (key)); +#endif + } + + if ((kind == SCM_WEAK_TABLE_KIND_VALUE || kind == SCM_WEAK_TABLE_KIND_BOTH) + && SCM_HEAP_OBJECT_P (value)) + { +#ifdef HAVE_GC_MOVE_DISAPPEARING_LINK + GC_move_disappearing_link ((GC_PTR) &from->value, (GC_PTR) &to->value); +#else + GC_unregister_disappearing_link (&from->value); + SCM_I_REGISTER_DISAPPEARING_LINK (&to->value, SCM_HEAP_OBJECT_BASE (value)); +#endif + } +} + +static void +move_weak_entry (scm_t_weak_entry *from, scm_t_weak_entry *to, + scm_t_weak_table_kind kind) +{ + if (from->hash) + { + scm_t_weak_entry copy; + + copy_weak_entry (from, ©); + to->hash = copy.hash; + to->key = copy.key; + to->value = copy.value; + + move_disappearing_links (from, to, + SCM_PACK (copy.key), SCM_PACK (copy.value), + kind); + } + else + { + to->hash = 0; + to->key = 0; + to->value = 0; + } +} + + +typedef struct { + scm_t_weak_entry *entries; /* the data */ + scm_i_pthread_mutex_t lock; /* the lock */ + scm_t_weak_table_kind kind; /* what kind of table it is */ + unsigned long size; /* total number of slots. */ + unsigned long n_items; /* number of items in table */ + unsigned long lower; /* when to shrink */ + unsigned long upper; /* when to grow */ + int size_index; /* index into hashtable_size */ + int min_size_index; /* minimum size_index */ +} scm_t_weak_table; + + +#define SCM_WEAK_TABLE_P(x) (SCM_HAS_TYP7 (x, scm_tc7_weak_table)) +#define SCM_VALIDATE_WEAK_TABLE(pos, arg) \ + SCM_MAKE_VALIDATE_MSG (pos, arg, WEAK_TABLE_P, "weak-table") +#define SCM_WEAK_TABLE(x) ((scm_t_weak_table *) SCM_CELL_WORD_1 (x)) + + +static unsigned long +hash_to_index (unsigned long hash, unsigned long size) +{ + return (hash >> 1) % size; +} + +static unsigned long +entry_distance (unsigned long hash, unsigned long k, unsigned long size) +{ + unsigned long origin = hash_to_index (hash, size); + + if (k >= origin) + return k - origin; + else + /* The other key was displaced and wrapped around. */ + return size - origin + k; +} + +static void +rob_from_rich (scm_t_weak_table *table, unsigned long k) +{ + unsigned long empty, size; + + size = table->size; + + /* If we are to free up slot K in the table, we need room to do so. */ + assert (table->n_items < size); + + empty = k; + do + empty = (empty + 1) % size; + while (table->entries[empty].hash); + + do + { + unsigned long last = empty ? (empty - 1) : (size - 1); + move_weak_entry (&table->entries[last], &table->entries[empty], + table->kind); + empty = last; + } + while (empty != k); + + table->entries[empty].hash = 0; + table->entries[empty].key = 0; + table->entries[empty].value = 0; +} + +static void +give_to_poor (scm_t_weak_table *table, unsigned long k) +{ + /* Slot K was just freed up; possibly shuffle others down. */ + unsigned long size = table->size; + + while (1) + { + unsigned long next = (k + 1) % size; + unsigned long hash; + scm_t_weak_entry copy; + + hash = table->entries[next].hash; + + if (!hash || hash_to_index (hash, size) == next) + break; + + copy_weak_entry (&table->entries[next], ©); + + if (!copy.key || !copy.value) + /* Lost weak reference. */ + { + give_to_poor (table, next); + table->n_items--; + continue; + } + + move_weak_entry (&table->entries[next], &table->entries[k], + table->kind); + + k = next; + } + + /* We have shuffled down any entries that should be shuffled down; now + free the end. */ + table->entries[k].hash = 0; + table->entries[k].key = 0; + table->entries[k].value = 0; +} + + + + +/* The GC "kinds" for singly-weak tables. */ +static int weak_key_gc_kind; +static int weak_value_gc_kind; + +static struct GC_ms_entry * +mark_weak_key_table (GC_word *addr, struct GC_ms_entry *mark_stack_ptr, + struct GC_ms_entry *mark_stack_limit, GC_word env) +{ + scm_t_weak_entry *entries = (scm_t_weak_entry*) addr; + unsigned long k, size = GC_size (addr) / sizeof (scm_t_weak_entry); + + for (k = 0; k < size; k++) + if (entries[k].hash && entries[k].key) + { + SCM value = SCM_PACK (entries[k].value); + mark_stack_ptr = GC_MARK_AND_PUSH ((GC_word*) SCM_HEAP_OBJECT_BASE (value), + mark_stack_ptr, mark_stack_limit, + NULL); + } + + return mark_stack_ptr; +} + +static struct GC_ms_entry * +mark_weak_value_table (GC_word *addr, struct GC_ms_entry *mark_stack_ptr, + struct GC_ms_entry *mark_stack_limit, GC_word env) +{ + scm_t_weak_entry *entries = (scm_t_weak_entry*) addr; + unsigned long k, size = GC_size (addr) / sizeof (scm_t_weak_entry); + + for (k = 0; k < size; k++) + if (entries[k].hash && entries[k].value) + { + SCM key = SCM_PACK (entries[k].key); + mark_stack_ptr = GC_MARK_AND_PUSH ((GC_word*) SCM_HEAP_OBJECT_BASE (key), + mark_stack_ptr, mark_stack_limit, + NULL); + } + + return mark_stack_ptr; +} + +static scm_t_weak_entry * +allocate_entries (unsigned long size, scm_t_weak_table_kind kind) +{ + scm_t_weak_entry *ret; + size_t bytes = size * sizeof (*ret); + + switch (kind) + { + case SCM_WEAK_TABLE_KIND_KEY: + ret = GC_generic_malloc (bytes, weak_key_gc_kind); + break; + case SCM_WEAK_TABLE_KIND_VALUE: + ret = GC_generic_malloc (bytes, weak_value_gc_kind); + break; + case SCM_WEAK_TABLE_KIND_BOTH: + ret = scm_gc_malloc_pointerless (bytes, "weak-table"); + break; + default: + abort (); + } + + memset (ret, 0, bytes); + + return ret; +} + + + +/* Growing or shrinking is triggered when the load factor + * + * L = N / S (N: number of items in table, S: bucket vector length) + * + * passes an upper limit of 0.9 or a lower limit of 0.2. + * + * The implementation stores the upper and lower number of items which + * trigger a resize in the hashtable object. + * + * Possible hash table sizes (primes) are stored in the array + * hashtable_size. + */ + +static unsigned long hashtable_size[] = { + 31, 61, 113, 223, 443, 883, 1759, 3517, 7027, 14051, 28099, 56197, 112363, + 224717, 449419, 898823, 1797641, 3595271, 7190537, 14381041, 28762081, + 57524111, 115048217, 230096423 +}; + +#define HASHTABLE_SIZE_N (sizeof(hashtable_size)/sizeof(unsigned long)) + +static void +resize_table (scm_t_weak_table *table) +{ + scm_t_weak_entry *old_entries, *new_entries; + int i; + unsigned long old_size, new_size, old_k; + + old_entries = table->entries; + old_size = table->size; + + if (table->n_items < table->lower) + { + /* rehashing is not triggered when i <= min_size */ + i = table->size_index; + do + --i; + while (i > table->min_size_index + && table->n_items < hashtable_size[i] / 4); + } + else + { + i = table->size_index + 1; + if (i >= HASHTABLE_SIZE_N) + /* The biggest size currently is 230096423, which for a 32-bit + machine will occupy 2.3GB of memory at a load of 80%. There + is probably something better to do here, but if you have a + weak map of that size, you are hosed in any case. */ + abort (); + } + + new_size = hashtable_size[i]; + new_entries = allocate_entries (new_size, table->kind); + + table->size_index = i; + table->size = new_size; + if (i <= table->min_size_index) + table->lower = 0; + else + table->lower = new_size / 5; + table->upper = 9 * new_size / 10; + table->n_items = 0; + table->entries = new_entries; + + for (old_k = 0; old_k < old_size; old_k++) + { + scm_t_weak_entry copy; + unsigned long new_k, distance; + + if (!old_entries[old_k].hash) + continue; + + copy_weak_entry (&old_entries[old_k], ©); + + if (!copy.key || !copy.value) + continue; + + new_k = hash_to_index (copy.hash, new_size); + + for (distance = 0; ; distance++, new_k = (new_k + 1) % new_size) + { + unsigned long other_hash = new_entries[new_k].hash; + + if (!other_hash) + /* Found an empty entry. */ + break; + + /* Displace the entry if our distance is less, otherwise keep + looking. */ + if (entry_distance (other_hash, new_k, new_size) < distance) + { + rob_from_rich (table, new_k); + break; + } + } + + table->n_items++; + new_entries[new_k].hash = copy.hash; + new_entries[new_k].key = copy.key; + new_entries[new_k].value = copy.value; + + register_disappearing_links (&new_entries[new_k], + SCM_PACK (copy.key), SCM_PACK (copy.value), + table->kind); + } +} + +/* Run after GC via do_vacuum_weak_table, this function runs over the + whole table, removing lost weak references, reshuffling the table as it + goes. It might resize the table if it reaps enough entries. */ +static void +vacuum_weak_table (scm_t_weak_table *table) +{ + scm_t_weak_entry *entries = table->entries; + unsigned long size = table->size; + unsigned long k; + + for (k = 0; k < size; k++) + { + unsigned long hash = entries[k].hash; + + if (hash) + { + scm_t_weak_entry copy; + + copy_weak_entry (&entries[k], ©); + + if (!copy.key || !copy.value) + /* Lost weak reference; reshuffle. */ + { + give_to_poor (table, k); + table->n_items--; + } + } + } + + if (table->n_items < table->lower) + resize_table (table); +} + + + + +static SCM +weak_table_ref (scm_t_weak_table *table, unsigned long hash, + scm_t_table_predicate_fn pred, void *closure, + SCM dflt) +{ + unsigned long k, distance, size; + scm_t_weak_entry *entries; + + size = table->size; + entries = table->entries; + + hash = (hash << 1) | 0x1; + k = hash_to_index (hash, size); + + for (distance = 0; distance < size; distance++, k = (k + 1) % size) + { + unsigned long other_hash; + + retry: + other_hash = entries[k].hash; + + if (!other_hash) + /* Not found. */ + return dflt; + + if (hash == other_hash) + { + scm_t_weak_entry copy; + + copy_weak_entry (&entries[k], ©); + + if (!copy.key || !copy.value) + /* Lost weak reference; reshuffle. */ + { + give_to_poor (table, k); + table->n_items--; + goto retry; + } + + if (pred (SCM_PACK (copy.key), SCM_PACK (copy.value), closure)) + /* Found. */ + return SCM_PACK (copy.value); + } + + /* If the entry's distance is less, our key is not in the table. */ + if (entry_distance (other_hash, k, size) < distance) + return dflt; + } + + /* If we got here, then we were unfortunate enough to loop through the + whole table. Shouldn't happen, but hey. */ + return dflt; +} + + +static void +weak_table_put_x (scm_t_weak_table *table, unsigned long hash, + scm_t_table_predicate_fn pred, void *closure, + SCM key, SCM value) +{ + unsigned long k, distance, size; + scm_t_weak_entry *entries; + + size = table->size; + entries = table->entries; + + hash = (hash << 1) | 0x1; + k = hash_to_index (hash, size); + + for (distance = 0; ; distance++, k = (k + 1) % size) + { + unsigned long other_hash; + + retry: + other_hash = entries[k].hash; + + if (!other_hash) + /* Found an empty entry. */ + break; + + if (other_hash == hash) + { + scm_t_weak_entry copy; + + copy_weak_entry (&entries[k], ©); + + if (!copy.key || !copy.value) + /* Lost weak reference; reshuffle. */ + { + give_to_poor (table, k); + table->n_items--; + goto retry; + } + + if (pred (SCM_PACK (copy.key), SCM_PACK (copy.value), closure)) + /* Found an entry with this key. */ + break; + } + + if (table->n_items > table->upper) + /* Full table, time to resize. */ + { + resize_table (table); + return weak_table_put_x (table, hash >> 1, pred, closure, key, value); + } + + /* Displace the entry if our distance is less, otherwise keep + looking. */ + if (entry_distance (other_hash, k, size) < distance) + { + rob_from_rich (table, k); + break; + } + } + + if (entries[k].hash) + unregister_disappearing_links (&entries[k], table->kind); + else + table->n_items++; + + entries[k].hash = hash; + entries[k].key = SCM_UNPACK (key); + entries[k].value = SCM_UNPACK (value); + + register_disappearing_links (&entries[k], key, value, table->kind); +} + + +static void +weak_table_remove_x (scm_t_weak_table *table, unsigned long hash, + scm_t_table_predicate_fn pred, void *closure) +{ + unsigned long k, distance, size; + scm_t_weak_entry *entries; + + size = table->size; + entries = table->entries; + + hash = (hash << 1) | 0x1; + k = hash_to_index (hash, size); + + for (distance = 0; distance < size; distance++, k = (k + 1) % size) + { + unsigned long other_hash; + + retry: + other_hash = entries[k].hash; + + if (!other_hash) + /* Not found. */ + return; + + if (other_hash == hash) + { + scm_t_weak_entry copy; + + copy_weak_entry (&entries[k], ©); + + if (!copy.key || !copy.value) + /* Lost weak reference; reshuffle. */ + { + give_to_poor (table, k); + table->n_items--; + goto retry; + } + + if (pred (SCM_PACK (copy.key), SCM_PACK (copy.value), closure)) + /* Found an entry with this key. */ + { + entries[k].hash = 0; + entries[k].key = 0; + entries[k].value = 0; + + unregister_disappearing_links (&entries[k], table->kind); + + if (--table->n_items < table->lower) + resize_table (table); + else + give_to_poor (table, k); + + return; + } + } + + /* If the entry's distance is less, our key is not in the table. */ + if (entry_distance (other_hash, k, size) < distance) + return; + } +} + + + +static SCM +make_weak_table (unsigned long k, scm_t_weak_table_kind kind) +{ + scm_t_weak_table *table; + + int i = 0, n = k ? k : 31; + while (i + 1 < HASHTABLE_SIZE_N && n > hashtable_size[i]) + ++i; + n = hashtable_size[i]; + + table = scm_gc_malloc (sizeof (*table), "weak-table"); + table->entries = allocate_entries (n, kind); + table->kind = kind; + table->n_items = 0; + table->size = n; + table->lower = 0; + table->upper = 9 * n / 10; + table->size_index = i; + table->min_size_index = i; + scm_i_pthread_mutex_init (&table->lock, NULL); + + return scm_cell (scm_tc7_weak_table, (scm_t_bits)table); +} + +void +scm_i_weak_table_print (SCM exp, SCM port, scm_print_state *pstate) +{ + scm_puts_unlocked ("#<", port); + scm_puts_unlocked ("weak-table ", port); + scm_uintprint (SCM_WEAK_TABLE (exp)->n_items, 10, port); + scm_putc_unlocked ('/', port); + scm_uintprint (SCM_WEAK_TABLE (exp)->size, 10, port); + scm_puts_unlocked (">", port); +} + +static void +do_vacuum_weak_table (SCM table) +{ + scm_t_weak_table *t; + + t = SCM_WEAK_TABLE (table); + + if (scm_i_pthread_mutex_trylock (&t->lock) == 0) + { + vacuum_weak_table (t); + scm_i_pthread_mutex_unlock (&t->lock); + } + + return; +} + +/* The before-gc C hook only runs if GC_table_start_callback is available, + so if not, fall back on a finalizer-based implementation. */ +static int +weak_gc_callback (void **weak) +{ + void *val = weak[0]; + void (*callback) (SCM) = weak[1]; + + if (!val) + return 0; + + callback (SCM_PACK_POINTER (val)); + + return 1; +} + +#ifdef HAVE_GC_TABLE_START_CALLBACK +static void* +weak_gc_hook (void *hook_data, void *fn_data, void *data) +{ + if (!weak_gc_callback (fn_data)) + scm_c_hook_remove (&scm_before_gc_c_hook, weak_gc_hook, fn_data); + + return NULL; +} +#else +static void +weak_gc_finalizer (void *ptr, void *data) +{ + if (weak_gc_callback (ptr)) + GC_REGISTER_FINALIZER_NO_ORDER (ptr, weak_gc_finalizer, data, NULL, NULL); +} +#endif + +static void +scm_c_register_weak_gc_callback (SCM obj, void (*callback) (SCM)) +{ + void **weak = GC_MALLOC_ATOMIC (sizeof (void*) * 2); + + weak[0] = SCM_UNPACK_POINTER (obj); + weak[1] = (void*)callback; + GC_GENERAL_REGISTER_DISAPPEARING_LINK (weak, SCM_HEAP_OBJECT_BASE (obj)); + +#ifdef HAVE_GC_TABLE_START_CALLBACK + scm_c_hook_add (&scm_after_gc_c_hook, weak_gc_hook, weak, 0); +#else + GC_REGISTER_FINALIZER_NO_ORDER (weak, weak_gc_finalizer, NULL, NULL, NULL); +#endif +} + +SCM +scm_c_make_weak_table (unsigned long k, scm_t_weak_table_kind kind) +{ + SCM ret; + + ret = make_weak_table (k, kind); + + scm_c_register_weak_gc_callback (ret, do_vacuum_weak_table); + + return ret; +} + +SCM +scm_weak_table_p (SCM obj) +{ + return scm_from_bool (SCM_WEAK_TABLE_P (obj)); +} + +SCM +scm_c_weak_table_ref (SCM table, unsigned long raw_hash, + scm_t_table_predicate_fn pred, + void *closure, SCM dflt) +#define FUNC_NAME "weak-table-ref" +{ + SCM ret; + scm_t_weak_table *t; + + SCM_VALIDATE_WEAK_TABLE (1, table); + + t = SCM_WEAK_TABLE (table); + + scm_i_pthread_mutex_lock (&t->lock); + + ret = weak_table_ref (t, raw_hash, pred, closure, dflt); + + scm_i_pthread_mutex_unlock (&t->lock); + + return ret; +} +#undef FUNC_NAME + +void +scm_c_weak_table_put_x (SCM table, unsigned long raw_hash, + scm_t_table_predicate_fn pred, + void *closure, SCM key, SCM value) +#define FUNC_NAME "weak-table-put!" +{ + scm_t_weak_table *t; + + SCM_VALIDATE_WEAK_TABLE (1, table); + + t = SCM_WEAK_TABLE (table); + + scm_i_pthread_mutex_lock (&t->lock); + + weak_table_put_x (t, raw_hash, pred, closure, key, value); + + scm_i_pthread_mutex_unlock (&t->lock); +} +#undef FUNC_NAME + +void +scm_c_weak_table_remove_x (SCM table, unsigned long raw_hash, + scm_t_table_predicate_fn pred, + void *closure) +#define FUNC_NAME "weak-table-remove!" +{ + scm_t_weak_table *t; + + SCM_VALIDATE_WEAK_TABLE (1, table); + + t = SCM_WEAK_TABLE (table); + + scm_i_pthread_mutex_lock (&t->lock); + + weak_table_remove_x (t, raw_hash, pred, closure); + + scm_i_pthread_mutex_unlock (&t->lock); +} +#undef FUNC_NAME + +static int +assq_predicate (SCM x, SCM y, void *closure) +{ + return scm_is_eq (x, SCM_PACK_POINTER (closure)); +} + +SCM +scm_weak_table_refq (SCM table, SCM key, SCM dflt) +{ + if (SCM_UNBNDP (dflt)) + dflt = SCM_BOOL_F; + + return scm_c_weak_table_ref (table, scm_ihashq (key, -1), + assq_predicate, SCM_UNPACK_POINTER (key), + dflt); +} + +SCM +scm_weak_table_putq_x (SCM table, SCM key, SCM value) +{ + scm_c_weak_table_put_x (table, scm_ihashq (key, -1), + assq_predicate, SCM_UNPACK_POINTER (key), + key, value); + return SCM_UNSPECIFIED; +} + +SCM +scm_weak_table_remq_x (SCM table, SCM key) +{ + scm_c_weak_table_remove_x (table, scm_ihashq (key, -1), + assq_predicate, SCM_UNPACK_POINTER (key)); + return SCM_UNSPECIFIED; +} + +SCM +scm_weak_table_clear_x (SCM table) +#define FUNC_NAME "weak-table-clear!" +{ + scm_t_weak_table *t; + + SCM_VALIDATE_WEAK_TABLE (1, table); + + t = SCM_WEAK_TABLE (table); + + scm_i_pthread_mutex_lock (&t->lock); + + memset (t->entries, 0, sizeof (scm_t_weak_entry) * t->size); + t->n_items = 0; + + scm_i_pthread_mutex_unlock (&t->lock); + + return SCM_UNSPECIFIED; +} +#undef FUNC_NAME + +SCM +scm_c_weak_table_fold (scm_t_table_fold_fn proc, void *closure, + SCM init, SCM table) +{ + scm_t_weak_table *t; + scm_t_weak_entry *entries; + unsigned long k, size; + + t = SCM_WEAK_TABLE (table); + + scm_i_pthread_mutex_lock (&t->lock); + + size = t->size; + entries = t->entries; + + for (k = 0; k < size; k++) + { + if (entries[k].hash) + { + scm_t_weak_entry copy; + + copy_weak_entry (&entries[k], ©); + + if (copy.key && copy.value) + { + /* Release table lock while we call the function. */ + scm_i_pthread_mutex_unlock (&t->lock); + init = proc (closure, + SCM_PACK (copy.key), SCM_PACK (copy.value), + init); + scm_i_pthread_mutex_lock (&t->lock); + } + } + } + + scm_i_pthread_mutex_unlock (&t->lock); + + return init; +} + +static SCM +fold_trampoline (void *closure, SCM k, SCM v, SCM init) +{ + return scm_call_3 (SCM_PACK_POINTER (closure), k, v, init); +} + +SCM +scm_weak_table_fold (SCM proc, SCM init, SCM table) +#define FUNC_NAME "weak-table-fold" +{ + SCM_VALIDATE_WEAK_TABLE (3, table); + SCM_VALIDATE_PROC (1, proc); + + return scm_c_weak_table_fold (fold_trampoline, SCM_UNPACK_POINTER (proc), init, table); +} +#undef FUNC_NAME + +static SCM +for_each_trampoline (void *closure, SCM k, SCM v, SCM seed) +{ + scm_call_2 (SCM_PACK_POINTER (closure), k, v); + return seed; +} + +SCM +scm_weak_table_for_each (SCM proc, SCM table) +#define FUNC_NAME "weak-table-for-each" +{ + SCM_VALIDATE_WEAK_TABLE (2, table); + SCM_VALIDATE_PROC (1, proc); + + scm_c_weak_table_fold (for_each_trampoline, SCM_UNPACK_POINTER (proc), SCM_BOOL_F, table); + + return SCM_UNSPECIFIED; +} +#undef FUNC_NAME + +static SCM +map_trampoline (void *closure, SCM k, SCM v, SCM seed) +{ + return scm_cons (scm_call_2 (SCM_PACK_POINTER (closure), k, v), seed); +} + +SCM +scm_weak_table_map_to_list (SCM proc, SCM table) +#define FUNC_NAME "weak-table-map->list" +{ + SCM_VALIDATE_WEAK_TABLE (2, table); + SCM_VALIDATE_PROC (1, proc); + + return scm_c_weak_table_fold (map_trampoline, SCM_UNPACK_POINTER (proc), SCM_EOL, table); +} +#undef FUNC_NAME + + + + +/* Legacy interface. */ + +SCM_DEFINE (scm_make_weak_key_hash_table, "make-weak-key-hash-table", 0, 1, 0, + (SCM n), + "@deffnx {Scheme Procedure} make-weak-value-hash-table size\n" + "@deffnx {Scheme Procedure} make-doubly-weak-hash-table size\n" + "Return a weak hash table with @var{size} buckets.\n" + "\n" + "You can modify weak hash tables in exactly the same way you\n" + "would modify regular hash tables. (@pxref{Hash Tables})") +#define FUNC_NAME s_scm_make_weak_key_hash_table +{ + return scm_c_make_weak_table (SCM_UNBNDP (n) ? 0 : scm_to_ulong (n), + SCM_WEAK_TABLE_KIND_KEY); +} +#undef FUNC_NAME + + +SCM_DEFINE (scm_make_weak_value_hash_table, "make-weak-value-hash-table", 0, 1, 0, + (SCM n), + "Return a hash table with weak values with @var{size} buckets.\n" + "(@pxref{Hash Tables})") +#define FUNC_NAME s_scm_make_weak_value_hash_table +{ + return scm_c_make_weak_table (SCM_UNBNDP (n) ? 0 : scm_to_ulong (n), + SCM_WEAK_TABLE_KIND_VALUE); +} +#undef FUNC_NAME + + +SCM_DEFINE (scm_make_doubly_weak_hash_table, "make-doubly-weak-hash-table", 1, 0, 0, + (SCM n), + "Return a hash table with weak keys and values with @var{size}\n" + "buckets. (@pxref{Hash Tables})") +#define FUNC_NAME s_scm_make_doubly_weak_hash_table +{ + return scm_c_make_weak_table (SCM_UNBNDP (n) ? 0 : scm_to_ulong (n), + SCM_WEAK_TABLE_KIND_BOTH); +} +#undef FUNC_NAME + + +SCM_DEFINE (scm_weak_key_hash_table_p, "weak-key-hash-table?", 1, 0, 0, + (SCM obj), + "@deffnx {Scheme Procedure} weak-value-hash-table? obj\n" + "@deffnx {Scheme Procedure} doubly-weak-hash-table? obj\n" + "Return @code{#t} if @var{obj} is the specified weak hash\n" + "table. Note that a doubly weak hash table is neither a weak key\n" + "nor a weak value hash table.") +#define FUNC_NAME s_scm_weak_key_hash_table_p +{ + return scm_from_bool (SCM_WEAK_TABLE_P (obj) && + SCM_WEAK_TABLE (obj)->kind == SCM_WEAK_TABLE_KIND_KEY); +} +#undef FUNC_NAME + + +SCM_DEFINE (scm_weak_value_hash_table_p, "weak-value-hash-table?", 1, 0, 0, + (SCM obj), + "Return @code{#t} if @var{obj} is a weak value hash table.") +#define FUNC_NAME s_scm_weak_value_hash_table_p +{ + return scm_from_bool (SCM_WEAK_TABLE_P (obj) && + SCM_WEAK_TABLE (obj)->kind == SCM_WEAK_TABLE_KIND_VALUE); +} +#undef FUNC_NAME + + +SCM_DEFINE (scm_doubly_weak_hash_table_p, "doubly-weak-hash-table?", 1, 0, 0, + (SCM obj), + "Return @code{#t} if @var{obj} is a doubly weak hash table.") +#define FUNC_NAME s_scm_doubly_weak_hash_table_p +{ + return scm_from_bool (SCM_WEAK_TABLE_P (obj) && + SCM_WEAK_TABLE (obj)->kind == SCM_WEAK_TABLE_KIND_BOTH); +} +#undef FUNC_NAME + + + + + +void +scm_weak_table_prehistory (void) +{ + weak_key_gc_kind = + GC_new_kind (GC_new_free_list (), + GC_MAKE_PROC (GC_new_proc (mark_weak_key_table), 0), + 0, 0); + weak_value_gc_kind = + GC_new_kind (GC_new_free_list (), + GC_MAKE_PROC (GC_new_proc (mark_weak_value_table), 0), + 0, 0); +} + +void +scm_init_weak_table () +{ +#include "libguile/weak-table.x" +} + +/* + Local Variables: + c-file-style: "gnu" + End: +*/ diff --git a/libguile/weak-table.h b/libguile/weak-table.h new file mode 100644 index 000000000..cb2831c3a --- /dev/null +++ b/libguile/weak-table.h @@ -0,0 +1,94 @@ +/* classes: h_files */ + +#ifndef SCM_WEAK_TABLE_H +#define SCM_WEAK_TABLE_H + +/* Copyright (C) 2011 Free Software Foundation, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 3 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + + + +#include "libguile/__scm.h" + + + +/* The weak table API is currently only used internally. We could make it + public later, after some API review. */ + +typedef enum { + SCM_WEAK_TABLE_KIND_KEY, + SCM_WEAK_TABLE_KIND_VALUE, + SCM_WEAK_TABLE_KIND_BOTH, +} scm_t_weak_table_kind; + +/* Function that returns nonzero if the given mapping is the one we are + looking for. */ +typedef int (*scm_t_table_predicate_fn) (SCM k, SCM v, void *closure); + +/* Function to fold over the elements of a set. */ +typedef SCM (*scm_t_table_fold_fn) (void *closure, SCM k, SCM v, SCM result); + +SCM_INTERNAL SCM scm_c_make_weak_table (unsigned long k, + scm_t_weak_table_kind kind); +SCM_INTERNAL SCM scm_weak_table_p (SCM h); + +SCM_INTERNAL SCM scm_c_weak_table_ref (SCM table, unsigned long raw_hash, + scm_t_table_predicate_fn pred, + void *closure, SCM dflt); +SCM_INTERNAL void scm_c_weak_table_put_x (SCM table, unsigned long raw_hash, + scm_t_table_predicate_fn pred, + void *closure, SCM key, SCM value); +SCM_INTERNAL void scm_c_weak_table_remove_x (SCM table, unsigned long raw_hash, + scm_t_table_predicate_fn pred, + void *closure); + +SCM_INTERNAL SCM scm_weak_table_refq (SCM table, SCM key, SCM dflt); +SCM_INTERNAL SCM scm_weak_table_putq_x (SCM table, SCM key, SCM value); +SCM_INTERNAL SCM scm_weak_table_remq_x (SCM table, SCM key); + +SCM_INTERNAL SCM scm_weak_table_clear_x (SCM table); + +SCM_INTERNAL SCM scm_c_weak_table_fold (scm_t_table_fold_fn proc, void *closure, + SCM init, SCM table); +SCM_INTERNAL SCM scm_weak_table_fold (SCM proc, SCM init, SCM table); +SCM_INTERNAL SCM scm_weak_table_for_each (SCM proc, SCM table); +SCM_INTERNAL SCM scm_weak_table_map_to_list (SCM proc, SCM table); + + + +/* Legacy interface. */ +SCM_API SCM scm_make_weak_key_hash_table (SCM k); +SCM_API SCM scm_make_weak_value_hash_table (SCM k); +SCM_API SCM scm_make_doubly_weak_hash_table (SCM k); +SCM_API SCM scm_weak_key_hash_table_p (SCM h); +SCM_API SCM scm_weak_value_hash_table_p (SCM h); +SCM_API SCM scm_doubly_weak_hash_table_p (SCM h); + + + +SCM_INTERNAL void scm_i_weak_table_print (SCM exp, SCM port, scm_print_state *pstate); +SCM_INTERNAL void scm_weak_table_prehistory (void); +SCM_INTERNAL void scm_init_weak_table (void); + +#endif /* SCM_WEAK_TABLE_H */ + +/* + Local Variables: + c-file-style: "gnu" + End: +*/ diff --git a/libguile/weak-vector.c b/libguile/weak-vector.c new file mode 100644 index 000000000..f829d3617 --- /dev/null +++ b/libguile/weak-vector.c @@ -0,0 +1,207 @@ +/* Copyright (C) 1995,1996,1998,2000,2001, 2003, 2006, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 3 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + + + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <stdio.h> + +#include "libguile/_scm.h" +#include "libguile/vectors.h" + +#include "libguile/validate.h" + + + +/* {Weak Vectors} + */ + +#define VECTOR_MAX_LENGTH (SCM_T_BITS_MAX >> 8) + +static SCM +make_weak_vector (size_t len, SCM fill) +#define FUNC_NAME "make-weak-vector" +{ + SCM wv; + size_t j; + + SCM_ASSERT_RANGE (1, scm_from_size_t (len), len <= VECTOR_MAX_LENGTH); + + if (SCM_UNBNDP (fill)) + fill = SCM_UNSPECIFIED; + + wv = SCM_PACK_POINTER (scm_gc_malloc_pointerless ((len + 1) * sizeof (SCM), + "weak vector")); + + SCM_SET_CELL_WORD_0 (wv, (len << 8) | scm_tc7_wvect); + + if (SCM_HEAP_OBJECT_P (fill)) + { + memset (SCM_I_VECTOR_WELTS (wv), 0, len * sizeof (SCM)); + for (j = 0; j < len; j++) + scm_c_weak_vector_set_x (wv, j, fill); + } + else + for (j = 0; j < len; j++) + SCM_SIMPLE_VECTOR_SET (wv, j, fill); + + return wv; +} +#undef FUNC_NAME + +SCM_DEFINE (scm_make_weak_vector, "make-weak-vector", 1, 1, 0, + (SCM size, SCM fill), + "Return a weak vector with @var{size} elements. If the optional\n" + "argument @var{fill} is given, all entries in the vector will be\n" + "set to @var{fill}. The default value for @var{fill} is the\n" + "empty list.") +#define FUNC_NAME s_scm_make_weak_vector +{ + return make_weak_vector (scm_to_size_t (size), fill); +} +#undef FUNC_NAME + + +SCM_REGISTER_PROC(s_list_to_weak_vector, "list->weak-vector", 1, 0, 0, scm_weak_vector); + +SCM_DEFINE (scm_weak_vector, "weak-vector", 0, 0, 1, + (SCM lst), + "@deffnx {Scheme Procedure} list->weak-vector lst\n" + "Construct a weak vector from a list: @code{weak-vector} uses\n" + "the list of its arguments while @code{list->weak-vector} uses\n" + "its only argument @var{l} (a list) to construct a weak vector\n" + "the same way @code{list->vector} would.") +#define FUNC_NAME s_scm_weak_vector +{ + SCM wv; + size_t i; + long c_size; + + SCM_VALIDATE_LIST_COPYLEN (SCM_ARG1, lst, c_size); + + wv = make_weak_vector ((size_t) c_size, SCM_BOOL_F); + + for (i = 0; scm_is_pair (lst); lst = SCM_CDR (lst), i++) + scm_c_weak_vector_set_x (wv, i, SCM_CAR (lst)); + + return wv; +} +#undef FUNC_NAME + + +SCM_DEFINE (scm_weak_vector_p, "weak-vector?", 1, 0, 0, + (SCM obj), + "Return @code{#t} if @var{obj} is a weak vector. Note that all\n" + "weak hashes are also weak vectors.") +#define FUNC_NAME s_scm_weak_vector_p +{ + return scm_from_bool (SCM_I_WVECTP (obj)); +} +#undef FUNC_NAME + + +struct weak_vector_ref_data +{ + SCM wv; + size_t k; +}; + +static void* +weak_vector_ref (void *data) +{ + struct weak_vector_ref_data *d = data; + + return SCM_SIMPLE_VECTOR_REF (d->wv, d->k); +} + +SCM +scm_c_weak_vector_ref (SCM wv, size_t k) +{ + struct weak_vector_ref_data d; + void *ret; + + d.wv = wv; + d.k = k; + + if (k >= SCM_I_VECTOR_LENGTH (wv)) + scm_out_of_range (NULL, scm_from_size_t (k)); + + ret = GC_call_with_alloc_lock (weak_vector_ref, &d); + + if (ret) + return SCM_PACK_POINTER (ret); + else + return SCM_BOOL_F; +} + + +void +scm_c_weak_vector_set_x (SCM wv, size_t k, SCM x) +{ + SCM *elts; + struct weak_vector_ref_data d; + void *prev; + + d.wv = wv; + d.k = k; + + if (k >= SCM_I_VECTOR_LENGTH (wv)) + scm_out_of_range (NULL, scm_from_size_t (k)); + + prev = GC_call_with_alloc_lock (weak_vector_ref, &d); + + elts = SCM_I_VECTOR_WELTS (wv); + + if (prev && SCM_HEAP_OBJECT_P (SCM_PACK_POINTER (prev))) + GC_unregister_disappearing_link ((GC_PTR) &elts[k]); + + elts[k] = x; + + if (SCM_HEAP_OBJECT_P (x)) + SCM_I_REGISTER_DISAPPEARING_LINK ((GC_PTR) &elts[k], + (GC_PTR) SCM_HEAP_OBJECT_BASE (x)); +} + + + +static void +scm_init_weak_vector_builtins (void) +{ +#ifndef SCM_MAGIC_SNARFER +#include "libguile/weak-vector.x" +#endif +} + +void +scm_init_weak_vectors () +{ + scm_c_register_extension ("libguile-" SCM_EFFECTIVE_VERSION, + "scm_init_weak_vector_builtins", + (scm_t_extension_init_func)scm_init_weak_vector_builtins, + NULL); +} + + +/* + Local Variables: + c-file-style: "gnu" + End: +*/ diff --git a/libguile/weak-vector.h b/libguile/weak-vector.h new file mode 100644 index 000000000..1fd7cb5ec --- /dev/null +++ b/libguile/weak-vector.h @@ -0,0 +1,48 @@ +/* classes: h_files */ + +#ifndef SCM_WEAK_VECTOR_H +#define SCM_WEAK_VECTOR_H + +/* Copyright (C) 1995,1996,2000,2001, 2003, 2006, 2008, 2009, 2011 Free Software Foundation, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public License + * as published by the Free Software Foundation; either version 3 of + * the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + + + +#include "libguile/__scm.h" + + +/* Weak vectors. */ + +#define SCM_I_WVECTP(x) (SCM_HAS_TYP7 (x, scm_tc7_wvect)) + +SCM_API SCM scm_make_weak_vector (SCM k, SCM fill); +SCM_API SCM scm_weak_vector (SCM l); +SCM_API SCM scm_weak_vector_p (SCM x); +SCM_INTERNAL SCM scm_c_weak_vector_ref (SCM v, size_t k); +SCM_INTERNAL void scm_c_weak_vector_set_x (SCM v, size_t k, SCM x); + +SCM_INTERNAL void scm_init_weak_vectors (void); + + +#endif /* SCM_WEAK_VECTOR_H */ + +/* + Local Variables: + c-file-style: "gnu" + End: +*/ diff --git a/libguile/weaks.c b/libguile/weaks.c deleted file mode 100644 index 92d351e51..000000000 --- a/libguile/weaks.c +++ /dev/null @@ -1,294 +0,0 @@ -/* Copyright (C) 1995,1996,1998,2000,2001, 2003, 2006, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation; either version 3 of - * the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301 USA - */ - - - -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#include <stdio.h> - -#include "libguile/_scm.h" -#include "libguile/vectors.h" -#include "libguile/hashtab.h" - -#include "libguile/validate.h" -#include "libguile/weaks.h" - -#include "libguile/bdw-gc.h" -#include <gc/gc_typed.h> - - - -/* Weak pairs for use in weak alist vectors and weak hash tables. - - We have weal-car pairs, weak-cdr pairs, and doubly weak pairs. In weak - pairs, the weak component(s) are not scanned for pointers and are - registered as disapperaring links; therefore, the weak component may be - set to NULL by the garbage collector when no other reference to that word - exist. Thus, users should only access weak pairs via the - `SCM_WEAK_PAIR_C[AD]R ()' macros. See also `scm_fixup_weak_alist ()' in - `hashtab.c'. */ - -/* Type descriptors for weak-c[ad]r pairs. */ -static GC_descr wcar_pair_descr, wcdr_pair_descr; - - -SCM -scm_weak_car_pair (SCM car, SCM cdr) -{ - scm_t_cell *cell; - - cell = (scm_t_cell *)GC_malloc_explicitly_typed (sizeof (*cell), - wcar_pair_descr); - - cell->word_0 = car; - cell->word_1 = cdr; - - if (SCM_NIMP (car)) - /* Weak car cells make sense iff the car is non-immediate. */ - SCM_I_REGISTER_DISAPPEARING_LINK ((GC_PTR) &cell->word_0, - (GC_PTR) SCM2PTR (car)); - - return (SCM_PACK (cell)); -} - -SCM -scm_weak_cdr_pair (SCM car, SCM cdr) -{ - scm_t_cell *cell; - - cell = (scm_t_cell *)GC_malloc_explicitly_typed (sizeof (*cell), - wcdr_pair_descr); - - cell->word_0 = car; - cell->word_1 = cdr; - - if (SCM_NIMP (cdr)) - /* Weak cdr cells make sense iff the cdr is non-immediate. */ - SCM_I_REGISTER_DISAPPEARING_LINK ((GC_PTR) &cell->word_1, - (GC_PTR) SCM2PTR (cdr)); - - return (SCM_PACK (cell)); -} - -SCM -scm_doubly_weak_pair (SCM car, SCM cdr) -{ - /* Doubly weak cells shall not be scanned at all for pointers. */ - scm_t_cell *cell = (scm_t_cell *)scm_gc_malloc_pointerless (sizeof (*cell), - "weak cell"); - - cell->word_0 = car; - cell->word_1 = cdr; - - if (SCM_NIMP (car)) - SCM_I_REGISTER_DISAPPEARING_LINK ((GC_PTR) &cell->word_0, - (GC_PTR) SCM2PTR (car)); - if (SCM_NIMP (cdr)) - SCM_I_REGISTER_DISAPPEARING_LINK ((GC_PTR) &cell->word_1, - (GC_PTR) SCM2PTR (cdr)); - - return (SCM_PACK (cell)); -} - - - - -/* 1. The current hash table implementation in hashtab.c uses weak alist - * vectors (formerly called weak hash tables) internally. - * - * 2. All hash table operations still work on alist vectors. - * - * 3. The weak vector and alist vector Scheme API is accessed through - * the module (ice-9 weak-vector). - */ - - -/* {Weak Vectors} - */ - - -SCM_DEFINE (scm_make_weak_vector, "make-weak-vector", 1, 1, 0, - (SCM size, SCM fill), - "Return a weak vector with @var{size} elements. If the optional\n" - "argument @var{fill} is given, all entries in the vector will be\n" - "set to @var{fill}. The default value for @var{fill} is the\n" - "empty list.") -#define FUNC_NAME s_scm_make_weak_vector -{ - return scm_i_make_weak_vector (0, size, fill); -} -#undef FUNC_NAME - - -SCM_REGISTER_PROC(s_list_to_weak_vector, "list->weak-vector", 1, 0, 0, scm_weak_vector); - -SCM_DEFINE (scm_weak_vector, "weak-vector", 0, 0, 1, - (SCM l), - "@deffnx {Scheme Procedure} list->weak-vector l\n" - "Construct a weak vector from a list: @code{weak-vector} uses\n" - "the list of its arguments while @code{list->weak-vector} uses\n" - "its only argument @var{l} (a list) to construct a weak vector\n" - "the same way @code{list->vector} would.") -#define FUNC_NAME s_scm_weak_vector -{ - return scm_i_make_weak_vector_from_list (0, l); -} -#undef FUNC_NAME - - -SCM_DEFINE (scm_weak_vector_p, "weak-vector?", 1, 0, 0, - (SCM obj), - "Return @code{#t} if @var{obj} is a weak vector. Note that all\n" - "weak hashes are also weak vectors.") -#define FUNC_NAME s_scm_weak_vector_p -{ - return scm_from_bool (SCM_I_WVECTP (obj) && !SCM_IS_WHVEC (obj)); -} -#undef FUNC_NAME - - -/* Weak alist vectors, i.e., vectors of alists. - - The alist vector themselves are _not_ weak. The `car' (or `cdr', or both) - of the pairs within it are weak. See `hashtab.c' for details. */ - - -/* FIXME: We used to have two implementations of weak hash tables: the one in - here and the one in `hashtab.c'. The difference is that weak alist - vectors could be used as vectors while (weak) hash tables can't. We need - to unify that. */ - -SCM_DEFINE (scm_make_weak_key_alist_vector, "make-weak-key-alist-vector", 0, 1, 0, - (SCM size), - "@deffnx {Scheme Procedure} make-weak-value-alist-vector size\n" - "@deffnx {Scheme Procedure} make-doubly-weak-alist-vector size\n" - "Return a weak hash table with @var{size} buckets. As with any\n" - "hash table, choosing a good size for the table requires some\n" - "caution.\n" - "\n" - "You can modify weak hash tables in exactly the same way you\n" - "would modify regular hash tables. (@pxref{Hash Tables})") -#define FUNC_NAME s_scm_make_weak_key_alist_vector -{ - return scm_make_weak_key_hash_table (size); -} -#undef FUNC_NAME - - -SCM_DEFINE (scm_make_weak_value_alist_vector, "make-weak-value-alist-vector", 0, 1, 0, - (SCM size), - "Return a hash table with weak values with @var{size} buckets.\n" - "(@pxref{Hash Tables})") -#define FUNC_NAME s_scm_make_weak_value_alist_vector -{ - return scm_make_weak_value_hash_table (size); -} -#undef FUNC_NAME - - -SCM_DEFINE (scm_make_doubly_weak_alist_vector, "make-doubly-weak-alist-vector", 1, 0, 0, - (SCM size), - "Return a hash table with weak keys and values with @var{size}\n" - "buckets. (@pxref{Hash Tables})") -#define FUNC_NAME s_scm_make_doubly_weak_alist_vector -{ - return scm_make_doubly_weak_hash_table (size); -} -#undef FUNC_NAME - - -SCM_DEFINE (scm_weak_key_alist_vector_p, "weak-key-alist-vector?", 1, 0, 0, - (SCM obj), - "@deffnx {Scheme Procedure} weak-value-alist-vector? obj\n" - "@deffnx {Scheme Procedure} doubly-weak-alist-vector? obj\n" - "Return @code{#t} if @var{obj} is the specified weak hash\n" - "table. Note that a doubly weak hash table is neither a weak key\n" - "nor a weak value hash table.") -#define FUNC_NAME s_scm_weak_key_alist_vector_p -{ - return scm_from_bool (SCM_I_WVECTP (obj) && SCM_IS_WHVEC (obj)); -} -#undef FUNC_NAME - - -SCM_DEFINE (scm_weak_value_alist_vector_p, "weak-value-alist-vector?", 1, 0, 0, - (SCM obj), - "Return @code{#t} if @var{obj} is a weak value hash table.") -#define FUNC_NAME s_scm_weak_value_alist_vector_p -{ - return scm_from_bool (SCM_I_WVECTP (obj) && SCM_IS_WHVEC_V (obj)); -} -#undef FUNC_NAME - - -SCM_DEFINE (scm_doubly_weak_alist_vector_p, "doubly-weak-alist-vector?", 1, 0, 0, - (SCM obj), - "Return @code{#t} if @var{obj} is a doubly weak hash table.") -#define FUNC_NAME s_scm_doubly_weak_alist_vector_p -{ - return scm_from_bool (SCM_I_WVECTP (obj) && SCM_IS_WHVEC_B (obj)); -} -#undef FUNC_NAME - - - - -SCM -scm_init_weaks_builtins () -{ -#include "libguile/weaks.x" - return SCM_UNSPECIFIED; -} - -void -scm_weaks_prehistory () -{ - /* Initialize weak pairs. */ - GC_word wcar_pair_bitmap[GC_BITMAP_SIZE (scm_t_cell)] = { 0 }; - GC_word wcdr_pair_bitmap[GC_BITMAP_SIZE (scm_t_cell)] = { 0 }; - - /* In a weak-car pair, only the second word must be scanned for - pointers. */ - GC_set_bit (wcar_pair_bitmap, GC_WORD_OFFSET (scm_t_cell, word_1)); - wcar_pair_descr = GC_make_descriptor (wcar_pair_bitmap, - GC_WORD_LEN (scm_t_cell)); - - /* Conversely, in a weak-cdr pair, only the first word must be scanned for - pointers. */ - GC_set_bit (wcdr_pair_bitmap, GC_WORD_OFFSET (scm_t_cell, word_0)); - wcdr_pair_descr = GC_make_descriptor (wcdr_pair_bitmap, - GC_WORD_LEN (scm_t_cell)); - -} - -void -scm_init_weaks () -{ - scm_c_define_gsubr ("%init-weaks-builtins", 0, 0, 0, - scm_init_weaks_builtins); -} - - -/* - Local Variables: - c-file-style: "gnu" - End: -*/ diff --git a/libguile/weaks.h b/libguile/weaks.h deleted file mode 100644 index fc16f8bf8..000000000 --- a/libguile/weaks.h +++ /dev/null @@ -1,101 +0,0 @@ -/* classes: h_files */ - -#ifndef SCM_WEAKS_H -#define SCM_WEAKS_H - -/* Copyright (C) 1995,1996,2000,2001, 2003, 2006, 2008, 2009, 2011 Free Software Foundation, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public License - * as published by the Free Software Foundation; either version 3 of - * the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301 USA - */ - - - -#include "libguile/__scm.h" - - - -#define SCM_WVECTF_WEAK_KEY 1 -#define SCM_WVECTF_WEAK_VALUE 2 - -#define SCM_WVECT_WEAK_KEY_P(x) (SCM_I_WVECT_EXTRA(x) & SCM_WVECTF_WEAK_KEY) -#define SCM_WVECT_WEAK_VALUE_P(x) (SCM_I_WVECT_EXTRA(x) & SCM_WVECTF_WEAK_VALUE) - -#define SCM_I_WVECT_TYPE(x) (SCM_I_WVECT_EXTRA(x) & 7) -#define SCM_I_SET_WVECT_TYPE(x,t) (SCM_I_SET_WVECT_EXTRA \ - ((x), (SCM_I_WVECT_EXTRA (x) & ~7) | (t))) -#define SCM_IS_WHVEC(X) (SCM_I_WVECT_TYPE (X) == 1) -#define SCM_IS_WHVEC_V(X) (SCM_I_WVECT_TYPE (X) == 2) -#define SCM_IS_WHVEC_B(X) (SCM_I_WVECT_TYPE (X) == 3) -#define SCM_IS_WHVEC_ANY(X) (SCM_I_WVECT_TYPE (X) != 0) - - -/* Weak pairs. */ - -SCM_INTERNAL SCM scm_weak_car_pair (SCM car, SCM cdr); -SCM_INTERNAL SCM scm_weak_cdr_pair (SCM car, SCM cdr); -SCM_INTERNAL SCM scm_doubly_weak_pair (SCM car, SCM cdr); - -/* Testing the weak component(s) of a cell for reachability. */ -#define SCM_WEAK_PAIR_WORD_DELETED_P(_cell, _word) \ - (SCM_UNPACK (SCM_CELL_OBJECT ((_cell), (_word))) == 0) -#define SCM_WEAK_PAIR_CAR_DELETED_P(_cell) \ - (SCM_WEAK_PAIR_WORD_DELETED_P ((_cell), 0)) -#define SCM_WEAK_PAIR_CDR_DELETED_P(_cell) \ - (SCM_WEAK_PAIR_WORD_DELETED_P ((_cell), 1)) - -#define SCM_WEAK_PAIR_DELETED_P(_cell) \ - ((SCM_WEAK_PAIR_CAR_DELETED_P (_cell)) \ - || (SCM_WEAK_PAIR_CDR_DELETED_P (_cell))) - -/* Accessing the components of a weak cell. These return `SCM_UNDEFINED' if - the car/cdr has been collected. */ -#define SCM_WEAK_PAIR_WORD(_cell, _word) \ - (SCM_WEAK_PAIR_WORD_DELETED_P ((_cell), (_word)) \ - ? SCM_UNDEFINED \ - : SCM_CELL_OBJECT ((_cell), (_word))) -#define SCM_WEAK_PAIR_CAR(_cell) (SCM_WEAK_PAIR_WORD ((_cell), 0)) -#define SCM_WEAK_PAIR_CDR(_cell) (SCM_WEAK_PAIR_WORD ((_cell), 1)) - - - -/* Weak vectors and weak hash tables. */ - -SCM_API SCM scm_make_weak_vector (SCM k, SCM fill); -SCM_API SCM scm_weak_vector (SCM l); -SCM_API SCM scm_weak_vector_p (SCM x); -SCM_API SCM scm_make_weak_key_alist_vector (SCM k); -SCM_API SCM scm_make_weak_value_alist_vector (SCM k); -SCM_API SCM scm_make_doubly_weak_alist_vector (SCM k); -SCM_API SCM scm_weak_key_alist_vector_p (SCM x); -SCM_API SCM scm_weak_value_alist_vector_p (SCM x); -SCM_API SCM scm_doubly_weak_alist_vector_p (SCM x); -SCM_INTERNAL SCM scm_init_weaks_builtins (void); -SCM_INTERNAL void scm_weaks_prehistory (void); -SCM_INTERNAL void scm_init_weaks (void); - -SCM_INTERNAL void scm_i_init_weak_vectors_for_gc (void); -SCM_INTERNAL void scm_i_mark_weak_vector (SCM w); -SCM_INTERNAL int scm_i_mark_weak_vectors_non_weaks (void); -SCM_INTERNAL void scm_i_remove_weaks_from_weak_vectors (void); - - -#endif /* SCM_WEAKS_H */ - -/* - Local Variables: - c-file-style: "gnu" - End: -*/ diff --git a/m4/gnulib-cache.m4 b/m4/gnulib-cache.m4 index 2bc144435..d9688f4a7 100644 --- a/m4/gnulib-cache.m4 +++ b/m4/gnulib-cache.m4 @@ -27,7 +27,7 @@ # Specification in the form of a command-line invocation: -# gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --lgpl=3 --no-conditional-dependencies --libtool --macro-prefix=gl --no-vc-files accept alignof alloca-opt announce-gen autobuild bind byteswap canonicalize-lgpl ceil close connect duplocale environ extensions flock floor fpieee frexp full-read full-write func gendocs getaddrinfo getpeername getsockname getsockopt git-version-gen gitlog-to-changelog gnu-web-doc-update gnupload havelib iconv_open-utf inet_ntop inet_pton isinf isnan ldexp lib-symbol-versions lib-symbol-visibility libunistring listen locale log1p maintainer-makefile malloc-gnu malloca nproc open pipe2 putenv recv recvfrom rename send sendto setsockopt shutdown socket stat-time stdlib strftime striconveh string sys_stat trunc verify vsnprintf warnings wchar +# gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --lgpl=3 --no-conditional-dependencies --libtool --macro-prefix=gl --no-vc-files accept alignof alloca-opt announce-gen autobuild bind byteswap canonicalize-lgpl ceil close connect duplocale environ extensions flock floor fpieee frexp full-read full-write func gendocs getaddrinfo getpeername getsockname getsockopt git-version-gen gitlog-to-changelog gnu-web-doc-update gnupload havelib iconv_open-utf inet_ntop inet_pton isinf isnan largefile ldexp lib-symbol-versions lib-symbol-visibility libunistring listen locale log1p maintainer-makefile malloc-gnu malloca nproc open pipe2 putenv recv recvfrom rename send sendto setsockopt shutdown socket stat-time stdlib strftime striconveh string sys_stat trunc verify vsnprintf warnings wchar # Specification in the form of a few gnulib-tool.m4 macro invocations: gl_LOCAL_DIR([]) @@ -68,6 +68,7 @@ gl_MODULES([ inet_pton isinf isnan + largefile ldexp lib-symbol-versions lib-symbol-visibility diff --git a/meta/Makefile.am b/meta/Makefile.am index f26fc4436..5b811c06f 100644 --- a/meta/Makefile.am +++ b/meta/Makefile.am @@ -23,7 +23,7 @@ bin_SCRIPTS = guile-config guild EXTRA_DIST= \ guile.m4 ChangeLog-2008 \ - guile-2.0.pc.in guile-2.0-uninstalled.pc.in \ + guile-2.2.pc.in guile-2.2-uninstalled.pc.in \ guild.in guile-config.in # What we now call `guild' used to be known as `guile-tools'. @@ -32,7 +32,7 @@ install-data-hook: $(LN_S) guild$(EXEEXT) guile-tools$(EXEEXT) pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = guile-2.0.pc +pkgconfig_DATA = guile-2.2.pc ## FIXME: in the future there will be direct automake support for ## doing this. When that happens, switch over. diff --git a/meta/guile-2.0-uninstalled.pc.in b/meta/guile-2.2-uninstalled.pc.in index 6d8c36b18..6d8c36b18 100644 --- a/meta/guile-2.0-uninstalled.pc.in +++ b/meta/guile-2.2-uninstalled.pc.in diff --git a/meta/guile-2.0.pc.in b/meta/guile-2.2.pc.in index ecca778e1..ecca778e1 100644 --- a/meta/guile-2.0.pc.in +++ b/meta/guile-2.2.pc.in diff --git a/meta/guile-config.in b/meta/guile-config.in index 0226f685e..b3e4c3d94 100755 --- a/meta/guile-config.in +++ b/meta/guile-config.in @@ -8,7 +8,7 @@ exec "@installed_guile@" -e main -s $0 "$@" ;;;; guile-config --- utility for linking programs with Guile ;;;; Jim Blandy <jim@red-bean.com> --- September 1997 ;;;; -;;;; Copyright (C) 1998, 2001, 2004, 2005, 2006, 2008, 2009 Free Software Foundation, Inc. +;;;; Copyright (C) 1998, 2001, 2004, 2005, 2006, 2008, 2009, 2011 Free Software Foundation, Inc. ;;;; ;;;; This library is free software; you can redistribute it and/or ;;;; modify it under the terms of the GNU Lesser General Public @@ -77,7 +77,7 @@ exec "@installed_guile@" -e main -s $0 "$@" (dle " " p " --help - show usage info (this message)") (dle " " p " --help SUBCOMMAND - show help for SUBCOMMAND"))) -(define guile-module "guile-2.0") +(define guile-module "guile-2.2") (define (pkg-config . args) (let* ((real-args (cons %pkg-config-program args)) diff --git a/module/ice-9/boot-9.scm b/module/ice-9/boot-9.scm index 5ac01b85e..cf3f5d8c0 100644 --- a/module/ice-9/boot-9.scm +++ b/module/ice-9/boot-9.scm @@ -858,15 +858,11 @@ VALUE." ;; properties within the object itself. (define (make-object-property) - (define-syntax-rule (with-mutex lock exp) - (dynamic-wind (lambda () (lock-mutex lock)) - (lambda () exp) - (lambda () (unlock-mutex lock)))) - (let ((prop (make-weak-key-hash-table)) - (lock (make-mutex))) + ;; Weak tables are thread-safe. + (let ((prop (make-weak-key-hash-table))) (make-procedure-with-setter - (lambda (obj) (with-mutex lock (hashq-ref prop obj))) - (lambda (obj val) (with-mutex lock (hashq-set! prop obj val)))))) + (lambda (obj) (hashq-ref prop obj)) + (lambda (obj val) (hashq-set! prop obj val))))) @@ -945,16 +941,13 @@ VALUE." ;; 0: type-name, 1: fields, 2: constructor (define record-type-vtable - ;; FIXME: This should just call make-vtable, not make-vtable-vtable; but for - ;; that we need to expose the bare vtable-vtable to Scheme. - (make-vtable-vtable "prprpw" 0 - (lambda (s p) - (cond ((eq? s record-type-vtable) - (display "#<record-type-vtable>" p)) - (else - (display "#<record-type " p) - (display (record-type-name s) p) - (display ">" p)))))) + (let ((s (make-vtable (string-append standard-vtable-fields "prprpw") + (lambda (s p) + (display "#<record-type " p) + (display (record-type-name s) p) + (display ">" p))))) + (set-struct-vtable-name! s 'record-type) + s)) (define (record-type? obj) (and (struct? obj) (eq? record-type-vtable (struct-vtable obj)))) @@ -1565,7 +1558,7 @@ VALUE." ((define-record-type (lambda (x) (define (make-id scope . fragments) - (datum->syntax #'scope + (datum->syntax scope (apply symbol-append (map (lambda (x) (if (symbol? x) x (syntax->datum x))) @@ -2042,33 +2035,6 @@ VALUE." (define (module-define-submodule! module name submodule) (hashq-set! (module-submodules module) name submodule)) -;; It used to be, however, that module names were also present in the -;; value namespace. When we enable deprecated code, we preserve this -;; legacy behavior. -;; -;; These shims are defined here instead of in deprecated.scm because we -;; need their definitions before loading other modules. -;; -(begin-deprecated - (define (module-ref-submodule module name) - (or (hashq-ref (module-submodules module) name) - (and (module-submodule-binder module) - ((module-submodule-binder module) module name)) - (let ((var (module-local-variable module name))) - (and var (variable-bound? var) (module? (variable-ref var)) - (begin - (warn "module" module "not in submodules table") - (variable-ref var)))))) - - (define (module-define-submodule! module name submodule) - (let ((var (module-local-variable module name))) - (if (and var - (or (not (variable-bound? var)) - (not (module? (variable-ref var))))) - (warn "defining module" module ": not overriding local definition" var) - (module-define! module name submodule))) - (hashq-set! (module-submodules module) name submodule))) - ;;; {Module-based Loading} @@ -3169,13 +3135,6 @@ module '(ice-9 q) '(make-q q-length))}." (process-use-modules (list quoted-args ...)) *unspecified*)))))) -(define-syntax-rule (use-syntax spec ...) - (begin - (eval-when (eval load compile expand) - (issue-deprecation-warning - "`use-syntax' is deprecated. Please contact guile-devel for more info.")) - (use-modules spec ...))) - (include-from-path "ice-9/r6rs-libraries") (define-syntax-rule (define-private foo bar) @@ -3704,13 +3663,13 @@ module '(ice-9 q) '(make-q q-length))}." ((args ...) (generate-temporaries #'(formals ...)))) #`(begin (define (proc-name formals ...) - (fluid-let-syntax ((name (identifier-syntax proc-name))) + (syntax-parameterize ((name (identifier-syntax proc-name))) body ...)) - (define-syntax name + (define-syntax-parameter name (lambda (x) (syntax-case x () ((_ args ...) - #'((fluid-let-syntax ((name (identifier-syntax proc-name))) + #'((syntax-parameterize ((name (identifier-syntax proc-name))) (lambda (formals ...) body ...)) args ...)) diff --git a/module/ice-9/deprecated.scm b/module/ice-9/deprecated.scm index f4ae2e365..ca1beec30 100644 --- a/module/ice-9/deprecated.scm +++ b/module/ice-9/deprecated.scm @@ -16,851 +16,5 @@ ;;;; (define-module (ice-9 deprecated) - #:export (substring-move-left! substring-move-right! - dynamic-maybe-call dynamic-maybe-link - try-module-linked try-module-dynamic-link - list* feature? eval-case unmemoize-expr - $asinh - $acosh - $atanh - $sqrt - $abs - $exp - $log - $sin - $cos - $tan - $asin - $acos - $atan - $sinh - $cosh - $tanh - closure? - %nil - @bind - bad-throw - error-catching-loop - error-catching-repl - scm-style-repl - apply-to-args - has-suffix? - scheme-file-suffix - get-option - for-next-option - display-usage-report - transform-usage-lambda - collect - assert-repl-silence - assert-repl-print-unspecified - assert-repl-verbosity - set-repl-prompt! - set-batch-mode?! - repl - pre-unwind-handler-dispatch - default-pre-unwind-handler - handle-system-error - stack-saved? - the-last-stack - save-stack - named-module-use! - top-repl - turn-on-debugging - read-hash-procedures - process-define-module)) + #:export ()) - -;;;; Deprecated definitions. - -(define substring-move-left! - (lambda args - (issue-deprecation-warning - "`substring-move-left!' is deprecated. Use `substring-move!' instead.") - (apply substring-move! args))) -(define substring-move-right! - (lambda args - (issue-deprecation-warning - "`substring-move-right!' is deprecated. Use `substring-move!' instead.") - (apply substring-move! args))) - - - -;; This method of dynamically linking Guile Extensions is deprecated. -;; Use `load-extension' explicitly from Scheme code instead. - -(define (split-c-module-name str) - (let loop ((rev '()) - (start 0) - (pos 0) - (end (string-length str))) - (cond - ((= pos end) - (reverse (cons (string->symbol (substring str start pos)) rev))) - ((eq? (string-ref str pos) #\space) - (loop (cons (string->symbol (substring str start pos)) rev) - (+ pos 1) - (+ pos 1) - end)) - (else - (loop rev start (+ pos 1) end))))) - -(define (convert-c-registered-modules dynobj) - (let ((res (map (lambda (c) - (list (split-c-module-name (car c)) (cdr c) dynobj)) - (c-registered-modules)))) - (c-clear-registered-modules) - res)) - -(define registered-modules '()) - -(define (register-modules dynobj) - (set! registered-modules - (append! (convert-c-registered-modules dynobj) - registered-modules))) - -(define (warn-autoload-deprecation modname) - (issue-deprecation-warning - "Autoloading of compiled code modules is deprecated." - "Write a Scheme file instead that uses `load-extension'.") - (issue-deprecation-warning - (simple-format #f "(You just autoloaded module ~S.)" modname))) - -(define (init-dynamic-module modname) - ;; Register any linked modules which have been registered on the C level - (register-modules #f) - (or-map (lambda (modinfo) - (if (equal? (car modinfo) modname) - (begin - (warn-autoload-deprecation modname) - (set! registered-modules (delq! modinfo registered-modules)) - (let ((mod (resolve-module modname #f))) - (save-module-excursion - (lambda () - (set-current-module mod) - (set-module-public-interface! mod mod) - (dynamic-call (cadr modinfo) (caddr modinfo)) - )) - #t)) - #f)) - registered-modules)) - -(define (dynamic-maybe-call name dynobj) - (issue-deprecation-warning - "`dynamic-maybe-call' is deprecated. " - "Wrap `dynamic-call' in a `false-if-exception' yourself.") - (false-if-exception (dynamic-call name dynobj))) - - -(define (dynamic-maybe-link filename) - (issue-deprecation-warning - "`dynamic-maybe-link' is deprecated. " - "Wrap `dynamic-link' in a `false-if-exception' yourself.") - (false-if-exception (dynamic-link filename))) - -(define (find-and-link-dynamic-module module-name) - (define (make-init-name mod-name) - (string-append "scm_init" - (list->string (map (lambda (c) - (if (or (char-alphabetic? c) - (char-numeric? c)) - c - #\_)) - (string->list mod-name))) - "_module")) - - ;; Put the subdirectory for this module in the car of SUBDIR-AND-LIBNAME, - ;; and the `libname' (the name of the module prepended by `lib') in the cdr - ;; field. For example, if MODULE-NAME is the list (inet tcp-ip udp), then - ;; SUBDIR-AND-LIBNAME will be the pair ("inet/tcp-ip" . "libudp"). - (let ((subdir-and-libname - (let loop ((dirs "") - (syms module-name)) - (if (null? (cdr syms)) - (cons dirs (string-append "lib" (symbol->string (car syms)))) - (loop (string-append dirs (symbol->string (car syms)) "/") - (cdr syms))))) - (init (make-init-name (apply string-append - (map (lambda (s) - (string-append "_" - (symbol->string s))) - module-name))))) - (let ((subdir (car subdir-and-libname)) - (libname (cdr subdir-and-libname))) - - ;; Now look in each dir in %LOAD-PATH for `subdir/libfoo.la'. If that - ;; file exists, fetch the dlname from that file and attempt to link - ;; against it. If `subdir/libfoo.la' does not exist, or does not seem - ;; to name any shared library, look for `subdir/libfoo.so' instead and - ;; link against that. - (let check-dirs ((dir-list %load-path)) - (if (null? dir-list) - #f - (let* ((dir (in-vicinity (car dir-list) subdir)) - (sharlib-full - (or (try-using-libtool-name dir libname) - (try-using-sharlib-name dir libname)))) - (if (and sharlib-full (file-exists? sharlib-full)) - (link-dynamic-module sharlib-full init) - (check-dirs (cdr dir-list))))))))) - -(define (try-using-libtool-name libdir libname) - (let ((libtool-filename (in-vicinity libdir - (string-append libname ".la")))) - (and (file-exists? libtool-filename) - libtool-filename))) - -(define (try-using-sharlib-name libdir libname) - (in-vicinity libdir (string-append libname ".so"))) - -(define (link-dynamic-module filename initname) - ;; Register any linked modules which have been registered on the C level - (register-modules #f) - (let ((dynobj (dynamic-link filename))) - (dynamic-call initname dynobj) - (register-modules dynobj))) - -(define (try-module-linked module-name) - (issue-deprecation-warning - "`try-module-linked' is deprecated." - "See the manual for how more on C extensions.") - (init-dynamic-module module-name)) - -(define (try-module-dynamic-link module-name) - (issue-deprecation-warning - "`try-module-dynamic-link' is deprecated." - "See the manual for how more on C extensions.") - (and (find-and-link-dynamic-module module-name) - (init-dynamic-module module-name))) - - -(define (list* . args) - (issue-deprecation-warning "'list*' is deprecated. Use 'cons*' instead.") - (apply cons* args)) - -(define (feature? sym) - (issue-deprecation-warning - "`feature?' is deprecated. Use `provided?' instead.") - (provided? sym)) - -(define-macro (eval-case . clauses) - (issue-deprecation-warning - "`eval-case' is deprecated. Use `eval-when' instead.") - ;; Practically speaking, eval-case only had load-toplevel and else as - ;; conditions. - (cond - ((assoc-ref clauses '(load-toplevel)) - => (lambda (exps) - ;; the *unspecified so that non-toplevel definitions will be - ;; caught - `(begin *unspecified* . ,exps))) - ((assoc-ref clauses 'else) - => (lambda (exps) - `(begin *unspecified* . ,exps))) - (else - `(begin)))) - -;; The strange prototype system for uniform arrays has been -;; deprecated. -(read-hash-extend - #\y - (lambda (c port) - (issue-deprecation-warning - "The `#y' bytevector syntax is deprecated. Use `#s8' instead.") - (let ((x (read port))) - (cond - ((list? x) (list->s8vector x)) - (else (error "#y needs to be followed by a list" x)))))) - -(define (unmemoize-expr . args) - (issue-deprecation-warning - "`unmemoize-expr' is deprecated. Use `unmemoize-expression' instead.") - (apply unmemoize-expression args)) - -(define ($asinh z) - (issue-deprecation-warning - "`$asinh' is deprecated. Use `asinh' instead.") - (asinh z)) -(define ($acosh z) - (issue-deprecation-warning - "`$acosh' is deprecated. Use `acosh' instead.") - (acosh z)) -(define ($atanh z) - (issue-deprecation-warning - "`$atanh' is deprecated. Use `atanh' instead.") - (atanh z)) -(define ($sqrt z) - (issue-deprecation-warning - "`$sqrt' is deprecated. Use `sqrt' instead.") - (sqrt z)) -(define ($abs z) - (issue-deprecation-warning - "`$abs' is deprecated. Use `abs' instead.") - (abs z)) -(define ($exp z) - (issue-deprecation-warning - "`$exp' is deprecated. Use `exp' instead.") - (exp z)) -(define ($log z) - (issue-deprecation-warning - "`$log' is deprecated. Use `log' instead.") - (log z)) -(define ($sin z) - (issue-deprecation-warning - "`$sin' is deprecated. Use `sin' instead.") - (sin z)) -(define ($cos z) - (issue-deprecation-warning - "`$cos' is deprecated. Use `cos' instead.") - (cos z)) -(define ($tan z) - (issue-deprecation-warning - "`$tan' is deprecated. Use `tan' instead.") - (tan z)) -(define ($asin z) - (issue-deprecation-warning - "`$asin' is deprecated. Use `asin' instead.") - (asin z)) -(define ($acos z) - (issue-deprecation-warning - "`$acos' is deprecated. Use `acos' instead.") - (acos z)) -(define ($atan z) - (issue-deprecation-warning - "`$atan' is deprecated. Use `atan' instead.") - (atan z)) -(define ($sinh z) - (issue-deprecation-warning - "`$sinh' is deprecated. Use `sinh' instead.") - (sinh z)) -(define ($cosh z) - (issue-deprecation-warning - "`$cosh' is deprecated. Use `cosh' instead.") - (cosh z)) -(define ($tanh z) - (issue-deprecation-warning - "`$tanh' is deprecated. Use `tanh' instead.") - (tanh z)) - -(define (closure? x) - (issue-deprecation-warning - "`closure?' is deprecated. Use `procedure?' instead.") - (procedure? x)) - -(define %nil #nil) - -;;; @bind is used by the old elisp code as a dynamic scoping mechanism. -;;; Please let the Guile developers know if you are using this macro. -;;; -(define-syntax @bind - (lambda (x) - (define (bound-member id ids) - (cond ((null? ids) #f) - ((bound-identifier=? id (car ids)) #t) - ((bound-member (car ids) (cdr ids))))) - - (issue-deprecation-warning - "`@bind' is deprecated. Use `with-fluids' instead.") - - (syntax-case x () - ((_ () b0 b1 ...) - #'(let () b0 b1 ...)) - ((_ ((id val) ...) b0 b1 ...) - (and-map identifier? #'(id ...)) - (if (let lp ((ids #'(id ...))) - (cond ((null? ids) #f) - ((bound-member (car ids) (cdr ids)) #t) - (else (lp (cdr ids))))) - (syntax-violation '@bind "duplicate bound identifier" x) - (with-syntax (((old-v ...) (generate-temporaries #'(id ...))) - ((v ...) (generate-temporaries #'(id ...)))) - #'(let ((old-v id) ... - (v val) ...) - (dynamic-wind - (lambda () - (set! id v) ...) - (lambda () b0 b1 ...) - (lambda () - (set! id old-v) ...))))))))) - -;; There are deprecated definitions for module-ref-submodule and -;; module-define-submodule! in boot-9.scm. - -;; Define (%app) and (%app modules), and have (app) alias (%app). This -;; side-effects the-root-module, both to the submodules table and (through -;; module-define-submodule! above) the obarray. -;; -(let ((%app (make-module 31))) - (set-module-name! %app '(%app)) - (module-define-submodule! the-root-module '%app %app) - (module-define-submodule! the-root-module 'app %app) - (module-define-submodule! %app 'modules (resolve-module '() #f))) - -;; Allow code that poked %module-public-interface to keep on working. -;; -(set! module-public-interface - (let ((getter module-public-interface)) - (lambda (mod) - (or (getter mod) - (cond - ((and=> (module-local-variable mod '%module-public-interface) - variable-ref) - => (lambda (iface) - (issue-deprecation-warning -"Setting a module's public interface via munging %module-public-interface is -deprecated. Use set-module-public-interface! instead.") - (set-module-public-interface! mod iface) - iface)) - (else #f)))))) - -(set! set-module-public-interface! - (let ((setter set-module-public-interface!)) - (lambda (mod iface) - (setter mod iface) - (module-define! mod '%module-public-interface iface)))) - -(define (bad-throw key . args) - (issue-deprecation-warning - "`bad-throw' in the default environment is deprecated. -Find it in the `(ice-9 scm-style-repl)' module instead.") - (apply (@ (ice-9 scm-style-repl) bad-throw) key args)) - -(define (error-catching-loop thunk) - (issue-deprecation-warning - "`error-catching-loop' in the default environment is deprecated. -Find it in the `(ice-9 scm-style-repl)' module instead.") - ((@ (ice-9 scm-style-repl) error-catching-loop) thunk)) - -(define (error-catching-repl r e p) - (issue-deprecation-warning - "`error-catching-repl' in the default environment is deprecated. -Find it in the `(ice-9 scm-style-repl)' module instead.") - ((@ (ice-9 scm-style-repl) error-catching-repl) r e p)) - -(define (scm-style-repl) - (issue-deprecation-warning - "`scm-style-repl' in the default environment is deprecated. -Find it in the `(ice-9 scm-style-repl)' module instead, or -better yet, use the repl from `(system repl repl)'.") - ((@ (ice-9 scm-style-repl) scm-style-repl))) - - -;;; Apply-to-args had the following comment attached to it in boot-9, but it's -;;; wrong-headed: in the mentioned case, a point should either be a record or -;;; multiple values. -;;; -;;; apply-to-args is functionally redundant with apply and, worse, -;;; is less general than apply since it only takes two arguments. -;;; -;;; On the other hand, apply-to-args is a syntacticly convenient way to -;;; perform binding in many circumstances when the "let" family of -;;; of forms don't cut it. E.g.: -;;; -;;; (apply-to-args (return-3d-mouse-coords) -;;; (lambda (x y z) -;;; ...)) -;;; - -(define (apply-to-args args fn) - (issue-deprecation-warning - "`apply-to-args' is deprecated. Include a local copy in your program.") - (apply fn args)) - -(define (has-suffix? str suffix) - (issue-deprecation-warning - "`has-suffix?' is deprecated. Use `string-suffix?' instead (args reversed).") - (string-suffix? suffix str)) - -(define scheme-file-suffix - (lambda () - (issue-deprecation-warning - "`scheme-file-suffix' is deprecated. Use `%load-extensions' instead.") - ".scm")) - - - -;;; {Command Line Options} -;;; - -(define (get-option argv kw-opts kw-args return) - (issue-deprecation-warning - "`get-option' is deprecated. Use `(ice-9 getopt-long)' instead.") - (cond - ((null? argv) - (return #f #f argv)) - - ((or (not (eq? #\- (string-ref (car argv) 0))) - (eq? (string-length (car argv)) 1)) - (return 'normal-arg (car argv) (cdr argv))) - - ((eq? #\- (string-ref (car argv) 1)) - (let* ((kw-arg-pos (or (string-index (car argv) #\=) - (string-length (car argv)))) - (kw (symbol->keyword (substring (car argv) 2 kw-arg-pos))) - (kw-opt? (member kw kw-opts)) - (kw-arg? (member kw kw-args)) - (arg (or (and (not (eq? kw-arg-pos (string-length (car argv)))) - (substring (car argv) - (+ kw-arg-pos 1) - (string-length (car argv)))) - (and kw-arg? - (begin (set! argv (cdr argv)) (car argv)))))) - (if (or kw-opt? kw-arg?) - (return kw arg (cdr argv)) - (return 'usage-error kw (cdr argv))))) - - (else - (let* ((char (substring (car argv) 1 2)) - (kw (symbol->keyword char))) - (cond - - ((member kw kw-opts) - (let* ((rest-car (substring (car argv) 2 (string-length (car argv)))) - (new-argv (if (= 0 (string-length rest-car)) - (cdr argv) - (cons (string-append "-" rest-car) (cdr argv))))) - (return kw #f new-argv))) - - ((member kw kw-args) - (let* ((rest-car (substring (car argv) 2 (string-length (car argv)))) - (arg (if (= 0 (string-length rest-car)) - (cadr argv) - rest-car)) - (new-argv (if (= 0 (string-length rest-car)) - (cddr argv) - (cdr argv)))) - (return kw arg new-argv))) - - (else (return 'usage-error kw argv))))))) - -(define (for-next-option proc argv kw-opts kw-args) - (issue-deprecation-warning - "`for-next-option' is deprecated. Use `(ice-9 getopt-long)' instead.") - (let loop ((argv argv)) - (get-option argv kw-opts kw-args - (lambda (opt opt-arg argv) - (and opt (proc opt opt-arg argv loop)))))) - -(define (display-usage-report kw-desc) - (issue-deprecation-warning - "`display-usage-report' is deprecated. Use `(ice-9 getopt-long)' instead.") - (for-each - (lambda (kw) - (or (eq? (car kw) #t) - (eq? (car kw) 'else) - (let* ((opt-desc kw) - (help (cadr opt-desc)) - (opts (car opt-desc)) - (opts-proper (if (string? (car opts)) (cdr opts) opts)) - (arg-name (if (string? (car opts)) - (string-append "<" (car opts) ">") - "")) - (left-part (string-append - (with-output-to-string - (lambda () - (map (lambda (x) (display (keyword->symbol x)) (display " ")) - opts-proper))) - arg-name)) - (middle-part (if (and (< (string-length left-part) 30) - (< (string-length help) 40)) - (make-string (- 30 (string-length left-part)) #\ ) - "\n\t"))) - (display left-part) - (display middle-part) - (display help) - (newline)))) - kw-desc)) - -(define (transform-usage-lambda cases) - (issue-deprecation-warning - "`display-usage-report' is deprecated. Use `(ice-9 getopt-long)' instead.") - (let* ((raw-usage (delq! 'else (map car cases))) - (usage-sans-specials (map (lambda (x) - (or (and (not (list? x)) x) - (and (symbol? (car x)) #t) - (and (boolean? (car x)) #t) - x)) - raw-usage)) - (usage-desc (delq! #t usage-sans-specials)) - (kw-desc (map car usage-desc)) - (kw-opts (apply append (map (lambda (x) (and (not (string? (car x))) x)) kw-desc))) - (kw-args (apply append (map (lambda (x) (and (string? (car x)) (cdr x))) kw-desc))) - (transmogrified-cases (map (lambda (case) - (cons (let ((opts (car case))) - (if (or (boolean? opts) (eq? 'else opts)) - opts - (cond - ((symbol? (car opts)) opts) - ((boolean? (car opts)) opts) - ((string? (caar opts)) (cdar opts)) - (else (car opts))))) - (cdr case))) - cases))) - `(let ((%display-usage (lambda () (display-usage-report ',usage-desc)))) - (lambda (%argv) - (let %next-arg ((%argv %argv)) - (get-option %argv - ',kw-opts - ',kw-args - (lambda (%opt %arg %new-argv) - (case %opt - ,@ transmogrified-cases)))))))) - - - -;;; {collect} -;;; -;;; Similar to `begin' but returns a list of the results of all constituent -;;; forms instead of the result of the last form. -;;; - -(define-syntax collect - (lambda (x) - (issue-deprecation-warning - "`collect' is deprecated. Define it yourself.") - (syntax-case x () - ((_) #''()) - ((_ x x* ...) - #'(let ((val x)) - (cons val (collect x* ...))))))) - - - - -(define (assert-repl-silence v) - (issue-deprecation-warning - "`assert-repl-silence' has moved to `(ice-9 scm-style-repl)'.") - ((@ (ice-9 scm-style-repl) assert-repl-silence) v)) - -(define (assert-repl-print-unspecified v) - (issue-deprecation-warning - "`assert-repl-print-unspecified' has moved to `(ice-9 scm-style-repl)'.") - ((@ (ice-9 scm-style-repl) assert-repl-print-unspecified) v)) - -(define (assert-repl-verbosity v) - (issue-deprecation-warning - "`assert-repl-verbosity' has moved to `(ice-9 scm-style-repl)'.") - ((@ (ice-9 scm-style-repl) assert-repl-verbosity) v)) - -(define (set-repl-prompt! v) - (issue-deprecation-warning - "`set-repl-prompt!' is deprecated. Use `repl-default-prompt-set!' from -the `(system repl common)' module.") - ;; Avoid @, as when bootstrapping it will cause the (system repl common) - ;; module to be loaded at expansion time, which eventually loads srfi-1, but - ;; that fails due to an unbuilt supporting lib... grrrrrrrrr. - ((module-ref (resolve-interface '(system repl common)) - 'repl-default-prompt-set!) - v)) - -(define (set-batch-mode?! arg) - (cond - (arg - (issue-deprecation-warning - "`set-batch-mode?!' is deprecated. Use `ensure-batch-mode!' instead.") - (ensure-batch-mode!)) - (else - (issue-deprecation-warning - "`set-batch-mode?!' with an argument of `#f' is deprecated. Use the -`*repl-stack*' fluid instead.") - #t))) - -(define (repl read evaler print) - (issue-deprecation-warning - "`repl' is deprecated. Define it yourself.") - (let loop ((source (read (current-input-port)))) - (print (evaler source)) - (loop (read (current-input-port))))) - -(define (pre-unwind-handler-dispatch key . args) - (issue-deprecation-warning - "`pre-unwind-handler-dispatch' is deprecated. Use -`default-pre-unwind-handler' from `(ice-9 scm-style-repl)' directly.") - (apply (@ (ice-9 scm-style-repl) default-pre-unwind-handler) key args)) - -(define (default-pre-unwind-handler key . args) - (issue-deprecation-warning - "`default-pre-unwind-handler' is deprecated. Use it from -`(ice-9 scm-style-repl)' if you need it.") - (apply (@ (ice-9 scm-style-repl) default-pre-unwind-handler) key args)) - -(define (handle-system-error key . args) - (issue-deprecation-warning - "`handle-system-error' is deprecated. Use it from -`(ice-9 scm-style-repl)' if you need it.") - (apply (@ (ice-9 scm-style-repl) handle-system-error) key args)) - -(define-syntax stack-saved? - (make-variable-transformer - (lambda (x) - (issue-deprecation-warning - "`stack-saved?' is deprecated. Use it from -`(ice-9 save-stack)' if you need it.") - (syntax-case x (set!) - ((set! id val) - (identifier? #'id) - #'(set! (@ (ice-9 save-stack) stack-saved?) val)) - (id - (identifier? #'id) - #'(@ (ice-9 save-stack) stack-saved?)))))) - -(define-syntax the-last-stack - (lambda (x) - (issue-deprecation-warning - "`the-last-stack' is deprecated. Use it from `(ice-9 save-stack)' -if you need it.") - (syntax-case x () - (id - (identifier? #'id) - #'(@ (ice-9 save-stack) the-last-stack))))) - -(define (save-stack . args) - (issue-deprecation-warning - "`save-stack' is deprecated. Use it from `(ice-9 save-stack)' if you need -it.") - (apply (@ (ice-9 save-stack) save-stack) args)) - -(define (named-module-use! user usee) - (issue-deprecation-warning - "`named-module-use!' is deprecated. Define it yourself if you need it.") - (module-use! (resolve-module user) (resolve-interface usee))) - -(define (top-repl) - (issue-deprecation-warning - "`top-repl' has moved to the `(ice-9 top-repl)' module.") - ((module-ref (resolve-module '(ice-9 top-repl)) 'top-repl))) - -(set! debug-enable - (let ((debug-enable debug-enable)) - (lambda opts - (if (memq 'debug opts) - (begin - (issue-deprecation-warning - "`(debug-enable 'debug)' is obsolete and has no effect." - "Remove it from your code.") - (apply debug-enable (delq 'debug opts))) - (apply debug-enable opts))))) - -(define (turn-on-debugging) - (issue-deprecation-warning - "`(turn-on-debugging)' is obsolete and usually has no effect." - "Debugging capabilities are present by default.") - (debug-enable 'backtrace) - (read-enable 'positions)) - -(define (read-hash-procedures-warning) - (issue-deprecation-warning - "`read-hash-procedures' is deprecated." - "Use the fluid `%read-hash-procedures' instead.")) - -(define-syntax read-hash-procedures - (identifier-syntax - (_ - (begin (read-hash-procedures-warning) - (fluid-ref %read-hash-procedures))) - ((set! _ expr) - (begin (read-hash-procedures-warning) - (fluid-set! %read-hash-procedures expr))))) - -(define (process-define-module args) - (define (missing kw) - (error "missing argument to define-module keyword" kw)) - (define (unrecognized arg) - (error "unrecognized define-module argument" arg)) - - (issue-deprecation-warning - "`process-define-module' is deprecated. Use `define-module*' instead.") - - (let ((name (car args)) - (filename #f) - (pure? #f) - (version #f) - (system? #f) - (duplicates '()) - (transformer #f)) - (let loop ((kws (cdr args)) - (imports '()) - (exports '()) - (re-exports '()) - (replacements '()) - (autoloads '())) - (if (null? kws) - (define-module* name - #:filename filename #:pure pure? #:version version - #:duplicates duplicates #:transformer transformer - #:imports (reverse! imports) - #:exports exports - #:re-exports re-exports - #:replacements replacements - #:autoloads autoloads) - (case (car kws) - ((#:use-module #:use-syntax) - (or (pair? (cdr kws)) - (missing (car kws))) - (cond - ((equal? (cadr kws) '(ice-9 syncase)) - (issue-deprecation-warning - "(ice-9 syncase) is deprecated. Support for syntax-case is now in Guile core.") - (loop (cddr kws) - imports exports re-exports replacements autoloads)) - (else - (let ((iface-spec (cadr kws))) - (if (eq? (car kws) #:use-syntax) - (set! transformer iface-spec)) - (loop (cddr kws) - (cons iface-spec imports) exports re-exports - replacements autoloads))))) - ((#:autoload) - (or (and (pair? (cdr kws)) (pair? (cddr kws))) - (missing (car kws))) - (let ((name (cadr kws)) - (bindings (caddr kws))) - (loop (cdddr kws) - imports exports re-exports - replacements (cons* name bindings autoloads)))) - ((#:no-backtrace) - ;; FIXME: deprecate? - (set! system? #t) - (loop (cdr kws) - imports exports re-exports replacements autoloads)) - ((#:pure) - (set! pure? #t) - (loop (cdr kws) - imports exports re-exports replacements autoloads)) - ((#:version) - (or (pair? (cdr kws)) - (missing (car kws))) - (set! version (cadr kws)) - (loop (cddr kws) - imports exports re-exports replacements autoloads)) - ((#:duplicates) - (if (not (pair? (cdr kws))) - (missing (car kws))) - (set! duplicates (cadr kws)) - (loop (cddr kws) - imports exports re-exports replacements autoloads)) - ((#:export #:export-syntax) - (or (pair? (cdr kws)) - (missing (car kws))) - (loop (cddr kws) - imports (append exports (cadr kws)) re-exports - replacements autoloads)) - ((#:re-export #:re-export-syntax) - (or (pair? (cdr kws)) - (missing (car kws))) - (loop (cddr kws) - imports exports (append re-exports (cadr kws)) - replacements autoloads)) - ((#:replace #:replace-syntax) - (or (pair? (cdr kws)) - (missing (car kws))) - (loop (cddr kws) - imports exports re-exports - (append replacements (cadr kws)) autoloads)) - ((#:filename) - (or (pair? (cdr kws)) - (missing (car kws))) - (set! filename (cadr kws)) - (loop (cddr kws) - imports exports re-exports replacements autoloads)) - (else - (unrecognized kws))))))) diff --git a/module/ice-9/eval.scm b/module/ice-9/eval.scm index c0fa64c90..5b2937147 100644 --- a/module/ice-9/eval.scm +++ b/module/ice-9/eval.scm @@ -1,6 +1,6 @@ ;;; -*- mode: scheme; coding: utf-8; -*- -;;;; Copyright (C) 2009, 2010 +;;;; Copyright (C) 2009, 2010, 2011 ;;;; Free Software Foundation, Inc. ;;;; ;;;; This library is free software; you can redistribute it and/or @@ -399,14 +399,11 @@ 0 #f '() #f) (apply make-general-closure (capture-env env) body nreq tail)))) - (('begin (first . rest)) - (let lp ((first first) (rest rest)) - (if (null? rest) - (eval first env) - (begin - (eval first env) - (lp (car rest) (cdr rest)))))) - + (('seq (head . tail)) + (begin + (eval head env) + (eval tail env))) + (('lexical-set! (n . x)) (let ((val (eval x env))) (list-set! env n val))) diff --git a/module/ice-9/psyntax-pp.scm b/module/ice-9/psyntax-pp.scm index 644ebf5c9..68c7667f4 100644 --- a/module/ice-9/psyntax-pp.scm +++ b/module/ice-9/psyntax-pp.scm @@ -2,1632 +2,1997 @@ (if #f #f) (letrec* - ((#{top-level-eval-hook 4261}# - (lambda (#{x 28515}# #{mod 28516}#) - (primitive-eval #{x 28515}#))) - (#{maybe-name-value! 4266}# - (lambda (#{name 16653}# #{val 16654}#) - (if (if (struct? #{val 16654}#) - (eq? (struct-vtable #{val 16654}#) - (vector-ref %expanded-vtables 13)) + ((#{top-level-eval-hook 4370}# + (lambda (#{x 35759}# #{mod 35760}#) + (primitive-eval #{x 35759}#))) + (#{maybe-name-value! 4375}# + (lambda (#{name 18991}# #{val 18992}#) + (if (if (struct? #{val 18992}#) + (eq? (struct-vtable #{val 18992}#) + (vector-ref %expanded-vtables 14)) #f) - (let ((#{meta 16661}# (struct-ref #{val 16654}# 1))) - (if (not (assq 'name #{meta 16661}#)) - (let ((#{v 16666}# - (cons (cons 'name #{name 16653}#) #{meta 16661}#))) - (struct-set! #{val 16654}# 1 #{v 16666}#))))))) - (#{build-application 4268}# - (lambda (#{source 16378}# - #{fun-exp 16379}# - #{arg-exps 16380}#) + (let ((#{meta 18999}# (struct-ref #{val 18992}# 1))) + (if (not (assq 'name #{meta 18999}#)) + (let ((#{v 19004}# + (cons (cons 'name #{name 18991}#) #{meta 18999}#))) + (struct-set! #{val 18992}# 1 #{v 19004}#))))))) + (#{build-call 4377}# + (lambda (#{source 18736}# + #{fun-exp 18737}# + #{arg-exps 18738}#) (make-struct/no-tail (vector-ref %expanded-vtables 11) - #{source 16378}# - #{fun-exp 16379}# - #{arg-exps 16380}#))) - (#{build-conditional 4269}# - (lambda (#{source 16386}# - #{test-exp 16387}# - #{then-exp 16388}# - #{else-exp 16389}#) + #{source 18736}# + #{fun-exp 18737}# + #{arg-exps 18738}#))) + (#{build-conditional 4378}# + (lambda (#{source 18744}# + #{test-exp 18745}# + #{then-exp 18746}# + #{else-exp 18747}#) (make-struct/no-tail (vector-ref %expanded-vtables 10) - #{source 16386}# - #{test-exp 16387}# - #{then-exp 16388}# - #{else-exp 16389}#))) - (#{build-dynlet 4270}# - (lambda (#{source 16396}# - #{fluids 16397}# - #{vals 16398}# - #{body 16399}#) + #{source 18744}# + #{test-exp 18745}# + #{then-exp 18746}# + #{else-exp 18747}#))) + (#{build-dynlet 4379}# + (lambda (#{source 18754}# + #{fluids 18755}# + #{vals 18756}# + #{body 18757}#) (make-struct/no-tail - (vector-ref %expanded-vtables 17) - #{source 16396}# - #{fluids 16397}# - #{vals 16398}# - #{body 16399}#))) - (#{build-lexical-reference 4271}# - (lambda (#{type 28517}# - #{source 28518}# - #{name 28519}# - #{var 28520}#) + (vector-ref %expanded-vtables 18) + #{source 18754}# + #{fluids 18755}# + #{vals 18756}# + #{body 18757}#))) + (#{build-lexical-reference 4380}# + (lambda (#{type 35761}# + #{source 35762}# + #{name 35763}# + #{var 35764}#) (make-struct/no-tail (vector-ref %expanded-vtables 3) - #{source 28518}# - #{name 28519}# - #{var 28520}#))) - (#{build-lexical-assignment 4272}# - (lambda (#{source 16406}# - #{name 16407}# - #{var 16408}# - #{exp 16409}#) + #{source 35762}# + #{name 35763}# + #{var 35764}#))) + (#{build-lexical-assignment 4381}# + (lambda (#{source 18764}# + #{name 18765}# + #{var 18766}# + #{exp 18767}#) (begin - (if (if (struct? #{exp 16409}#) - (eq? (struct-vtable #{exp 16409}#) - (vector-ref %expanded-vtables 13)) + (if (if (struct? #{exp 18767}#) + (eq? (struct-vtable #{exp 18767}#) + (vector-ref %expanded-vtables 14)) #f) - (let ((#{meta 16425}# (struct-ref #{exp 16409}# 1))) - (if (not (assq 'name #{meta 16425}#)) - (let ((#{v 16432}# - (cons (cons 'name #{name 16407}#) #{meta 16425}#))) - (struct-set! #{exp 16409}# 1 #{v 16432}#))))) + (let ((#{meta 18783}# (struct-ref #{exp 18767}# 1))) + (if (not (assq 'name #{meta 18783}#)) + (let ((#{v 18790}# + (cons (cons 'name #{name 18765}#) #{meta 18783}#))) + (struct-set! #{exp 18767}# 1 #{v 18790}#))))) (make-struct/no-tail (vector-ref %expanded-vtables 4) - #{source 16406}# - #{name 16407}# - #{var 16408}# - #{exp 16409}#)))) - (#{analyze-variable 4273}# - (lambda (#{mod 28526}# - #{var 28527}# - #{modref-cont 28528}# - #{bare-cont 28529}#) - (if (not #{mod 28526}#) - (#{bare-cont 28529}# #{var 28527}#) - (let ((#{kind 28530}# (car #{mod 28526}#)) - (#{mod 28531}# (cdr #{mod 28526}#))) - (if (eqv? #{kind 28530}# 'public) - (#{modref-cont 28528}# - #{mod 28531}# - #{var 28527}# + #{source 18764}# + #{name 18765}# + #{var 18766}# + #{exp 18767}#)))) + (#{analyze-variable 4382}# + (lambda (#{mod 35770}# + #{var 35771}# + #{modref-cont 35772}# + #{bare-cont 35773}#) + (if (not #{mod 35770}#) + (#{bare-cont 35773}# #{var 35771}#) + (let ((#{kind 35774}# (car #{mod 35770}#)) + (#{mod 35775}# (cdr #{mod 35770}#))) + (if (eqv? #{kind 35774}# 'public) + (#{modref-cont 35772}# + #{mod 35775}# + #{var 35771}# #t) - (if (eqv? #{kind 28530}# 'private) + (if (eqv? #{kind 35774}# 'private) (if (not (equal? - #{mod 28531}# + #{mod 35775}# (module-name (current-module)))) - (#{modref-cont 28528}# - #{mod 28531}# - #{var 28527}# + (#{modref-cont 35772}# + #{mod 35775}# + #{var 35771}# #f) - (#{bare-cont 28529}# #{var 28527}#)) - (if (eqv? #{kind 28530}# 'bare) - (#{bare-cont 28529}# #{var 28527}#) - (if (eqv? #{kind 28530}# 'hygiene) + (#{bare-cont 35773}# #{var 35771}#)) + (if (eqv? #{kind 35774}# 'bare) + (#{bare-cont 35773}# #{var 35771}#) + (if (eqv? #{kind 35774}# 'hygiene) (if (if (not (equal? - #{mod 28531}# + #{mod 35775}# (module-name (current-module)))) (module-variable - (resolve-module #{mod 28531}#) - #{var 28527}#) + (resolve-module #{mod 35775}#) + #{var 35771}#) #f) - (#{modref-cont 28528}# - #{mod 28531}# - #{var 28527}# + (#{modref-cont 35772}# + #{mod 35775}# + #{var 35771}# #f) - (#{bare-cont 28529}# #{var 28527}#)) + (#{bare-cont 35773}# #{var 35771}#)) (syntax-violation #f "bad module kind" - #{var 28527}# - #{mod 28531}#))))))))) - (#{build-global-reference 4274}# - (lambda (#{source 28546}# #{var 28547}# #{mod 28548}#) - (#{analyze-variable 4273}# - #{mod 28548}# - #{var 28547}# - (lambda (#{mod 28551}# #{var 28552}# #{public? 28553}#) + #{var 35771}# + #{mod 35775}#))))))))) + (#{build-global-reference 4383}# + (lambda (#{source 35790}# #{var 35791}# #{mod 35792}#) + (#{analyze-variable 4382}# + #{mod 35792}# + #{var 35791}# + (lambda (#{mod 35795}# #{var 35796}# #{public? 35797}#) (make-struct/no-tail (vector-ref %expanded-vtables 5) - #{source 28546}# - #{mod 28551}# - #{var 28552}# - #{public? 28553}#)) - (lambda (#{var 28561}#) + #{source 35790}# + #{mod 35795}# + #{var 35796}# + #{public? 35797}#)) + (lambda (#{var 35804}#) (make-struct/no-tail (vector-ref %expanded-vtables 7) - #{source 28546}# - #{var 28561}#))))) - (#{build-global-assignment 4275}# - (lambda (#{source 16441}# - #{var 16442}# - #{exp 16443}# - #{mod 16444}#) + #{source 35790}# + #{var 35804}#))))) + (#{build-global-assignment 4384}# + (lambda (#{source 18799}# + #{var 18800}# + #{exp 18801}# + #{mod 18802}#) (begin - (if (if (struct? #{exp 16443}#) - (eq? (struct-vtable #{exp 16443}#) - (vector-ref %expanded-vtables 13)) + (if (if (struct? #{exp 18801}#) + (eq? (struct-vtable #{exp 18801}#) + (vector-ref %expanded-vtables 14)) #f) - (let ((#{meta 16460}# (struct-ref #{exp 16443}# 1))) - (if (not (assq 'name #{meta 16460}#)) - (let ((#{v 16467}# - (cons (cons 'name #{var 16442}#) #{meta 16460}#))) - (struct-set! #{exp 16443}# 1 #{v 16467}#))))) - (#{analyze-variable 4273}# - #{mod 16444}# - #{var 16442}# - (lambda (#{mod 16472}# #{var 16473}# #{public? 16474}#) + (let ((#{meta 18818}# (struct-ref #{exp 18801}# 1))) + (if (not (assq 'name #{meta 18818}#)) + (let ((#{v 18825}# + (cons (cons 'name #{var 18800}#) #{meta 18818}#))) + (struct-set! #{exp 18801}# 1 #{v 18825}#))))) + (#{analyze-variable 4382}# + #{mod 18802}# + #{var 18800}# + (lambda (#{mod 18830}# #{var 18831}# #{public? 18832}#) (make-struct/no-tail (vector-ref %expanded-vtables 6) - #{source 16441}# - #{mod 16472}# - #{var 16473}# - #{public? 16474}# - #{exp 16443}#)) - (lambda (#{var 16482}#) + #{source 18799}# + #{mod 18830}# + #{var 18831}# + #{public? 18832}# + #{exp 18801}#)) + (lambda (#{var 18840}#) (make-struct/no-tail (vector-ref %expanded-vtables 8) - #{source 16441}# - #{var 16482}# - #{exp 16443}#)))))) - (#{build-global-definition 4276}# - (lambda (#{source 28567}# #{var 28568}# #{exp 28569}#) + #{source 18799}# + #{var 18840}# + #{exp 18801}#)))))) + (#{build-global-definition 4385}# + (lambda (#{source 35809}# #{var 35810}# #{exp 35811}#) (begin - (if (if (struct? #{exp 28569}#) - (eq? (struct-vtable #{exp 28569}#) - (vector-ref %expanded-vtables 13)) + (if (if (struct? #{exp 35811}#) + (eq? (struct-vtable #{exp 35811}#) + (vector-ref %expanded-vtables 14)) #f) - (let ((#{meta 28585}# (struct-ref #{exp 28569}# 1))) - (if (not (assq 'name #{meta 28585}#)) - (let ((#{v 28592}# - (cons (cons 'name #{var 28568}#) #{meta 28585}#))) - (struct-set! #{exp 28569}# 1 #{v 28592}#))))) + (let ((#{meta 35827}# (struct-ref #{exp 35811}# 1))) + (if (not (assq 'name #{meta 35827}#)) + (let ((#{v 35834}# + (cons (cons 'name #{var 35810}#) #{meta 35827}#))) + (struct-set! #{exp 35811}# 1 #{v 35834}#))))) (make-struct/no-tail (vector-ref %expanded-vtables 9) - #{source 28567}# - #{var 28568}# - #{exp 28569}#)))) - (#{build-simple-lambda 4277}# - (lambda (#{src 16488}# - #{req 16489}# - #{rest 16490}# - #{vars 16491}# - #{meta 16492}# - #{exp 16493}#) - (let ((#{body 16499}# + #{source 35809}# + #{var 35810}# + #{exp 35811}#)))) + (#{build-simple-lambda 4386}# + (lambda (#{src 18846}# + #{req 18847}# + #{rest 18848}# + #{vars 18849}# + #{meta 18850}# + #{exp 18851}#) + (let ((#{body 18857}# (make-struct/no-tail - (vector-ref %expanded-vtables 14) - #{src 16488}# - #{req 16489}# + (vector-ref %expanded-vtables 15) + #{src 18846}# + #{req 18847}# #f - #{rest 16490}# + #{rest 18848}# #f '() - #{vars 16491}# - #{exp 16493}# + #{vars 18849}# + #{exp 18851}# #f))) (make-struct/no-tail - (vector-ref %expanded-vtables 13) - #{src 16488}# - #{meta 16492}# - #{body 16499}#)))) - (#{build-sequence 4282}# - (lambda (#{src 28600}# #{exps 28601}#) - (if (null? (cdr #{exps 28601}#)) - (car #{exps 28601}#) - (make-struct/no-tail - (vector-ref %expanded-vtables 12) - #{src 28600}# - #{exps 28601}#)))) - (#{build-let 4283}# - (lambda (#{src 16511}# - #{ids 16512}# - #{vars 16513}# - #{val-exps 16514}# - #{body-exp 16515}#) - (begin - (for-each - #{maybe-name-value! 4266}# - #{ids 16512}# - #{val-exps 16514}#) - (if (null? #{vars 16513}#) - #{body-exp 16515}# + (vector-ref %expanded-vtables 14) + #{src 18846}# + #{meta 18850}# + #{body 18857}#)))) + (#{build-primcall 4389}# + (lambda (#{src 18869}# #{name 18870}# #{args 18871}#) + (make-struct/no-tail + (vector-ref %expanded-vtables 12) + #{src 18869}# + #{name 18870}# + #{args 18871}#))) + (#{build-sequence 4392}# + (lambda (#{src 35842}# #{exps 35843}#) + (if (null? (cdr #{exps 35843}#)) + (car #{exps 35843}#) + (let ((#{head 35847}# (car #{exps 35843}#)) + (#{tail 35848}# + (#{build-sequence 4392}# #f (cdr #{exps 35843}#)))) (make-struct/no-tail - (vector-ref %expanded-vtables 15) - #{src 16511}# - #{ids 16512}# - #{vars 16513}# - #{val-exps 16514}# - #{body-exp 16515}#))))) - (#{build-named-let 4284}# - (lambda (#{src 16539}# - #{ids 16540}# - #{vars 16541}# - #{val-exps 16542}# - #{body-exp 16543}#) - (let ((#{f 16544}# (car #{vars 16541}#)) - (#{f-name 16545}# (car #{ids 16540}#)) - (#{vars 16546}# (cdr #{vars 16541}#)) - (#{ids 16547}# (cdr #{ids 16540}#))) - (let ((#{proc 16548}# - (let ((#{body 16568}# + (vector-ref %expanded-vtables 13) + #{src 35842}# + #{head 35847}# + #{tail 35848}#))))) + (#{build-named-let 4394}# + (lambda (#{src 18877}# + #{ids 18878}# + #{vars 18879}# + #{val-exps 18880}# + #{body-exp 18881}#) + (let ((#{f 18882}# (car #{vars 18879}#)) + (#{f-name 18883}# (car #{ids 18878}#)) + (#{vars 18884}# (cdr #{vars 18879}#)) + (#{ids 18885}# (cdr #{ids 18878}#))) + (let ((#{proc 18886}# + (let ((#{body 18906}# (make-struct/no-tail - (vector-ref %expanded-vtables 14) - #{src 16539}# - #{ids 16547}# + (vector-ref %expanded-vtables 15) + #{src 18877}# + #{ids 18885}# #f #f #f '() - #{vars 16546}# - #{body-exp 16543}# + #{vars 18884}# + #{body-exp 18881}# #f))) (make-struct/no-tail - (vector-ref %expanded-vtables 13) - #{src 16539}# + (vector-ref %expanded-vtables 14) + #{src 18877}# '() - #{body 16568}#)))) + #{body 18906}#)))) (begin - (if (if (struct? #{proc 16548}#) - (eq? (struct-vtable #{proc 16548}#) - (vector-ref %expanded-vtables 13)) + (if (if (struct? #{proc 18886}#) + (eq? (struct-vtable #{proc 18886}#) + (vector-ref %expanded-vtables 14)) #f) - (let ((#{meta 16592}# (struct-ref #{proc 16548}# 1))) - (if (not (assq 'name #{meta 16592}#)) - (let ((#{v 16599}# - (cons (cons 'name #{f-name 16545}#) - #{meta 16592}#))) - (struct-set! #{proc 16548}# 1 #{v 16599}#))))) + (let ((#{meta 18930}# (struct-ref #{proc 18886}# 1))) + (if (not (assq 'name #{meta 18930}#)) + (let ((#{v 18937}# + (cons (cons 'name #{f-name 18883}#) + #{meta 18930}#))) + (struct-set! #{proc 18886}# 1 #{v 18937}#))))) (for-each - #{maybe-name-value! 4266}# - #{ids 16547}# - #{val-exps 16542}#) - (let ((#{names 16623}# (list #{f-name 16545}#)) - (#{gensyms 16624}# (list #{f 16544}#)) - (#{vals 16625}# (list #{proc 16548}#)) - (#{body 16626}# - (let ((#{fun-exp 16630}# + #{maybe-name-value! 4375}# + #{ids 18885}# + #{val-exps 18880}#) + (let ((#{names 18961}# (list #{f-name 18883}#)) + (#{gensyms 18962}# (list #{f 18882}#)) + (#{vals 18963}# (list #{proc 18886}#)) + (#{body 18964}# + (let ((#{fun-exp 18968}# (make-struct/no-tail (vector-ref %expanded-vtables 3) - #{src 16539}# - #{f-name 16545}# - #{f 16544}#))) + #{src 18877}# + #{f-name 18883}# + #{f 18882}#))) (make-struct/no-tail (vector-ref %expanded-vtables 11) - #{src 16539}# - #{fun-exp 16630}# - #{val-exps 16542}#)))) + #{src 18877}# + #{fun-exp 18968}# + #{val-exps 18880}#)))) (make-struct/no-tail - (vector-ref %expanded-vtables 16) - #{src 16539}# + (vector-ref %expanded-vtables 17) + #{src 18877}# #f - #{names 16623}# - #{gensyms 16624}# - #{vals 16625}# - #{body 16626}#))))))) - (#{build-letrec 4285}# - (lambda (#{src 16646}# - #{in-order? 16647}# - #{ids 16648}# - #{vars 16649}# - #{val-exps 16650}# - #{body-exp 16651}#) - (if (null? #{vars 16649}#) - #{body-exp 16651}# + #{names 18961}# + #{gensyms 18962}# + #{vals 18963}# + #{body 18964}#))))))) + (#{build-letrec 4395}# + (lambda (#{src 18984}# + #{in-order? 18985}# + #{ids 18986}# + #{vars 18987}# + #{val-exps 18988}# + #{body-exp 18989}#) + (if (null? #{vars 18987}#) + #{body-exp 18989}# (begin (for-each - #{maybe-name-value! 4266}# - #{ids 16648}# - #{val-exps 16650}#) + #{maybe-name-value! 4375}# + #{ids 18986}# + #{val-exps 18988}#) (make-struct/no-tail - (vector-ref %expanded-vtables 16) - #{src 16646}# - #{in-order? 16647}# - #{ids 16648}# - #{vars 16649}# - #{val-exps 16650}# - #{body-exp 16651}#))))) - (#{source-annotation 4294}# - (lambda (#{x 16677}#) - (if (if (vector? #{x 16677}#) - (if (= (vector-length #{x 16677}#) 4) - (eq? (vector-ref #{x 16677}# 0) 'syntax-object) + (vector-ref %expanded-vtables 17) + #{src 18984}# + #{in-order? 18985}# + #{ids 18986}# + #{vars 18987}# + #{val-exps 18988}# + #{body-exp 18989}#))))) + (#{source-annotation 4404}# + (lambda (#{x 19015}#) + (if (if (vector? #{x 19015}#) + (if (= (vector-length #{x 19015}#) 4) + (eq? (vector-ref #{x 19015}# 0) 'syntax-object) #f) #f) - (#{source-annotation 4294}# - (vector-ref #{x 16677}# 1)) - (if (pair? #{x 16677}#) - (let ((#{props 16692}# (source-properties #{x 16677}#))) - (if (pair? #{props 16692}#) #{props 16692}# #f)) + (#{source-annotation 4404}# + (vector-ref #{x 19015}# 1)) + (if (pair? #{x 19015}#) + (let ((#{props 19030}# (source-properties #{x 19015}#))) + (if (pair? #{props 19030}#) #{props 19030}# #f)) #f)))) - (#{extend-env 4295}# - (lambda (#{labels 16694}# #{bindings 16695}# #{r 16696}#) - (if (null? #{labels 16694}#) - #{r 16696}# - (#{extend-env 4295}# - (cdr #{labels 16694}#) - (cdr #{bindings 16695}#) - (cons (cons (car #{labels 16694}#) - (car #{bindings 16695}#)) - #{r 16696}#))))) - (#{extend-var-env 4296}# - (lambda (#{labels 16697}# #{vars 16698}# #{r 16699}#) - (if (null? #{labels 16697}#) - #{r 16699}# - (#{extend-var-env 4296}# - (cdr #{labels 16697}#) - (cdr #{vars 16698}#) - (cons (cons (car #{labels 16697}#) - (cons 'lexical (car #{vars 16698}#))) - #{r 16699}#))))) - (#{macros-only-env 4297}# - (lambda (#{r 16700}#) - (if (null? #{r 16700}#) + (#{extend-env 4405}# + (lambda (#{labels 19032}# #{bindings 19033}# #{r 19034}#) + (if (null? #{labels 19032}#) + #{r 19034}# + (#{extend-env 4405}# + (cdr #{labels 19032}#) + (cdr #{bindings 19033}#) + (cons (cons (car #{labels 19032}#) + (car #{bindings 19033}#)) + #{r 19034}#))))) + (#{extend-var-env 4406}# + (lambda (#{labels 19035}# #{vars 19036}# #{r 19037}#) + (if (null? #{labels 19035}#) + #{r 19037}# + (#{extend-var-env 4406}# + (cdr #{labels 19035}#) + (cdr #{vars 19036}#) + (cons (cons (car #{labels 19035}#) + (cons 'lexical (car #{vars 19036}#))) + #{r 19037}#))))) + (#{macros-only-env 4407}# + (lambda (#{r 19038}#) + (if (null? #{r 19038}#) '() - (let ((#{a 16701}# (car #{r 16700}#))) - (if (eq? (car (cdr #{a 16701}#)) 'macro) - (cons #{a 16701}# - (#{macros-only-env 4297}# (cdr #{r 16700}#))) - (#{macros-only-env 4297}# (cdr #{r 16700}#))))))) - (#{global-extend 4299}# - (lambda (#{type 16703}# #{sym 16704}# #{val 16705}#) + (let ((#{a 19039}# (car #{r 19038}#))) + (if (let ((#{t 19042}# (car (cdr #{a 19039}#)))) + (if (eq? #{t 19042}# 'macro) + #t + (eq? #{t 19042}# 'syntax-parameter))) + (cons #{a 19039}# + (#{macros-only-env 4407}# (cdr #{r 19038}#))) + (#{macros-only-env 4407}# (cdr #{r 19038}#))))))) + (#{global-extend 4408}# + (lambda (#{type 19044}# #{sym 19045}# #{val 19046}#) (module-define! (current-module) - #{sym 16704}# + #{sym 19045}# (make-syntax-transformer - #{sym 16704}# - #{type 16703}# - #{val 16705}#)))) - (#{id? 4301}# - (lambda (#{x 10537}#) - (if (symbol? #{x 10537}#) + #{sym 19045}# + #{type 19044}# + #{val 19046}#)))) + (#{id? 4410}# + (lambda (#{x 11968}#) + (if (symbol? #{x 11968}#) #t - (if (if (vector? #{x 10537}#) - (if (= (vector-length #{x 10537}#) 4) - (eq? (vector-ref #{x 10537}# 0) 'syntax-object) + (if (if (vector? #{x 11968}#) + (if (= (vector-length #{x 11968}#) 4) + (eq? (vector-ref #{x 11968}# 0) 'syntax-object) #f) #f) - (symbol? (vector-ref #{x 10537}# 1)) + (symbol? (vector-ref #{x 11968}# 1)) #f)))) - (#{gen-labels 4304}# - (lambda (#{ls 16715}#) - (if (null? #{ls 16715}#) + (#{gen-labels 4413}# + (lambda (#{ls 19056}#) + (if (null? #{ls 19056}#) '() (cons (symbol->string (gensym "i")) - (#{gen-labels 4304}# (cdr #{ls 16715}#)))))) - (#{make-binding-wrap 4315}# - (lambda (#{ids 16719}# #{labels 16720}# #{w 16721}#) - (if (null? #{ids 16719}#) - #{w 16721}# - (cons (car #{w 16721}#) - (cons (let ((#{labelvec 16722}# - (list->vector #{labels 16720}#))) - (let ((#{n 16723}# (vector-length #{labelvec 16722}#))) - (let ((#{symnamevec 16724}# (make-vector #{n 16723}#)) - (#{marksvec 16725}# (make-vector #{n 16723}#))) + (#{gen-labels 4413}# (cdr #{ls 19056}#)))))) + (#{make-binding-wrap 4424}# + (lambda (#{ids 19060}# #{labels 19061}# #{w 19062}#) + (if (null? #{ids 19060}#) + #{w 19062}# + (cons (car #{w 19062}#) + (cons (let ((#{labelvec 19063}# + (list->vector #{labels 19061}#))) + (let ((#{n 19064}# (vector-length #{labelvec 19063}#))) + (let ((#{symnamevec 19065}# (make-vector #{n 19064}#)) + (#{marksvec 19066}# (make-vector #{n 19064}#))) (begin (letrec* - ((#{f 16726}# - (lambda (#{ids 16729}# #{i 16730}#) - (if (not (null? #{ids 16729}#)) + ((#{f 19067}# + (lambda (#{ids 19266}# #{i 19267}#) + (if (not (null? #{ids 19266}#)) (call-with-values (lambda () - (let ((#{x 16733}# - (car #{ids 16729}#))) - (if (if (vector? #{x 16733}#) + (let ((#{x 19270}# + (car #{ids 19266}#))) + (if (if (vector? #{x 19270}#) (if (= (vector-length - #{x 16733}#) + #{x 19270}#) 4) (eq? (vector-ref - #{x 16733}# + #{x 19270}# 0) 'syntax-object) #f) #f) (values - (vector-ref #{x 16733}# 1) - (let ((#{m1 16749}# - (car #{w 16721}#)) - (#{m2 16750}# + (vector-ref #{x 19270}# 1) + (let ((#{m1 19286}# + (car #{w 19062}#)) + (#{m2 19287}# (car (vector-ref - #{x 16733}# + #{x 19270}# 2)))) - (if (null? #{m2 16750}#) - #{m1 16749}# + (if (null? #{m2 19287}#) + #{m1 19286}# (append - #{m1 16749}# - #{m2 16750}#)))) + #{m1 19286}# + #{m2 19287}#)))) (values - #{x 16733}# - (car #{w 16721}#))))) - (lambda (#{symname 16770}# - #{marks 16771}#) + #{x 19270}# + (car #{w 19062}#))))) + (lambda (#{symname 19307}# + #{marks 19308}#) (begin (vector-set! - #{symnamevec 16724}# - #{i 16730}# - #{symname 16770}#) + #{symnamevec 19065}# + #{i 19267}# + #{symname 19307}#) (vector-set! - #{marksvec 16725}# - #{i 16730}# - #{marks 16771}#) - (#{f 16726}# - (cdr #{ids 16729}#) - (#{1+}# #{i 16730}#))))))))) - (#{f 16726}# #{ids 16719}# 0)) + #{marksvec 19066}# + #{i 19267}# + #{marks 19308}#) + (#{f 19067}# + (cdr #{ids 19266}#) + (#{1+}# #{i 19267}#))))))))) + (#{f 19067}# #{ids 19060}# 0)) (vector 'ribcage - #{symnamevec 16724}# - #{marksvec 16725}# - #{labelvec 16722}#))))) - (cdr #{w 16721}#)))))) - (#{join-wraps 4317}# - (lambda (#{w1 16780}# #{w2 16781}#) - (let ((#{m1 16782}# (car #{w1 16780}#)) - (#{s1 16783}# (cdr #{w1 16780}#))) - (if (null? #{m1 16782}#) - (if (null? #{s1 16783}#) - #{w2 16781}# - (cons (car #{w2 16781}#) - (let ((#{m2 16790}# (cdr #{w2 16781}#))) - (if (null? #{m2 16790}#) - #{s1 16783}# - (append #{s1 16783}# #{m2 16790}#))))) - (cons (let ((#{m2 16799}# (car #{w2 16781}#))) - (if (null? #{m2 16799}#) - #{m1 16782}# - (append #{m1 16782}# #{m2 16799}#))) - (let ((#{m2 16808}# (cdr #{w2 16781}#))) - (if (null? #{m2 16808}#) - #{s1 16783}# - (append #{s1 16783}# #{m2 16808}#)))))))) - (#{same-marks? 4319}# - (lambda (#{x 16813}# #{y 16814}#) - (if (eq? #{x 16813}# #{y 16814}#) - (eq? #{x 16813}# #{y 16814}#) - (if (not (null? #{x 16813}#)) - (if (not (null? #{y 16814}#)) - (if (eq? (car #{x 16813}#) (car #{y 16814}#)) - (#{same-marks? 4319}# - (cdr #{x 16813}#) - (cdr #{y 16814}#)) + #{symnamevec 19065}# + #{marksvec 19066}# + #{labelvec 19063}#))))) + (cdr #{w 19062}#)))))) + (#{same-marks? 4428}# + (lambda (#{x 35849}# #{y 35850}#) + (if (eq? #{x 35849}# #{y 35850}#) + (eq? #{x 35849}# #{y 35850}#) + (if (not (null? #{x 35849}#)) + (if (not (null? #{y 35850}#)) + (if (eq? (car #{x 35849}#) (car #{y 35850}#)) + (#{same-marks? 4428}# + (cdr #{x 35849}#) + (cdr #{y 35850}#)) #f) #f) #f)))) - (#{id-var-name 4320}# - (lambda (#{id 16822}# #{w 16823}#) + (#{id-var-name 4429}# + (lambda (#{id 35858}# #{w 35859}# #{mod 35860}#) (letrec* - ((#{search 16824}# - (lambda (#{sym 16885}# #{subst 16886}# #{marks 16887}#) - (if (null? #{subst 16886}#) - (values #f #{marks 16887}#) - (let ((#{fst 16888}# (car #{subst 16886}#))) - (if (eq? #{fst 16888}# 'shift) - (#{search 16824}# - #{sym 16885}# - (cdr #{subst 16886}#) - (cdr #{marks 16887}#)) - (let ((#{symnames 16890}# (vector-ref #{fst 16888}# 1))) - (if (vector? #{symnames 16890}#) - (let ((#{n 16902}# (vector-length #{symnames 16890}#))) - (letrec* - ((#{f 16903}# - (lambda (#{i 16905}#) - (if (= #{i 16905}# #{n 16902}#) - (#{search 16824}# - #{sym 16885}# - (cdr #{subst 16886}#) - #{marks 16887}#) - (if (if (eq? (vector-ref - #{symnames 16890}# - #{i 16905}#) - #{sym 16885}#) - (#{same-marks? 4319}# - #{marks 16887}# - (vector-ref - (vector-ref #{fst 16888}# 2) - #{i 16905}#)) - #f) - (values - (vector-ref - (vector-ref #{fst 16888}# 3) - #{i 16905}#) - #{marks 16887}#) - (#{f 16903}# (#{1+}# #{i 16905}#))))))) - (#{f 16903}# 0))) - (letrec* - ((#{f 16938}# - (lambda (#{symnames 16940}# #{i 16941}#) - (if (null? #{symnames 16940}#) - (#{search 16824}# - #{sym 16885}# - (cdr #{subst 16886}#) - #{marks 16887}#) - (if (if (eq? (car #{symnames 16940}#) - #{sym 16885}#) - (#{same-marks? 4319}# - #{marks 16887}# - (list-ref - (vector-ref #{fst 16888}# 2) - #{i 16941}#)) - #f) - (values - (list-ref - (vector-ref #{fst 16888}# 3) - #{i 16941}#) - #{marks 16887}#) - (#{f 16938}# - (cdr #{symnames 16940}#) - (#{1+}# #{i 16941}#))))))) - (#{f 16938}# #{symnames 16890}# 0)))))))))) - (if (symbol? #{id 16822}#) - (let ((#{t 16827}# - (#{search 16824}# - #{id 16822}# - (cdr #{w 16823}#) - (car #{w 16823}#)))) - (if #{t 16827}# #{t 16827}# #{id 16822}#)) - (if (if (vector? #{id 16822}#) - (if (= (vector-length #{id 16822}#) 4) - (eq? (vector-ref #{id 16822}# 0) 'syntax-object) + ((#{search 35861}# + (lambda (#{sym 35927}# + #{subst 35928}# + #{marks 35929}# + #{mod 35930}#) + (if (null? #{subst 35928}#) + (values #f #{marks 35929}#) + (let ((#{fst 35931}# (car #{subst 35928}#))) + (if (eq? #{fst 35931}# 'shift) + (#{search 35861}# + #{sym 35927}# + (cdr #{subst 35928}#) + (cdr #{marks 35929}#) + #{mod 35930}#) + (let ((#{symnames 35933}# (vector-ref #{fst 35931}# 1))) + (if (vector? #{symnames 35933}#) + (#{search-vector-rib 35863}# + #{sym 35927}# + #{subst 35928}# + #{marks 35929}# + #{symnames 35933}# + #{fst 35931}# + #{mod 35930}#) + (#{search-list-rib 35862}# + #{sym 35927}# + #{subst 35928}# + #{marks 35929}# + #{symnames 35933}# + #{fst 35931}# + #{mod 35930}#)))))))) + (#{search-list-rib 35862}# + (lambda (#{sym 36108}# + #{subst 36109}# + #{marks 36110}# + #{symnames 36111}# + #{ribcage 36112}# + #{mod 36113}#) + (letrec* + ((#{f 36114}# + (lambda (#{symnames 36117}# #{i 36118}#) + (if (null? #{symnames 36117}#) + (#{search 35861}# + #{sym 36108}# + (cdr #{subst 36109}#) + #{marks 36110}# + #{mod 36113}#) + (if (if (eq? (car #{symnames 36117}#) #{sym 36108}#) + (#{same-marks? 4428}# + #{marks 36110}# + (list-ref + (vector-ref #{ribcage 36112}# 2) + #{i 36118}#)) + #f) + (let ((#{n 36264}# + (list-ref + (vector-ref #{ribcage 36112}# 3) + #{i 36118}#))) + (if (pair? #{n 36264}#) + (if (equal? #{mod 36113}# (car #{n 36264}#)) + (values (cdr #{n 36264}#) #{marks 36110}#) + (#{f 36114}# + (cdr #{symnames 36117}#) + (#{1+}# #{i 36118}#))) + (values #{n 36264}# #{marks 36110}#))) + (#{f 36114}# + (cdr #{symnames 36117}#) + (#{1+}# #{i 36118}#))))))) + (#{f 36114}# #{symnames 36111}# 0)))) + (#{search-vector-rib 35863}# + (lambda (#{sym 36269}# + #{subst 36270}# + #{marks 36271}# + #{symnames 36272}# + #{ribcage 36273}# + #{mod 36274}#) + (let ((#{n 36275}# (vector-length #{symnames 36272}#))) + (letrec* + ((#{f 36276}# + (lambda (#{i 36279}#) + (if (= #{i 36279}# #{n 36275}#) + (#{search 35861}# + #{sym 36269}# + (cdr #{subst 36270}#) + #{marks 36271}# + #{mod 36274}#) + (if (if (eq? (vector-ref + #{symnames 36272}# + #{i 36279}#) + #{sym 36269}#) + (#{same-marks? 4428}# + #{marks 36271}# + (vector-ref + (vector-ref #{ribcage 36273}# 2) + #{i 36279}#)) + #f) + (let ((#{n 36426}# + (vector-ref + (vector-ref #{ribcage 36273}# 3) + #{i 36279}#))) + (if (pair? #{n 36426}#) + (if (equal? #{mod 36274}# (car #{n 36426}#)) + (values (cdr #{n 36426}#) #{marks 36271}#) + (#{f 36276}# (#{1+}# #{i 36279}#))) + (values #{n 36426}# #{marks 36271}#))) + (#{f 36276}# (#{1+}# #{i 36279}#))))))) + (#{f 36276}# 0)))))) + (if (symbol? #{id 35858}#) + (let ((#{t 35864}# + (#{search 35861}# + #{id 35858}# + (cdr #{w 35859}#) + (car #{w 35859}#) + #{mod 35860}#))) + (if #{t 35864}# #{t 35864}# #{id 35858}#)) + (if (if (vector? #{id 35858}#) + (if (= (vector-length #{id 35858}#) 4) + (eq? (vector-ref #{id 35858}# 0) 'syntax-object) #f) #f) - (let ((#{id 16842}# (vector-ref #{id 16822}# 1)) - (#{w1 16843}# (vector-ref #{id 16822}# 2))) - (let ((#{marks 16844}# - (let ((#{m1 16854}# (car #{w 16823}#)) - (#{m2 16855}# (car #{w1 16843}#))) - (if (null? #{m2 16855}#) - #{m1 16854}# - (append #{m1 16854}# #{m2 16855}#))))) + (let ((#{id 35879}# (vector-ref #{id 35858}# 1)) + (#{w1 35880}# (vector-ref #{id 35858}# 2)) + (#{mod 35881}# (vector-ref #{id 35858}# 3))) + (let ((#{marks 35882}# + (let ((#{m1 35892}# (car #{w 35859}#)) + (#{m2 35893}# (car #{w1 35880}#))) + (if (null? #{m2 35893}#) + #{m1 35892}# + (append #{m1 35892}# #{m2 35893}#))))) (call-with-values (lambda () - (#{search 16824}# - #{id 16842}# - (cdr #{w 16823}#) - #{marks 16844}#)) - (lambda (#{new-id 16871}# #{marks 16872}#) - (if #{new-id 16871}# - #{new-id 16871}# - (let ((#{t 16880}# - (#{search 16824}# - #{id 16842}# - (cdr #{w1 16843}#) - #{marks 16872}#))) - (if #{t 16880}# #{t 16880}# #{id 16842}#))))))) + (#{search 35861}# + #{id 35879}# + (cdr #{w 35859}#) + #{marks 35882}# + #{mod 35881}#)) + (lambda (#{new-id 35913}# #{marks 35914}#) + (if #{new-id 35913}# + #{new-id 35913}# + (let ((#{t 35922}# + (#{search 35861}# + #{id 35879}# + (cdr #{w1 35880}#) + #{marks 35914}# + #{mod 35881}#))) + (if #{t 35922}# #{t 35922}# #{id 35879}#))))))) (syntax-violation 'id-var-name "invalid id" - #{id 16822}#)))))) - (#{valid-bound-ids? 4323}# - (lambda (#{ids 16963}#) + #{id 35858}#)))))) + (#{resolve-identifier 4430}# + (lambda (#{id 19315}# + #{w 19316}# + #{r 19317}# + #{mod 19318}# + #{resolve-syntax-parameters? 19319}#) + (let ((#{n 19323}# + (#{id-var-name 4429}# + #{id 19315}# + #{w 19316}# + #{mod 19318}#))) + (if (if (vector? #{n 19323}#) + (if (= (vector-length #{n 19323}#) 4) + (eq? (vector-ref #{n 19323}# 0) 'syntax-object) + #f) + #f) + (#{resolve-identifier 4430}# + #{n 19323}# + #{w 19316}# + #{r 19317}# + #{mod 19318}# + #{resolve-syntax-parameters? 19319}#) + (if (symbol? #{n 19323}#) + (let ((#{mod 19338}# + (if (if (vector? #{id 19315}#) + (if (= (vector-length #{id 19315}#) 4) + (eq? (vector-ref #{id 19315}# 0) 'syntax-object) + #f) + #f) + (vector-ref #{id 19315}# 3) + #{mod 19318}#))) + (let ((#{b 19339}# + (let ((#{b 19342}# + (let ((#{t 19343}# + (begin + (if (if (not #{mod 19338}#) + (current-module) + #f) + (warn "module system is booted, we should have a module" + #{n 19323}#)) + (let ((#{v 19392}# + (module-variable + (if #{mod 19338}# + (resolve-module + (cdr #{mod 19338}#)) + (current-module)) + #{n 19323}#))) + (if #{v 19392}# + (if (variable-bound? #{v 19392}#) + (let ((#{val 19401}# + (variable-ref + #{v 19392}#))) + (if (macro? #{val 19401}#) + (if (macro-type + #{val 19401}#) + (cons (macro-type + #{val 19401}#) + (macro-binding + #{val 19401}#)) + #f) + #f)) + #f) + #f))))) + (if #{t 19343}# #{t 19343}# '(global))))) + (if (if #{resolve-syntax-parameters? 19319}# + (eq? (car #{b 19342}#) 'syntax-parameter) + #f) + (let ((#{t 19410}# + (assq-ref #{r 19317}# (cdr #{b 19342}#)))) + (if #{t 19410}# + #{t 19410}# + (cons 'macro (car (cdr #{b 19342}#))))) + #{b 19342}#)))) + (if (eq? (car #{b 19339}#) 'global) + (values 'global #{n 19323}# #{mod 19338}#) + (values + (car #{b 19339}#) + (cdr #{b 19339}#) + #{mod 19338}#)))) + (if (string? #{n 19323}#) + (let ((#{mod 19416}# + (if (if (vector? #{id 19315}#) + (if (= (vector-length #{id 19315}#) 4) + (eq? (vector-ref #{id 19315}# 0) 'syntax-object) + #f) + #f) + (vector-ref #{id 19315}# 3) + #{mod 19318}#))) + (let ((#{b 19417}# + (let ((#{b 19420}# + (let ((#{t 19421}# + (assq-ref #{r 19317}# #{n 19323}#))) + (if #{t 19421}# + #{t 19421}# + '(displaced-lexical))))) + (if (if #{resolve-syntax-parameters? 19319}# + (eq? (car #{b 19420}#) 'syntax-parameter) + #f) + (let ((#{t 19422}# + (assq-ref #{r 19317}# (cdr #{b 19420}#)))) + (if #{t 19422}# + #{t 19422}# + (cons 'macro (car (cdr #{b 19420}#))))) + #{b 19420}#)))) + (values + (car #{b 19417}#) + (cdr #{b 19417}#) + #{mod 19416}#))) + (error "unexpected id-var-name" + #{id 19315}# + #{w 19316}# + #{n 19323}#))))))) + (#{free-id=? 4431}# + (lambda (#{i 19435}# #{j 19436}#) + (let ((#{mi 19437}# + (if (if (vector? #{i 19435}#) + (if (= (vector-length #{i 19435}#) 4) + (eq? (vector-ref #{i 19435}# 0) 'syntax-object) + #f) + #f) + (vector-ref #{i 19435}# 3) + #f))) + (let ((#{mj 19438}# + (if (if (vector? #{j 19436}#) + (if (= (vector-length #{j 19436}#) 4) + (eq? (vector-ref #{j 19436}# 0) 'syntax-object) + #f) + #f) + (vector-ref #{j 19436}# 3) + #f))) + (let ((#{ni 19439}# + (#{id-var-name 4429}# + #{i 19435}# + '(()) + #{mi 19437}#))) + (let ((#{nj 19440}# + (#{id-var-name 4429}# + #{j 19436}# + '(()) + #{mj 19438}#))) + (if (if (vector? #{ni 19439}#) + (if (= (vector-length #{ni 19439}#) 4) + (eq? (vector-ref #{ni 19439}# 0) 'syntax-object) + #f) + #f) + (#{free-id=? 4431}# #{ni 19439}# #{j 19436}#) + (if (if (vector? #{nj 19440}#) + (if (= (vector-length #{nj 19440}#) 4) + (eq? (vector-ref #{nj 19440}# 0) 'syntax-object) + #f) + #f) + (#{free-id=? 4431}# #{i 19435}# #{nj 19440}#) + (if (symbol? #{ni 19439}#) + (if (eq? #{nj 19440}# + (if (if (vector? #{j 19436}#) + (if (= (vector-length #{j 19436}#) 4) + (eq? (vector-ref #{j 19436}# 0) + 'syntax-object) + #f) + #f) + (vector-ref #{j 19436}# 1) + #{j 19436}#)) + (if (let ((#{bi 19512}# + (module-variable + (if #{mi 19437}# + (resolve-module (cdr #{mi 19437}#)) + (current-module)) + (if (if (vector? #{i 19435}#) + (if (= (vector-length #{i 19435}#) + 4) + (eq? (vector-ref #{i 19435}# 0) + 'syntax-object) + #f) + #f) + (vector-ref #{i 19435}# 1) + #{i 19435}#)))) + (if #{bi 19512}# + (eq? #{bi 19512}# + (module-variable + (if #{mj 19438}# + (resolve-module (cdr #{mj 19438}#)) + (current-module)) + (if (if (vector? #{j 19436}#) + (if (= (vector-length #{j 19436}#) + 4) + (eq? (vector-ref #{j 19436}# 0) + 'syntax-object) + #f) + #f) + (vector-ref #{j 19436}# 1) + #{j 19436}#))) + (if (not (module-variable + (if #{mj 19438}# + (resolve-module (cdr #{mj 19438}#)) + (current-module)) + (if (if (vector? #{j 19436}#) + (if (= (vector-length + #{j 19436}#) + 4) + (eq? (vector-ref + #{j 19436}# + 0) + 'syntax-object) + #f) + #f) + (vector-ref #{j 19436}# 1) + #{j 19436}#))) + (eq? #{ni 19439}# #{nj 19440}#) + #f))) + (eq? (module-variable + (if #{mi 19437}# + (resolve-module (cdr #{mi 19437}#)) + (current-module)) + (if (if (vector? #{i 19435}#) + (if (= (vector-length #{i 19435}#) 4) + (eq? (vector-ref #{i 19435}# 0) + 'syntax-object) + #f) + #f) + (vector-ref #{i 19435}# 1) + #{i 19435}#)) + (module-variable + (if #{mj 19438}# + (resolve-module (cdr #{mj 19438}#)) + (current-module)) + (if (if (vector? #{j 19436}#) + (if (= (vector-length #{j 19436}#) 4) + (eq? (vector-ref #{j 19436}# 0) + 'syntax-object) + #f) + #f) + (vector-ref #{j 19436}# 1) + #{j 19436}#))) + #f) + #f) + (equal? #{ni 19439}# #{nj 19440}#)))))))))) + (#{bound-id=? 4432}# + (lambda (#{i 19705}# #{j 19706}#) + (if (if (if (vector? #{i 19705}#) + (if (= (vector-length #{i 19705}#) 4) + (eq? (vector-ref #{i 19705}# 0) 'syntax-object) + #f) + #f) + (if (vector? #{j 19706}#) + (if (= (vector-length #{j 19706}#) 4) + (eq? (vector-ref #{j 19706}# 0) 'syntax-object) + #f) + #f) + #f) + (if (eq? (vector-ref #{i 19705}# 1) + (vector-ref #{j 19706}# 1)) + (#{same-marks? 4428}# + (car (vector-ref #{i 19705}# 2)) + (car (vector-ref #{j 19706}# 2))) + #f) + (eq? #{i 19705}# #{j 19706}#)))) + (#{valid-bound-ids? 4433}# + (lambda (#{ids 19875}#) (if (letrec* - ((#{all-ids? 16964}# - (lambda (#{ids 17126}#) - (if (null? #{ids 17126}#) - (null? #{ids 17126}#) - (if (let ((#{x 17137}# (car #{ids 17126}#))) - (if (symbol? #{x 17137}#) + ((#{all-ids? 19876}# + (lambda (#{ids 20073}#) + (if (null? #{ids 20073}#) + (null? #{ids 20073}#) + (if (let ((#{x 20084}# (car #{ids 20073}#))) + (if (symbol? #{x 20084}#) #t - (if (if (vector? #{x 17137}#) - (if (= (vector-length #{x 17137}#) 4) - (eq? (vector-ref #{x 17137}# 0) + (if (if (vector? #{x 20084}#) + (if (= (vector-length #{x 20084}#) 4) + (eq? (vector-ref #{x 20084}# 0) 'syntax-object) #f) #f) - (symbol? (vector-ref #{x 17137}# 1)) + (symbol? (vector-ref #{x 20084}# 1)) #f))) - (#{all-ids? 16964}# (cdr #{ids 17126}#)) + (#{all-ids? 19876}# (cdr #{ids 20073}#)) #f))))) - (#{all-ids? 16964}# #{ids 16963}#)) - (#{distinct-bound-ids? 4324}# #{ids 16963}#) + (#{all-ids? 19876}# #{ids 19875}#)) + (#{distinct-bound-ids? 4434}# #{ids 19875}#) #f))) - (#{distinct-bound-ids? 4324}# - (lambda (#{ids 17269}#) + (#{distinct-bound-ids? 4434}# + (lambda (#{ids 20205}#) (letrec* - ((#{distinct? 17270}# - (lambda (#{ids 17386}#) - (if (null? #{ids 17386}#) - (null? #{ids 17386}#) - (if (not (#{bound-id-member? 4325}# - (car #{ids 17386}#) - (cdr #{ids 17386}#))) - (#{distinct? 17270}# (cdr #{ids 17386}#)) + ((#{distinct? 20206}# + (lambda (#{ids 20311}#) + (if (null? #{ids 20311}#) + (null? #{ids 20311}#) + (if (not (#{bound-id-member? 4435}# + (car #{ids 20311}#) + (cdr #{ids 20311}#))) + (#{distinct? 20206}# (cdr #{ids 20311}#)) #f))))) - (#{distinct? 17270}# #{ids 17269}#)))) - (#{bound-id-member? 4325}# - (lambda (#{x 17606}# #{list 17607}#) - (if (not (null? #{list 17607}#)) - (let ((#{t 17608}# - (let ((#{j 17689}# (car #{list 17607}#))) - (if (if (if (vector? #{x 17606}#) - (if (= (vector-length #{x 17606}#) 4) - (eq? (vector-ref #{x 17606}# 0) 'syntax-object) - #f) - #f) - (if (vector? #{j 17689}#) - (if (= (vector-length #{j 17689}#) 4) - (eq? (vector-ref #{j 17689}# 0) 'syntax-object) - #f) - #f) - #f) - (if (eq? (vector-ref #{x 17606}# 1) - (vector-ref #{j 17689}# 1)) - (#{same-marks? 4319}# - (car (vector-ref #{x 17606}# 2)) - (car (vector-ref #{j 17689}# 2))) - #f) - (eq? #{x 17606}# #{j 17689}#))))) - (if #{t 17608}# - #{t 17608}# - (#{bound-id-member? 4325}# - #{x 17606}# - (cdr #{list 17607}#)))) + (#{distinct? 20206}# #{ids 20205}#)))) + (#{bound-id-member? 4435}# + (lambda (#{x 20407}# #{list 20408}#) + (if (not (null? #{list 20408}#)) + (let ((#{t 20409}# + (#{bound-id=? 4432}# + #{x 20407}# + (car #{list 20408}#)))) + (if #{t 20409}# + #{t 20409}# + (#{bound-id-member? 4435}# + #{x 20407}# + (cdr #{list 20408}#)))) #f))) - (#{wrap 4326}# - (lambda (#{x 17733}# #{w 17734}# #{defmod 17735}#) - (if (if (null? (car #{w 17734}#)) - (null? (cdr #{w 17734}#)) - #f) - #{x 17733}# - (if (if (vector? #{x 17733}#) - (if (= (vector-length #{x 17733}#) 4) - (eq? (vector-ref #{x 17733}# 0) 'syntax-object) - #f) + (#{source-wrap 4437}# + (lambda (#{x 20587}# + #{w 20588}# + #{s 20589}# + #{defmod 20590}#) + (let ((#{x 20594}# + (begin + (if (if (pair? #{x 20587}#) #{s 20589}# #f) + (set-source-properties! #{x 20587}# #{s 20589}#)) + #{x 20587}#))) + (if (if (null? (car #{w 20588}#)) + (null? (cdr #{w 20588}#)) #f) - (let ((#{expression 17749}# (vector-ref #{x 17733}# 1)) - (#{wrap 17750}# - (#{join-wraps 4317}# - #{w 17734}# - (vector-ref #{x 17733}# 2))) - (#{module 17751}# (vector-ref #{x 17733}# 3))) - (vector - 'syntax-object - #{expression 17749}# - #{wrap 17750}# - #{module 17751}#)) - (if (null? #{x 17733}#) - #{x 17733}# - (vector - 'syntax-object - #{x 17733}# - #{w 17734}# - #{defmod 17735}#)))))) - (#{source-wrap 4327}# - (lambda (#{x 17768}# - #{w 17769}# - #{s 17770}# - #{defmod 17771}#) - (#{wrap 4326}# - (begin - (if (if (pair? #{x 17768}#) #{s 17770}# #f) - (set-source-properties! #{x 17768}# #{s 17770}#)) - #{x 17768}#) - #{w 17769}# - #{defmod 17771}#))) - (#{expand-sequence 4328}# - (lambda (#{body 28606}# - #{r 28607}# - #{w 28608}# - #{s 28609}# - #{mod 28610}#) - (#{build-sequence 4282}# - #{s 28609}# + #{x 20594}# + (if (if (vector? #{x 20594}#) + (if (= (vector-length #{x 20594}#) 4) + (eq? (vector-ref #{x 20594}# 0) 'syntax-object) + #f) + #f) + (let ((#{expression 20626}# (vector-ref #{x 20594}# 1)) + (#{wrap 20627}# + (let ((#{w2 20635}# (vector-ref #{x 20594}# 2))) + (let ((#{m1 20636}# (car #{w 20588}#)) + (#{s1 20637}# (cdr #{w 20588}#))) + (if (null? #{m1 20636}#) + (if (null? #{s1 20637}#) + #{w2 20635}# + (cons (car #{w2 20635}#) + (let ((#{m2 20652}# (cdr #{w2 20635}#))) + (if (null? #{m2 20652}#) + #{s1 20637}# + (append #{s1 20637}# #{m2 20652}#))))) + (cons (let ((#{m2 20660}# (car #{w2 20635}#))) + (if (null? #{m2 20660}#) + #{m1 20636}# + (append #{m1 20636}# #{m2 20660}#))) + (let ((#{m2 20668}# (cdr #{w2 20635}#))) + (if (null? #{m2 20668}#) + #{s1 20637}# + (append #{s1 20637}# #{m2 20668}#)))))))) + (#{module 20628}# (vector-ref #{x 20594}# 3))) + (vector + 'syntax-object + #{expression 20626}# + #{wrap 20627}# + #{module 20628}#)) + (if (null? #{x 20594}#) + #{x 20594}# + (vector + 'syntax-object + #{x 20594}# + #{w 20588}# + #{defmod 20590}#))))))) + (#{expand-sequence 4438}# + (lambda (#{body 36431}# + #{r 36432}# + #{w 36433}# + #{s 36434}# + #{mod 36435}#) + (#{build-sequence 4392}# + #{s 36434}# (letrec* - ((#{dobody 28695}# - (lambda (#{body 28775}# - #{r 28776}# - #{w 28777}# - #{mod 28778}#) - (if (null? #{body 28775}#) + ((#{dobody 36527}# + (lambda (#{body 36614}# + #{r 36615}# + #{w 36616}# + #{mod 36617}#) + (if (null? #{body 36614}#) '() - (let ((#{first 28779}# - (#{expand 4333}# - (car #{body 28775}#) - #{r 28776}# - #{w 28777}# - #{mod 28778}#))) - (cons #{first 28779}# - (#{dobody 28695}# - (cdr #{body 28775}#) - #{r 28776}# - #{w 28777}# - #{mod 28778}#))))))) - (#{dobody 28695}# - #{body 28606}# - #{r 28607}# - #{w 28608}# - #{mod 28610}#))))) - (#{expand-top-sequence 4329}# - (lambda (#{body 17789}# - #{r 17790}# - #{w 17791}# - #{s 17792}# - #{m 17793}# - #{esew 17794}# - #{mod 17795}#) - (letrec* - ((#{scan 17796}# - (lambda (#{body 17927}# - #{r 17928}# - #{w 17929}# - #{s 17930}# - #{m 17931}# - #{esew 17932}# - #{mod 17933}# - #{exps 17934}#) - (if (null? #{body 17927}#) - #{exps 17934}# - (call-with-values - (lambda () + (let ((#{first 36618}# + (#{expand 4443}# + (car #{body 36614}#) + #{r 36615}# + #{w 36616}# + #{mod 36617}#))) + (cons #{first 36618}# + (#{dobody 36527}# + (cdr #{body 36614}#) + #{r 36615}# + #{w 36616}# + #{mod 36617}#))))))) + (#{dobody 36527}# + #{body 36431}# + #{r 36432}# + #{w 36433}# + #{mod 36435}#))))) + (#{expand-top-sequence 4439}# + (lambda (#{body 20683}# + #{r 20684}# + #{w 20685}# + #{s 20686}# + #{m 20687}# + #{esew 20688}# + #{mod 20689}#) + (let ((#{r 20690}# + (cons '("placeholder" placeholder) #{r 20684}#))) + (let ((#{ribcage 20691}# (vector 'ribcage '() '() '()))) + (let ((#{w 20692}# + (cons (car #{w 20685}#) + (cons #{ribcage 20691}# (cdr #{w 20685}#))))) + (letrec* + ((#{record-definition! 20693}# + (lambda (#{id 24185}# #{var 24186}#) + (let ((#{mod 24187}# + (cons 'hygiene (module-name (current-module))))) + (let ((#{label 24193}# + (cons (vector-ref #{id 24185}# 3) + (if (if (vector? #{var 24186}#) + (if (= (vector-length #{var 24186}#) + 4) + (eq? (vector-ref #{var 24186}# 0) + 'syntax-object) + #f) + #f) + (let ((#{expression 24255}# + (vector-ref #{var 24186}# 1)) + (#{wrap 24256}# + (let ((#{w2 24266}# + (vector-ref + #{var 24186}# + 2))) + (cons (let ((#{m2 24273}# + (car #{w2 24266}#))) + (if (null? #{m2 24273}#) + '(top) + (append + '(top) + #{m2 24273}#))) + (let ((#{m2 24282}# + (cdr #{w2 24266}#))) + (if (null? #{m2 24282}#) + '() + (append + '() + #{m2 24282}#)))))) + (#{module 24257}# + (vector-ref #{var 24186}# 3))) + (vector + 'syntax-object + #{expression 24255}# + #{wrap 24256}# + #{module 24257}#)) + (if (null? #{var 24186}#) + #{var 24186}# + (vector + 'syntax-object + #{var 24186}# + '((top)) + #{mod 24187}#)))))) + (begin + (let ((#{update 24196}# + (cons (vector-ref #{id 24185}# 1) + (vector-ref #{ribcage 20691}# 1)))) + (vector-set! + #{ribcage 20691}# + 1 + #{update 24196}#)) + (let ((#{update 24211}# + (cons (car (vector-ref #{id 24185}# 2)) + (vector-ref #{ribcage 20691}# 2)))) + (vector-set! + #{ribcage 20691}# + 2 + #{update 24211}#)) + (let ((#{update 24226}# + (cons #{label 24193}# + (vector-ref #{ribcage 20691}# 3)))) + (vector-set! + #{ribcage 20691}# + 3 + #{update 24226}#))))))) + (#{parse 20696}# + (lambda (#{body 20901}# + #{r 20902}# + #{w 20903}# + #{s 20904}# + #{m 20905}# + #{esew 20906}# + #{mod 20907}#) + (letrec* + ((#{lp 20908}# + (lambda (#{body 20995}# #{exps 20996}#) + (if (null? #{body 20995}#) + #{exps 20996}# + (#{lp 20908}# + (cdr #{body 20995}#) + (append + (#{parse1 20697}# + (car #{body 20995}#) + #{r 20902}# + #{w 20903}# + #{s 20904}# + #{m 20905}# + #{esew 20906}# + #{mod 20907}#) + #{exps 20996}#)))))) + (#{lp 20908}# #{body 20901}# '())))) + (#{parse1 20697}# + (lambda (#{x 21070}# + #{r 21071}# + #{w 21072}# + #{s 21073}# + #{m 21074}# + #{esew 21075}# + #{mod 21076}#) (call-with-values (lambda () - (let ((#{e 17935}# (car #{body 17927}#))) - (#{syntax-type 4332}# - #{e 17935}# - #{r 17928}# - #{w 17929}# - (let ((#{t 17939}# - (#{source-annotation 4294}# #{e 17935}#))) - (if #{t 17939}# #{t 17939}# #{s 17930}#)) - #f - #{mod 17933}# - #f))) - (lambda (#{type 18199}# - #{value 18200}# - #{e 18201}# - #{w 18202}# - #{s 18203}# - #{mod 18204}#) - (if (eqv? #{type 18199}# 'begin-form) - (let ((#{tmp 18209}# - ($sc-dispatch #{e 18201}# '(_)))) - (if #{tmp 18209}# - (@apply (lambda () #{exps 17934}#) #{tmp 18209}#) - (let ((#{tmp 18213}# + (#{syntax-type 4442}# + #{x 21070}# + #{r 21071}# + #{w 21072}# + (#{source-annotation 4404}# #{x 21070}#) + #{ribcage 20691}# + #{mod 21076}# + #f)) + (lambda (#{type 21280}# + #{value 21281}# + #{e 21282}# + #{w 21283}# + #{s 21284}# + #{mod 21285}#) + (if (eqv? #{type 21280}# 'define-form) + (let ((#{id 21289}# + (if (if (null? (car #{w 21283}#)) + (null? (cdr #{w 21283}#)) + #f) + #{value 21281}# + (if (if (vector? #{value 21281}#) + (if (= (vector-length + #{value 21281}#) + 4) + (eq? (vector-ref #{value 21281}# 0) + 'syntax-object) + #f) + #f) + (let ((#{expression 21339}# + (vector-ref #{value 21281}# 1)) + (#{wrap 21340}# + (let ((#{w2 21350}# + (vector-ref + #{value 21281}# + 2))) + (let ((#{m1 21351}# + (car #{w 21283}#)) + (#{s1 21352}# + (cdr #{w 21283}#))) + (if (null? #{m1 21351}#) + (if (null? #{s1 21352}#) + #{w2 21350}# + (cons (car #{w2 21350}#) + (let ((#{m2 21369}# + (cdr #{w2 21350}#))) + (if (null? #{m2 21369}#) + #{s1 21352}# + (append + #{s1 21352}# + #{m2 21369}#))))) + (cons (let ((#{m2 21377}# + (car #{w2 21350}#))) + (if (null? #{m2 21377}#) + #{m1 21351}# + (append + #{m1 21351}# + #{m2 21377}#))) + (let ((#{m2 21385}# + (cdr #{w2 21350}#))) + (if (null? #{m2 21385}#) + #{s1 21352}# + (append + #{s1 21352}# + #{m2 21385}#)))))))) + (#{module 21341}# + (vector-ref #{value 21281}# 3))) + (vector + 'syntax-object + #{expression 21339}# + #{wrap 21340}# + #{module 21341}#)) + (if (null? #{value 21281}#) + #{value 21281}# + (vector + 'syntax-object + #{value 21281}# + #{w 21283}# + #{mod 21285}#)))))) + (begin + (symbol->string (gensym "i")) + (let ((#{var 21291}# + (if (not (equal? + (car (vector-ref + #{id 21289}# + 2)) + '(top))) + (symbol-append + (vector-ref #{id 21289}# 1) + '- + (string->symbol + (number->string + (hash (syntax->datum #{x 21070}#) + most-positive-fixnum) + 16))) + (vector-ref #{id 21289}# 1)))) + (begin + (#{record-definition! 20693}# + #{id 21289}# + #{var 21291}#) + (list (if (eq? #{m 21074}# 'c&e) + (let ((#{x 21516}# + (#{build-global-definition 4385}# + #{s 21284}# + #{var 21291}# + (#{expand 4443}# + #{e 21282}# + #{r 21071}# + #{w 21283}# + #{mod 21285}#)))) + (begin + (#{top-level-eval-hook 4370}# + #{x 21516}# + #{mod 21285}#) + (lambda () #{x 21516}#))) + (lambda () + (#{build-global-definition 4385}# + #{s 21284}# + #{var 21291}# + (#{expand 4443}# + #{e 21282}# + #{r 21071}# + #{w 21283}# + #{mod 21285}#))))))))) + (if (if (eqv? #{type 21280}# 'define-syntax-form) + #t + (eqv? #{type 21280}# + 'define-syntax-parameter-form)) + (let ((#{id 22032}# + (if (if (null? (car #{w 21283}#)) + (null? (cdr #{w 21283}#)) + #f) + #{value 21281}# + (if (if (vector? #{value 21281}#) + (if (= (vector-length + #{value 21281}#) + 4) + (eq? (vector-ref + #{value 21281}# + 0) + 'syntax-object) + #f) + #f) + (let ((#{expression 22082}# + (vector-ref #{value 21281}# 1)) + (#{wrap 22083}# + (let ((#{w2 22093}# + (vector-ref + #{value 21281}# + 2))) + (let ((#{m1 22094}# + (car #{w 21283}#)) + (#{s1 22095}# + (cdr #{w 21283}#))) + (if (null? #{m1 22094}#) + (if (null? #{s1 22095}#) + #{w2 22093}# + (cons (car #{w2 22093}#) + (let ((#{m2 22112}# + (cdr #{w2 22093}#))) + (if (null? #{m2 22112}#) + #{s1 22095}# + (append + #{s1 22095}# + #{m2 22112}#))))) + (cons (let ((#{m2 22120}# + (car #{w2 22093}#))) + (if (null? #{m2 22120}#) + #{m1 22094}# + (append + #{m1 22094}# + #{m2 22120}#))) + (let ((#{m2 22128}# + (cdr #{w2 22093}#))) + (if (null? #{m2 22128}#) + #{s1 22095}# + (append + #{s1 22095}# + #{m2 22128}#)))))))) + (#{module 22084}# + (vector-ref + #{value 21281}# + 3))) + (vector + 'syntax-object + #{expression 22082}# + #{wrap 22083}# + #{module 22084}#)) + (if (null? #{value 21281}#) + #{value 21281}# + (vector + 'syntax-object + #{value 21281}# + #{w 21283}# + #{mod 21285}#)))))) + (begin + (symbol->string (gensym "i")) + (let ((#{var 22034}# + (if (not (equal? + (car (vector-ref + #{id 22032}# + 2)) + '(top))) + (symbol-append + (vector-ref #{id 22032}# 1) + '- + (string->symbol + (number->string + (hash (syntax->datum + #{x 21070}#) + most-positive-fixnum) + 16))) + (vector-ref #{id 22032}# 1)))) + (begin + (#{record-definition! 20693}# + #{id 22032}# + #{var 22034}#) + (if (eqv? #{m 21074}# 'c) + (if (memq 'compile #{esew 21075}#) + (let ((#{e 22262}# + (#{expand-install-global 4440}# + #{var 22034}# + #{type 21280}# + (#{expand 4443}# + #{e 21282}# + #{r 21071}# + #{w 21283}# + #{mod 21285}#)))) + (begin + (#{top-level-eval-hook 4370}# + #{e 22262}# + #{mod 21285}#) + (if (memq 'load #{esew 21075}#) + (list (lambda () #{e 22262}#)) + '()))) + (if (memq 'load #{esew 21075}#) + (list (lambda () + (#{expand-install-global 4440}# + #{var 22034}# + #{type 21280}# + (#{expand 4443}# + #{e 21282}# + #{r 21071}# + #{w 21283}# + #{mod 21285}#)))) + '())) + (if (eqv? #{m 21074}# 'c&e) + (let ((#{e 22782}# + (#{expand-install-global 4440}# + #{var 22034}# + #{type 21280}# + (#{expand 4443}# + #{e 21282}# + #{r 21071}# + #{w 21283}# + #{mod 21285}#)))) + (begin + (#{top-level-eval-hook 4370}# + #{e 22782}# + #{mod 21285}#) + (list (lambda () #{e 22782}#)))) + (begin + (if (memq 'eval #{esew 21075}#) + (#{top-level-eval-hook 4370}# + (#{expand-install-global 4440}# + #{var 22034}# + #{type 21280}# + (#{expand 4443}# + #{e 21282}# + #{r 21071}# + #{w 21283}# + #{mod 21285}#)) + #{mod 21285}#)) + '()))))))) + (if (eqv? #{type 21280}# 'begin-form) + (let ((#{tmp 23411}# ($sc-dispatch - #{e 18201}# - '(_ any . each-any)))) - (if #{tmp 18213}# + #{e 21282}# + '(_ . each-any)))) + (if #{tmp 23411}# (@apply - (lambda (#{e1 18217}# #{e2 18218}#) - (#{scan 17796}# - (cons #{e1 18217}# #{e2 18218}#) - #{r 17928}# - #{w 18202}# - #{s 18203}# - #{m 17931}# - #{esew 17932}# - #{mod 18204}# - #{exps 17934}#)) - #{tmp 18213}#) + (lambda (#{e1 23415}#) + (#{parse 20696}# + #{e1 23415}# + #{r 21071}# + #{w 21283}# + #{s 21284}# + #{m 21074}# + #{esew 21075}# + #{mod 21285}#)) + #{tmp 23411}#) (syntax-violation #f "source expression failed to match any pattern" - #{e 18201}#))))) - (if (eqv? #{type 18199}# 'local-syntax-form) - (#{expand-local-syntax 4338}# - #{value 18200}# - #{e 18201}# - #{r 17928}# - #{w 18202}# - #{s 18203}# - #{mod 18204}# - (lambda (#{body 18233}# - #{r 18234}# - #{w 18235}# - #{s 18236}# - #{mod 18237}#) - (#{scan 17796}# - #{body 18233}# - #{r 18234}# - #{w 18235}# - #{s 18236}# - #{m 17931}# - #{esew 17932}# - #{mod 18237}# - #{exps 17934}#))) - (if (eqv? #{type 18199}# 'eval-when-form) - (let ((#{tmp 18242}# - ($sc-dispatch - #{e 18201}# - '(_ each-any any . each-any)))) - (if #{tmp 18242}# - (@apply - (lambda (#{x 18246}# - #{e1 18247}# - #{e2 18248}#) - (let ((#{when-list 18249}# - (#{parse-when-list 4331}# - #{e 18201}# - #{x 18246}#)) - (#{body 18250}# - (cons #{e1 18247}# - #{e2 18248}#))) - (if (eq? #{m 17931}# 'e) - (if (memq 'eval #{when-list 18249}#) - (#{scan 17796}# - #{body 18250}# - #{r 17928}# - #{w 18202}# - #{s 18203}# - (if (memq 'expand - #{when-list 18249}#) - 'c&e - 'e) - '(eval) - #{mod 18204}# - #{exps 17934}#) + #{e 21282}#))) + (if (eqv? #{type 21280}# 'local-syntax-form) + (#{expand-local-syntax 4448}# + #{value 21281}# + #{e 21282}# + #{r 21071}# + #{w 21283}# + #{s 21284}# + #{mod 21285}# + (lambda (#{forms 23461}# + #{r 23462}# + #{w 23463}# + #{s 23464}# + #{mod 23465}#) + (#{parse 20696}# + #{forms 23461}# + #{r 23462}# + #{w 23463}# + #{s 23464}# + #{m 21074}# + #{esew 21075}# + #{mod 23465}#))) + (if (eqv? #{type 21280}# 'eval-when-form) + (let ((#{tmp 23504}# + ($sc-dispatch + #{e 21282}# + '(_ each-any any . each-any)))) + (if #{tmp 23504}# + (@apply + (lambda (#{x 23508}# + #{e1 23509}# + #{e2 23510}#) + (let ((#{when-list 23511}# + (#{parse-when-list 4441}# + #{e 21282}# + #{x 23508}#)) + (#{body 23512}# + (cons #{e1 23509}# + #{e2 23510}#))) + (letrec* + ((#{recurse 23513}# + (lambda (#{m 24102}# + #{esew 24103}#) + (#{parse 20696}# + #{body 23512}# + #{r 21071}# + #{w 21283}# + #{s 21284}# + #{m 24102}# + #{esew 24103}# + #{mod 21285}#)))) + (if (eq? #{m 21074}# 'e) + (if (memq 'eval + #{when-list 23511}#) + (#{recurse 23513}# + (if (memq 'expand + #{when-list 23511}#) + 'c&e + 'e) + '(eval)) + (begin + (if (memq 'expand + #{when-list 23511}#) + (let ((#{x 23621}# + (#{expand-top-sequence 4439}# + #{body 23512}# + #{r 21071}# + #{w 21283}# + #{s 21284}# + 'e + '(eval) + #{mod 21285}#))) + (primitive-eval + #{x 23621}#))) + '())) + (if (memq 'load + #{when-list 23511}#) + (if (let ((#{t 23649}# + (memq 'compile + #{when-list 23511}#))) + (if #{t 23649}# + #{t 23649}# + (let ((#{t 23702}# + (memq 'expand + #{when-list 23511}#))) + (if #{t 23702}# + #{t 23702}# + (if (eq? #{m 21074}# + 'c&e) + (memq 'eval + #{when-list 23511}#) + #f))))) + (#{recurse 23513}# + 'c&e + '(compile load)) + (if (if (eq? #{m 21074}# + 'c) + #t + (eq? #{m 21074}# + 'c&e)) + (#{recurse 23513}# + 'c + '(load)) + '())) + (if (let ((#{t 23913}# + (memq 'compile + #{when-list 23511}#))) + (if #{t 23913}# + #{t 23913}# + (let ((#{t 23966}# + (memq 'expand + #{when-list 23511}#))) + (if #{t 23966}# + #{t 23966}# + (if (eq? #{m 21074}# + 'c&e) + (memq 'eval + #{when-list 23511}#) + #f))))) + (begin + (let ((#{x 24100}# + (#{expand-top-sequence 4439}# + #{body 23512}# + #{r 21071}# + #{w 21283}# + #{s 21284}# + 'e + '(eval) + #{mod 21285}#))) + (primitive-eval + #{x 24100}#)) + '()) + '())))))) + #{tmp 23504}#) + (syntax-violation + #f + "source expression failed to match any pattern" + #{e 21282}#))) + (list (if (eq? #{m 21074}# 'c&e) + (let ((#{x 24176}# + (#{expand-expr 4444}# + #{type 21280}# + #{value 21281}# + #{e 21282}# + #{r 21071}# + #{w 21283}# + #{s 21284}# + #{mod 21285}#))) (begin - (if (memq 'expand - #{when-list 18249}#) - (let ((#{x 18327}# - (#{expand-top-sequence 4329}# - #{body 18250}# - #{r 17928}# - #{w 18202}# - #{s 18203}# - 'e - '(eval) - #{mod 18204}#))) - (primitive-eval - #{x 18327}#))) - (values #{exps 17934}#))) - (if (memq 'load #{when-list 18249}#) - (if (let ((#{t 18353}# - (memq 'compile - #{when-list 18249}#))) - (if #{t 18353}# - #{t 18353}# - (let ((#{t 18402}# - (memq 'expand - #{when-list 18249}#))) - (if #{t 18402}# - #{t 18402}# - (if (eq? #{m 17931}# - 'c&e) - (memq 'eval - #{when-list 18249}#) - #f))))) - (#{scan 17796}# - #{body 18250}# - #{r 17928}# - #{w 18202}# - #{s 18203}# - 'c&e - '(compile load) - #{mod 18204}# - #{exps 17934}#) - (if (if (eq? #{m 17931}# 'c) - #t - (eq? #{m 17931}# 'c&e)) - (#{scan 17796}# - #{body 18250}# - #{r 17928}# - #{w 18202}# - #{s 18203}# - 'c - '(load) - #{mod 18204}# - #{exps 17934}#) - (values #{exps 17934}#))) - (if (let ((#{t 18531}# - (memq 'compile - #{when-list 18249}#))) - (if #{t 18531}# - #{t 18531}# - (let ((#{t 18580}# - (memq 'expand - #{when-list 18249}#))) - (if #{t 18580}# - #{t 18580}# - (if (eq? #{m 17931}# - 'c&e) - (memq 'eval - #{when-list 18249}#) - #f))))) - (begin - (let ((#{x 18704}# - (#{expand-top-sequence 4329}# - #{body 18250}# - #{r 17928}# - #{w 18202}# - #{s 18203}# - 'e - '(eval) - #{mod 18204}#))) - (primitive-eval #{x 18704}#)) - (values #{exps 17934}#)) - (values #{exps 17934}#)))))) - #{tmp 18242}#) - (syntax-violation - #f - "source expression failed to match any pattern" - #{e 18201}#))) - (if (eqv? #{type 18199}# 'define-syntax-form) - (let ((#{n 18745}# - (#{id-var-name 4320}# - #{value 18200}# - #{w 18202}#)) - (#{r 18746}# - (#{macros-only-env 4297}# - #{r 17928}#))) - (if (eqv? #{m 17931}# 'c) - (if (memq 'compile #{esew 17932}#) - (let ((#{e 18750}# - (#{expand-install-global 4330}# - #{n 18745}# - (#{expand 4333}# - #{e 18201}# - #{r 18746}# - #{w 18202}# - #{mod 18204}#)))) - (begin - (#{top-level-eval-hook 4261}# - #{e 18750}# - #{mod 18204}#) - (if (memq 'load #{esew 17932}#) - (values - (cons #{e 18750}# - #{exps 17934}#)) - (values #{exps 17934}#)))) - (if (memq 'load #{esew 17932}#) - (values - (cons (#{expand-install-global 4330}# - #{n 18745}# - (#{expand 4333}# - #{e 18201}# - #{r 18746}# - #{w 18202}# - #{mod 18204}#)) - #{exps 17934}#)) - (values #{exps 17934}#))) - (if (eqv? #{m 17931}# 'c&e) - (let ((#{e 19207}# - (#{expand-install-global 4330}# - #{n 18745}# - (#{expand 4333}# - #{e 18201}# - #{r 18746}# - #{w 18202}# - #{mod 18204}#)))) - (begin - (#{top-level-eval-hook 4261}# - #{e 19207}# - #{mod 18204}#) - (values - (cons #{e 19207}# - #{exps 17934}#)))) - (begin - (if (memq 'eval #{esew 17932}#) - (#{top-level-eval-hook 4261}# - (#{expand-install-global 4330}# - #{n 18745}# - (#{expand 4333}# - #{e 18201}# - #{r 18746}# - #{w 18202}# - #{mod 18204}#)) - #{mod 18204}#)) - (values #{exps 17934}#))))) - (if (eqv? #{type 18199}# 'define-form) - (let ((#{n 19857}# - (#{id-var-name 4320}# - #{value 18200}# - #{w 18202}#))) - (let ((#{type 19858}# - (car (let ((#{t 20627}# - (assq #{n 19857}# - #{r 17928}#))) - (if #{t 20627}# - (cdr #{t 20627}#) - (if (symbol? #{n 19857}#) - (let ((#{t 20632}# - (begin - (if (if (not #{mod 18204}#) - (current-module) - #f) - (warn "module system is booted, we should have a module" - #{n 19857}#)) - (let ((#{v 20669}# - (module-variable - (if #{mod 18204}# - (resolve-module - (cdr #{mod 18204}#)) - (current-module)) - #{n 19857}#))) - (if #{v 20669}# - (if (variable-bound? - #{v 20669}#) - (let ((#{val 20678}# - (variable-ref - #{v 20669}#))) - (if (macro? - #{val 20678}#) - (if (macro-type - #{val 20678}#) - (cons (macro-type - #{val 20678}#) - (macro-binding - #{val 20678}#)) - #f) - #f)) - #f) - #f))))) - (if #{t 20632}# - #{t 20632}# - '(global))) - '(displaced-lexical))))))) - (if (let ((#{t 19892}# #{type 19858}#)) - (if (eqv? #{t 19892}# 'global) - #t - (if (eqv? #{t 19892}# 'core) - #t - (if (eqv? #{t 19892}# 'macro) - #t - (eqv? #{t 19892}# - 'module-ref))))) - (begin - (if (if (if (eq? #{m 17931}# 'c) - #t - (eq? #{m 17931}# 'c&e)) - (if (not (module-local-variable - (current-module) - #{n 19857}#)) - (current-module) - #f) - #f) - (let ((#{old 20056}# - (module-variable - (current-module) - #{n 19857}#))) - (if (if (variable? #{old 20056}#) - (variable-bound? - #{old 20056}#) - #f) - (module-define! - (current-module) - #{n 19857}# - (variable-ref #{old 20056}#)) - (module-add! - (current-module) - #{n 19857}# - (make-undefined-variable))))) - (values - (cons (if (eq? #{m 17931}# 'c&e) - (let ((#{x 20058}# - (#{build-global-definition 4276}# - #{s 18203}# - #{n 19857}# - (#{expand 4333}# - #{e 18201}# - #{r 17928}# - #{w 18202}# - #{mod 18204}#)))) - (begin - (#{top-level-eval-hook 4261}# - #{x 20058}# - #{mod 18204}#) - #{x 20058}#)) - (lambda () - (#{build-global-definition 4276}# - #{s 18203}# - #{n 19857}# - (#{expand 4333}# - #{e 18201}# - #{r 17928}# - #{w 18202}# - #{mod 18204}#)))) - #{exps 17934}#))) - (if (let ((#{t 20554}# #{type 19858}#)) - (eqv? #{t 20554}# - 'displaced-lexical)) - (syntax-violation - #f - "identifier out of context" - #{e 18201}# - (#{wrap 4326}# - #{value 18200}# - #{w 18202}# - #{mod 18204}#)) - (syntax-violation - #f - "cannot define keyword at top level" - #{e 18201}# - (#{wrap 4326}# - #{value 18200}# - #{w 18202}# - #{mod 18204}#)))))) - (values - (cons (if (eq? #{m 17931}# 'c&e) - (let ((#{x 20689}# - (#{expand-expr 4334}# - #{type 18199}# - #{value 18200}# - #{e 18201}# - #{r 17928}# - #{w 18202}# - #{s 18203}# - #{mod 18204}#))) - (begin - (primitive-eval #{x 20689}#) - #{x 20689}#)) - (lambda () - (#{expand-expr 4334}# - #{type 18199}# - #{value 18200}# - #{e 18201}# - #{r 17928}# - #{w 18202}# - #{s 18203}# - #{mod 18204}#))) - #{exps 17934}#)))))))))) - (lambda (#{exps 20698}#) - (#{scan 17796}# - (cdr #{body 17927}#) - #{r 17928}# - #{w 17929}# - #{s 17930}# - #{m 17931}# - #{esew 17932}# - #{mod 17933}# - #{exps 20698}#))))))) - (call-with-values - (lambda () - (#{scan 17796}# - #{body 17789}# - #{r 17790}# - #{w 17791}# - #{s 17792}# - #{m 17793}# - #{esew 17794}# - #{mod 17795}# - '())) - (lambda (#{exps 17799}#) - (if (null? #{exps 17799}#) - (make-struct/no-tail - (vector-ref %expanded-vtables 0) - #{s 17792}#) - (#{build-sequence 4282}# - #{s 17792}# - (letrec* - ((#{lp 17839}# - (lambda (#{in 17923}# #{out 17924}#) - (if (null? #{in 17923}#) - #{out 17924}# - (let ((#{e 17925}# (car #{in 17923}#))) - (#{lp 17839}# - (cdr #{in 17923}#) - (cons (if (procedure? #{e 17925}#) - (#{e 17925}#) - #{e 17925}#) - #{out 17924}#))))))) - (#{lp 17839}# #{exps 17799}# '()))))))))) - (#{expand-install-global 4330}# - (lambda (#{name 20699}# #{e 20700}#) - (let ((#{exp 20706}# - (let ((#{fun-exp 20716}# - (if (equal? (module-name (current-module)) '(guile)) - (make-struct/no-tail - (vector-ref %expanded-vtables 7) - #f - 'make-syntax-transformer) - (make-struct/no-tail - (vector-ref %expanded-vtables 5) - #f - '(guile) - 'make-syntax-transformer - #f))) - (#{arg-exps 20717}# - (list (make-struct/no-tail - (vector-ref %expanded-vtables 1) - #f - #{name 20699}#) - (make-struct/no-tail - (vector-ref %expanded-vtables 1) - #f - 'macro) - #{e 20700}#))) + (primitive-eval #{x 24176}#) + (lambda () #{x 24176}#))) + (lambda () + (#{expand-expr 4444}# + #{type 21280}# + #{value 21281}# + #{e 21282}# + #{r 21071}# + #{w 21283}# + #{s 21284}# + #{mod 21285}#)))))))))))))) + (let ((#{exps 20698}# + (map (lambda (#{x 20829}#) (#{x 20829}#)) + (reverse + (#{parse 20696}# + #{body 20683}# + #{r 20690}# + #{w 20692}# + #{s 20686}# + #{m 20687}# + #{esew 20688}# + #{mod 20689}#))))) + (if (null? #{exps 20698}#) + (make-struct/no-tail + (vector-ref %expanded-vtables 0) + #{s 20686}#) + (#{build-sequence 4392}# + #{s 20686}# + #{exps 20698}#))))))))) + (#{expand-install-global 4440}# + (lambda (#{name 24304}# #{type 24305}# #{e 24306}#) + (let ((#{exp 24312}# + (let ((#{args 24323}# + (if (eq? #{type 24305}# + 'define-syntax-parameter-form) + (list (make-struct/no-tail + (vector-ref %expanded-vtables 1) + #f + #{name 24304}#) + (make-struct/no-tail + (vector-ref %expanded-vtables 1) + #f + 'syntax-parameter) + (let ((#{args 24346}# (list #{e 24306}#))) + (make-struct/no-tail + (vector-ref %expanded-vtables 12) + #f + 'list + #{args 24346}#))) + (list (make-struct/no-tail + (vector-ref %expanded-vtables 1) + #f + #{name 24304}#) + (make-struct/no-tail + (vector-ref %expanded-vtables 1) + #f + 'macro) + #{e 24306}#)))) (make-struct/no-tail - (vector-ref %expanded-vtables 11) + (vector-ref %expanded-vtables 12) #f - #{fun-exp 20716}# - #{arg-exps 20717}#)))) + 'make-syntax-transformer + #{args 24323}#)))) (begin - (if (if (struct? #{exp 20706}#) - (eq? (struct-vtable #{exp 20706}#) - (vector-ref %expanded-vtables 13)) + (if (if (struct? #{exp 24312}#) + (eq? (struct-vtable #{exp 24312}#) + (vector-ref %expanded-vtables 14)) #f) - (let ((#{meta 20758}# (struct-ref #{exp 20706}# 1))) - (if (not (assq 'name #{meta 20758}#)) - (let ((#{v 20765}# - (cons (cons 'name #{name 20699}#) #{meta 20758}#))) - (struct-set! #{exp 20706}# 1 #{v 20765}#))))) + (let ((#{meta 24373}# (struct-ref #{exp 24312}# 1))) + (if (not (assq 'name #{meta 24373}#)) + (let ((#{v 24380}# + (cons (cons 'name #{name 24304}#) #{meta 24373}#))) + (struct-set! #{exp 24312}# 1 #{v 24380}#))))) (make-struct/no-tail (vector-ref %expanded-vtables 9) #f - #{name 20699}# - #{exp 20706}#))))) - (#{parse-when-list 4331}# - (lambda (#{e 20776}# #{when-list 20777}#) - (let ((#{result 20778}# - (#{strip 4346}# #{when-list 20777}# '(())))) + #{name 24304}# + #{exp 24312}#))))) + (#{parse-when-list 4441}# + (lambda (#{e 24391}# #{when-list 24392}#) + (let ((#{result 24393}# + (#{strip 4456}# #{when-list 24392}# '(())))) (letrec* - ((#{lp 20779}# - (lambda (#{l 20833}#) - (if (null? #{l 20833}#) - #{result 20778}# - (if (let ((#{t 20835}# (car #{l 20833}#))) - (if (eq? #{t 20835}# 'compile) + ((#{lp 24394}# + (lambda (#{l 24460}#) + (if (null? #{l 24460}#) + #{result 24393}# + (if (let ((#{t 24462}# (car #{l 24460}#))) + (if (eq? #{t 24462}# 'compile) #t - (if (eq? #{t 20835}# 'load) + (if (eq? #{t 24462}# 'load) #t - (if (eq? #{t 20835}# 'eval) + (if (eq? #{t 24462}# 'eval) #t - (eq? #{t 20835}# 'expand))))) - (#{lp 20779}# (cdr #{l 20833}#)) + (eq? #{t 24462}# 'expand))))) + (#{lp 24394}# (cdr #{l 24460}#)) (syntax-violation 'eval-when "invalid situation" - #{e 20776}# - (car #{l 20833}#))))))) - (#{lp 20779}# #{result 20778}#))))) - (#{syntax-type 4332}# - (lambda (#{e 20837}# - #{r 20838}# - #{w 20839}# - #{s 20840}# - #{rib 20841}# - #{mod 20842}# - #{for-car? 20843}#) - (if (symbol? #{e 20837}#) - (let ((#{n 20844}# - (#{id-var-name 4320}# #{e 20837}# #{w 20839}#))) - (let ((#{b 20845}# - (let ((#{t 21420}# (assq #{n 20844}# #{r 20838}#))) - (if #{t 21420}# - (cdr #{t 21420}#) - (if (symbol? #{n 20844}#) - (let ((#{t 21425}# - (begin - (if (if (not #{mod 20842}#) - (current-module) - #f) - (warn "module system is booted, we should have a module" - #{n 20844}#)) - (let ((#{v 21462}# - (module-variable - (if #{mod 20842}# - (resolve-module - (cdr #{mod 20842}#)) - (current-module)) - #{n 20844}#))) - (if #{v 21462}# - (if (variable-bound? #{v 21462}#) - (let ((#{val 21471}# - (variable-ref #{v 21462}#))) - (if (macro? #{val 21471}#) - (if (macro-type #{val 21471}#) - (cons (macro-type #{val 21471}#) - (macro-binding - #{val 21471}#)) - #f) - #f)) - #f) - #f))))) - (if #{t 21425}# #{t 21425}# '(global))) - '(displaced-lexical)))))) - (let ((#{type 20846}# (car #{b 20845}#))) - (if (let ((#{t 20880}# #{type 20846}#)) - (eqv? #{t 20880}# 'lexical)) + #{e 24391}# + (car #{l 24460}#))))))) + (#{lp 24394}# #{result 24393}#))))) + (#{syntax-type 4442}# + (lambda (#{e 24464}# + #{r 24465}# + #{w 24466}# + #{s 24467}# + #{rib 24468}# + #{mod 24469}# + #{for-car? 24470}#) + (if (symbol? #{e 24464}#) + (call-with-values + (lambda () + (#{resolve-identifier 4430}# + #{e 24464}# + #{w 24466}# + #{r 24465}# + #{mod 24469}# + #t)) + (lambda (#{type 24473}# #{value 24474}# #{mod* 24475}#) + (if (eqv? #{type 24473}# 'macro) + (if #{for-car? 24470}# (values - #{type 20846}# - (cdr #{b 20845}#) - #{e 20837}# - #{w 20839}# - #{s 20840}# - #{mod 20842}#) - (if (let ((#{t 21037}# #{type 20846}#)) - (eqv? #{t 21037}# 'global)) - (values - #{type 20846}# - #{n 20844}# - #{e 20837}# - #{w 20839}# - #{s 20840}# - #{mod 20842}#) - (if (let ((#{t 21163}# #{type 20846}#)) - (eqv? #{t 21163}# 'macro)) - (if #{for-car? 20843}# - (values - #{type 20846}# - (cdr #{b 20845}#) - #{e 20837}# - #{w 20839}# - #{s 20840}# - #{mod 20842}#) - (#{syntax-type 4332}# - (#{expand-macro 4336}# - (cdr #{b 20845}#) - #{e 20837}# - #{r 20838}# - #{w 20839}# - #{s 20840}# - #{rib 20841}# - #{mod 20842}#) - #{r 20838}# - '(()) - #{s 20840}# - #{rib 20841}# - #{mod 20842}# - #f)) - (values - #{type 20846}# - (cdr #{b 20845}#) - #{e 20837}# - #{w 20839}# - #{s 20840}# - #{mod 20842}#))))))) - (if (pair? #{e 20837}#) - (let ((#{first 21482}# (car #{e 20837}#))) + #{type 24473}# + #{value 24474}# + #{e 24464}# + #{w 24466}# + #{s 24467}# + #{mod 24469}#) + (#{syntax-type 4442}# + (#{expand-macro 4446}# + #{value 24474}# + #{e 24464}# + #{r 24465}# + #{w 24466}# + #{s 24467}# + #{rib 24468}# + #{mod 24469}#) + #{r 24465}# + '(()) + #{s 24467}# + #{rib 24468}# + #{mod 24469}# + #f)) + (if (eqv? #{type 24473}# 'global) + (values + #{type 24473}# + #{value 24474}# + #{value 24474}# + #{w 24466}# + #{s 24467}# + #{mod* 24475}#) + (values + #{type 24473}# + #{value 24474}# + #{e 24464}# + #{w 24466}# + #{s 24467}# + #{mod 24469}#))))) + (if (pair? #{e 24464}#) + (let ((#{first 24484}# (car #{e 24464}#))) (call-with-values (lambda () - (#{syntax-type 4332}# - #{first 21482}# - #{r 20838}# - #{w 20839}# - #{s 20840}# - #{rib 20841}# - #{mod 20842}# + (#{syntax-type 4442}# + #{first 24484}# + #{r 24465}# + #{w 24466}# + #{s 24467}# + #{rib 24468}# + #{mod 24469}# #t)) - (lambda (#{ftype 21484}# - #{fval 21485}# - #{fe 21486}# - #{fw 21487}# - #{fs 21488}# - #{fmod 21489}#) - (if (eqv? #{ftype 21484}# 'lexical) + (lambda (#{ftype 24486}# + #{fval 24487}# + #{fe 24488}# + #{fw 24489}# + #{fs 24490}# + #{fmod 24491}#) + (if (eqv? #{ftype 24486}# 'lexical) (values 'lexical-call - #{fval 21485}# - #{e 20837}# - #{w 20839}# - #{s 20840}# - #{mod 20842}#) - (if (eqv? #{ftype 21484}# 'global) + #{fval 24487}# + #{e 24464}# + #{w 24466}# + #{s 24467}# + #{mod 24469}#) + (if (eqv? #{ftype 24486}# 'global) (values 'global-call (vector 'syntax-object - #{fval 21485}# - #{w 20839}# - #{fmod 21489}#) - #{e 20837}# - #{w 20839}# - #{s 20840}# - #{mod 20842}#) - (if (eqv? #{ftype 21484}# 'macro) - (#{syntax-type 4332}# - (#{expand-macro 4336}# - #{fval 21485}# - #{e 20837}# - #{r 20838}# - #{w 20839}# - #{s 20840}# - #{rib 20841}# - #{mod 20842}#) - #{r 20838}# + #{fval 24487}# + #{w 24466}# + #{fmod 24491}#) + #{e 24464}# + #{w 24466}# + #{s 24467}# + #{mod 24469}#) + (if (eqv? #{ftype 24486}# 'macro) + (#{syntax-type 4442}# + (#{expand-macro 4446}# + #{fval 24487}# + #{e 24464}# + #{r 24465}# + #{w 24466}# + #{s 24467}# + #{rib 24468}# + #{mod 24469}#) + #{r 24465}# '(()) - #{s 20840}# - #{rib 20841}# - #{mod 20842}# - #{for-car? 20843}#) - (if (eqv? #{ftype 21484}# 'module-ref) + #{s 24467}# + #{rib 24468}# + #{mod 24469}# + #{for-car? 24470}#) + (if (eqv? #{ftype 24486}# 'module-ref) (call-with-values (lambda () - (#{fval 21485}# - #{e 20837}# - #{r 20838}# - #{w 20839}#)) - (lambda (#{e 21510}# - #{r 21511}# - #{w 21512}# - #{s 21513}# - #{mod 21514}#) - (#{syntax-type 4332}# - #{e 21510}# - #{r 21511}# - #{w 21512}# - #{s 21513}# - #{rib 20841}# - #{mod 21514}# - #{for-car? 20843}#))) - (if (eqv? #{ftype 21484}# 'core) + (#{fval 24487}# + #{e 24464}# + #{r 24465}# + #{w 24466}#)) + (lambda (#{e 24512}# + #{r 24513}# + #{w 24514}# + #{s 24515}# + #{mod 24516}#) + (#{syntax-type 4442}# + #{e 24512}# + #{r 24513}# + #{w 24514}# + #{s 24515}# + #{rib 24468}# + #{mod 24516}# + #{for-car? 24470}#))) + (if (eqv? #{ftype 24486}# 'core) (values 'core-form - #{fval 21485}# - #{e 20837}# - #{w 20839}# - #{s 20840}# - #{mod 20842}#) - (if (eqv? #{ftype 21484}# 'local-syntax) + #{fval 24487}# + #{e 24464}# + #{w 24466}# + #{s 24467}# + #{mod 24469}#) + (if (eqv? #{ftype 24486}# 'local-syntax) (values 'local-syntax-form - #{fval 21485}# - #{e 20837}# - #{w 20839}# - #{s 20840}# - #{mod 20842}#) - (if (eqv? #{ftype 21484}# 'begin) + #{fval 24487}# + #{e 24464}# + #{w 24466}# + #{s 24467}# + #{mod 24469}#) + (if (eqv? #{ftype 24486}# 'begin) (values 'begin-form #f - #{e 20837}# - #{w 20839}# - #{s 20840}# - #{mod 20842}#) - (if (eqv? #{ftype 21484}# 'eval-when) + #{e 24464}# + #{w 24466}# + #{s 24467}# + #{mod 24469}#) + (if (eqv? #{ftype 24486}# 'eval-when) (values 'eval-when-form #f - #{e 20837}# - #{w 20839}# - #{s 20840}# - #{mod 20842}#) - (if (eqv? #{ftype 21484}# 'define) - (let ((#{tmp 21531}# + #{e 24464}# + #{w 24466}# + #{s 24467}# + #{mod 24469}#) + (if (eqv? #{ftype 24486}# 'define) + (let ((#{tmp 24533}# ($sc-dispatch - #{e 20837}# + #{e 24464}# '(_ any any)))) - (if (if #{tmp 21531}# + (if (if #{tmp 24533}# (@apply - (lambda (#{name 21535}# - #{val 21536}#) - (if (symbol? #{name 21535}#) + (lambda (#{name 24537}# + #{val 24538}#) + (if (symbol? #{name 24537}#) #t (if (if (vector? - #{name 21535}#) + #{name 24537}#) (if (= (vector-length - #{name 21535}#) + #{name 24537}#) 4) (eq? (vector-ref - #{name 21535}# + #{name 24537}# 0) 'syntax-object) #f) #f) (symbol? (vector-ref - #{name 21535}# + #{name 24537}# 1)) #f))) - #{tmp 21531}#) + #{tmp 24533}#) #f) (@apply - (lambda (#{name 21563}# #{val 21564}#) + (lambda (#{name 24565}# #{val 24566}#) (values 'define-form - #{name 21563}# - #{val 21564}# - #{w 20839}# - #{s 20840}# - #{mod 20842}#)) - #{tmp 21531}#) - (let ((#{tmp 21565}# + #{name 24565}# + #{val 24566}# + #{w 24466}# + #{s 24467}# + #{mod 24469}#)) + #{tmp 24533}#) + (let ((#{tmp 24567}# ($sc-dispatch - #{e 20837}# + #{e 24464}# '(_ (any . any) any . each-any)))) - (if (if #{tmp 21565}# + (if (if #{tmp 24567}# (@apply - (lambda (#{name 21569}# - #{args 21570}# - #{e1 21571}# - #{e2 21572}#) + (lambda (#{name 24571}# + #{args 24572}# + #{e1 24573}# + #{e2 24574}#) (if (if (symbol? - #{name 21569}#) + #{name 24571}#) #t (if (if (vector? - #{name 21569}#) + #{name 24571}#) (if (= (vector-length - #{name 21569}#) + #{name 24571}#) 4) (eq? (vector-ref - #{name 21569}# + #{name 24571}# 0) 'syntax-object) #f) #f) (symbol? (vector-ref - #{name 21569}# + #{name 24571}# 1)) #f)) - (#{valid-bound-ids? 4323}# - (letrec* - ((#{lvl 21721}# - (lambda (#{vars 21723}# - #{ls 21724}# - #{w 21725}#) - (if (pair? #{vars 21723}#) - (#{lvl 21721}# - (cdr #{vars 21723}#) - (cons (#{wrap 4326}# - (car #{vars 21723}#) - #{w 21725}# - #f) - #{ls 21724}#) - #{w 21725}#) - (if (if (symbol? - #{vars 21723}#) - #t - (if (if (vector? - #{vars 21723}#) - (if (= (vector-length - #{vars 21723}#) - 4) - (eq? (vector-ref - #{vars 21723}# - 0) - 'syntax-object) - #f) - #f) - (symbol? - (vector-ref - #{vars 21723}# - 1)) - #f)) - (cons (#{wrap 4326}# - #{vars 21723}# - #{w 21725}# - #f) - #{ls 21724}#) - (if (null? #{vars 21723}#) - #{ls 21724}# - (if (if (vector? - #{vars 21723}#) - (if (= (vector-length - #{vars 21723}#) - 4) - (eq? (vector-ref - #{vars 21723}# - 0) - 'syntax-object) - #f) - #f) - (#{lvl 21721}# - (vector-ref - #{vars 21723}# - 1) - #{ls 21724}# - (#{join-wraps 4317}# - #{w 21725}# - (vector-ref - #{vars 21723}# - 2))) - (cons #{vars 21723}# - #{ls 21724}#)))))))) - (#{lvl 21721}# - #{args 21570}# - '() - '(())))) + (#{valid-bound-ids? 4433}# + (#{lambda-var-list 4458}# + #{args 24572}#)) #f)) - #{tmp 21565}#) + #{tmp 24567}#) #f) (@apply - (lambda (#{name 21769}# - #{args 21770}# - #{e1 21771}# - #{e2 21772}#) + (lambda (#{name 25055}# + #{args 25056}# + #{e1 25057}# + #{e2 25058}#) (values 'define-form - (#{wrap 4326}# - #{name 21769}# - #{w 20839}# - #{mod 20842}#) - (let ((#{e 21778}# + (if (if (null? (car #{w 24466}#)) + (null? (cdr #{w 24466}#)) + #f) + #{name 25055}# + (if (if (vector? + #{name 25055}#) + (if (= (vector-length + #{name 25055}#) + 4) + (eq? (vector-ref + #{name 25055}# + 0) + 'syntax-object) + #f) + #f) + (let ((#{expression 25088}# + (vector-ref + #{name 25055}# + 1)) + (#{wrap 25089}# + (let ((#{w2 25099}# + (vector-ref + #{name 25055}# + 2))) + (let ((#{m1 25100}# + (car #{w 24466}#)) + (#{s1 25101}# + (cdr #{w 24466}#))) + (if (null? #{m1 25100}#) + (if (null? #{s1 25101}#) + #{w2 25099}# + (cons (car #{w2 25099}#) + (let ((#{m2 25118}# + (cdr #{w2 25099}#))) + (if (null? #{m2 25118}#) + #{s1 25101}# + (append + #{s1 25101}# + #{m2 25118}#))))) + (cons (let ((#{m2 25126}# + (car #{w2 25099}#))) + (if (null? #{m2 25126}#) + #{m1 25100}# + (append + #{m1 25100}# + #{m2 25126}#))) + (let ((#{m2 25134}# + (cdr #{w2 25099}#))) + (if (null? #{m2 25134}#) + #{s1 25101}# + (append + #{s1 25101}# + #{m2 25134}#)))))))) + (#{module 25090}# + (vector-ref + #{name 25055}# + 3))) + (vector + 'syntax-object + #{expression 25088}# + #{wrap 25089}# + #{module 25090}#)) + (if (null? #{name 25055}#) + #{name 25055}# + (vector + 'syntax-object + #{name 25055}# + #{w 24466}# + #{mod 24469}#)))) + (let ((#{e 25160}# (cons '#(syntax-object lambda ((top) @@ -1640,10 +2005,10 @@ (top) (top) (top)) - #("i1843" - "i1844" - "i1845" - "i1846")) + #("i1952" + "i1953" + "i1954" + "i1955")) #(ribcage () () @@ -1665,12 +2030,12 @@ (top) (top) (top)) - #("i1796" - "i1797" - "i1798" - "i1799" - "i1800" - "i1801")) + #("i1905" + "i1906" + "i1907" + "i1908" + "i1909" + "i1910")) #(ribcage () () @@ -1678,7 +2043,7 @@ #(ribcage #(first) #((top)) - #("i1788")) + #("i1897")) #(ribcage () () @@ -1706,13 +2071,13 @@ (top) (top) (top)) - #("i1760" - "i1761" - "i1762" - "i1763" - "i1764" - "i1765" - "i1766")) + #("i1876" + "i1877" + "i1878" + "i1879" + "i1880" + "i1881" + "i1882")) #(ribcage (lambda-var-list gen-var @@ -1727,7 +2092,7 @@ expand-local-syntax expand-body expand-macro - expand-application + expand-call expand-expr expand syntax-type @@ -1742,6 +2107,7 @@ valid-bound-ids? bound-id=? free-id=? + resolve-identifier id-var-name same-marks? join-marks @@ -1779,7 +2145,6 @@ id? nonsymbol-id? global-extend - lookup macros-only-env extend-var-env extend-env @@ -1805,6 +2170,7 @@ build-sequence build-data build-primref + build-primcall build-lambda-case build-case-lambda build-simple-lambda @@ -1816,7 +2182,7 @@ build-lexical-reference build-dynlet build-conditional - build-application + build-call build-void maybe-name-value! decorate-source @@ -1837,8 +2203,9 @@ make-let make-lambda-case make-lambda - make-sequence - make-application + make-seq + make-primcall + make-call make-conditional make-toplevel-define make-toplevel-set @@ -1985,8 +2352,12 @@ (top) (top) (top) + (top) + (top) (top)) - ("i467" + ("i471" + "i469" + "i467" "i465" "i463" "i461" @@ -2020,13 +2391,13 @@ "i405" "i403" "i401" - "i399" + "i400" "i398" - "i396" + "i395" + "i394" "i393" - "i392" "i391" - "i389" + "i390" "i388" "i386" "i384" @@ -2035,32 +2406,32 @@ "i378" "i376" "i374" - "i372" + "i371" "i369" - "i367" + "i368" "i366" "i364" "i362" "i360" + "i359" "i358" "i357" - "i356" "i355" - "i353" - "i352" + "i354" + "i351" "i349" "i347" "i345" "i343" "i341" + "i340" "i339" "i337" - "i336" "i335" - "i333" + "i334" "i331" "i330" - "i327" + "i328" "i326" "i324" "i322" @@ -2069,8 +2440,8 @@ "i316" "i314" "i312" - "i310" - "i308" + "i309" + "i307" "i305" "i303" "i301" @@ -2093,17 +2464,17 @@ "i267" "i265" "i263" - "i261" - "i260" + "i262" + "i259" "i257" + "i256" "i255" "i254" "i253" - "i252" "i251" "i249" "i247" - "i245" + "i244" "i242" "i240" "i238" @@ -2131,70 +2502,206 @@ (top)) ("i46" "i45" - "i44"))) + "i44")) + #(ribcage + () + () + ())) (hygiene guile)) - (#{wrap 4326}# - (cons #{args 21770}# - (cons #{e1 21771}# - #{e2 21772}#)) - #{w 20839}# - #{mod 20842}#)))) + (let ((#{x 25164}# + (cons #{args 25056}# + (cons #{e1 25057}# + #{e2 25058}#)))) + (if (if (null? (car #{w 24466}#)) + (null? (cdr #{w 24466}#)) + #f) + #{x 25164}# + (if (if (vector? + #{x 25164}#) + (if (= (vector-length + #{x 25164}#) + 4) + (eq? (vector-ref + #{x 25164}# + 0) + 'syntax-object) + #f) + #f) + (let ((#{expression 25182}# + (vector-ref + #{x 25164}# + 1)) + (#{wrap 25183}# + (let ((#{w2 25191}# + (vector-ref + #{x 25164}# + 2))) + (let ((#{m1 25192}# + (car #{w 24466}#)) + (#{s1 25193}# + (cdr #{w 24466}#))) + (if (null? #{m1 25192}#) + (if (null? #{s1 25193}#) + #{w2 25191}# + (cons (car #{w2 25191}#) + (let ((#{m2 25208}# + (cdr #{w2 25191}#))) + (if (null? #{m2 25208}#) + #{s1 25193}# + (append + #{s1 25193}# + #{m2 25208}#))))) + (cons (let ((#{m2 25216}# + (car #{w2 25191}#))) + (if (null? #{m2 25216}#) + #{m1 25192}# + (append + #{m1 25192}# + #{m2 25216}#))) + (let ((#{m2 25224}# + (cdr #{w2 25191}#))) + (if (null? #{m2 25224}#) + #{s1 25193}# + (append + #{s1 25193}# + #{m2 25224}#)))))))) + (#{module 25184}# + (vector-ref + #{x 25164}# + 3))) + (vector + 'syntax-object + #{expression 25182}# + #{wrap 25183}# + #{module 25184}#)) + (if (null? #{x 25164}#) + #{x 25164}# + (vector + 'syntax-object + #{x 25164}# + #{w 24466}# + #{mod 24469}#)))))))) (begin - (if (if (pair? #{e 21778}#) - #{s 20840}# + (if (if (pair? #{e 25160}#) + #{s 24467}# #f) (set-source-properties! - #{e 21778}# - #{s 20840}#)) - #{e 21778}#)) + #{e 25160}# + #{s 24467}#)) + #{e 25160}#)) '(()) - #{s 20840}# - #{mod 20842}#)) - #{tmp 21565}#) - (let ((#{tmp 21785}# + #{s 24467}# + #{mod 24469}#)) + #{tmp 24567}#) + (let ((#{tmp 25243}# ($sc-dispatch - #{e 20837}# + #{e 24464}# '(_ any)))) - (if (if #{tmp 21785}# + (if (if #{tmp 25243}# (@apply - (lambda (#{name 21789}#) + (lambda (#{name 25247}#) (if (symbol? - #{name 21789}#) + #{name 25247}#) #t (if (if (vector? - #{name 21789}#) + #{name 25247}#) (if (= (vector-length - #{name 21789}#) + #{name 25247}#) 4) (eq? (vector-ref - #{name 21789}# + #{name 25247}# 0) 'syntax-object) #f) #f) (symbol? (vector-ref - #{name 21789}# + #{name 25247}# 1)) #f))) - #{tmp 21785}#) + #{tmp 25243}#) #f) (@apply - (lambda (#{name 21816}#) + (lambda (#{name 25274}#) (values 'define-form - (#{wrap 4326}# - #{name 21816}# - #{w 20839}# - #{mod 20842}#) + (if (if (null? (car #{w 24466}#)) + (null? (cdr #{w 24466}#)) + #f) + #{name 25274}# + (if (if (vector? + #{name 25274}#) + (if (= (vector-length + #{name 25274}#) + 4) + (eq? (vector-ref + #{name 25274}# + 0) + 'syntax-object) + #f) + #f) + (let ((#{expression 25304}# + (vector-ref + #{name 25274}# + 1)) + (#{wrap 25305}# + (let ((#{w2 25315}# + (vector-ref + #{name 25274}# + 2))) + (let ((#{m1 25316}# + (car #{w 24466}#)) + (#{s1 25317}# + (cdr #{w 24466}#))) + (if (null? #{m1 25316}#) + (if (null? #{s1 25317}#) + #{w2 25315}# + (cons (car #{w2 25315}#) + (let ((#{m2 25334}# + (cdr #{w2 25315}#))) + (if (null? #{m2 25334}#) + #{s1 25317}# + (append + #{s1 25317}# + #{m2 25334}#))))) + (cons (let ((#{m2 25342}# + (car #{w2 25315}#))) + (if (null? #{m2 25342}#) + #{m1 25316}# + (append + #{m1 25316}# + #{m2 25342}#))) + (let ((#{m2 25350}# + (cdr #{w2 25315}#))) + (if (null? #{m2 25350}#) + #{s1 25317}# + (append + #{s1 25317}# + #{m2 25350}#)))))))) + (#{module 25306}# + (vector-ref + #{name 25274}# + 3))) + (vector + 'syntax-object + #{expression 25304}# + #{wrap 25305}# + #{module 25306}#)) + (if (null? #{name 25274}#) + #{name 25274}# + (vector + 'syntax-object + #{name 25274}# + #{w 24466}# + #{mod 24469}#)))) '(#(syntax-object if ((top) #(ribcage #(name) #((top)) - #("i1856")) + #("i1965")) #(ribcage () () ()) #(ribcage () () ()) #(ribcage @@ -2210,17 +2717,17 @@ (top) (top) (top)) - #("i1796" - "i1797" - "i1798" - "i1799" - "i1800" - "i1801")) + #("i1905" + "i1906" + "i1907" + "i1908" + "i1909" + "i1910")) #(ribcage () () ()) #(ribcage #(first) #((top)) - #("i1788")) + #("i1897")) #(ribcage () () ()) #(ribcage () () ()) #(ribcage () () ()) @@ -2239,13 +2746,13 @@ (top) (top) (top)) - #("i1760" - "i1761" - "i1762" - "i1763" - "i1764" - "i1765" - "i1766")) + #("i1876" + "i1877" + "i1878" + "i1879" + "i1880" + "i1881" + "i1882")) #(ribcage (lambda-var-list gen-var @@ -2260,7 +2767,7 @@ expand-local-syntax expand-body expand-macro - expand-application + expand-call expand-expr expand syntax-type @@ -2275,6 +2782,7 @@ valid-bound-ids? bound-id=? free-id=? + resolve-identifier id-var-name same-marks? join-marks @@ -2312,7 +2820,6 @@ id? nonsymbol-id? global-extend - lookup macros-only-env extend-var-env extend-env @@ -2338,6 +2845,7 @@ build-sequence build-data build-primref + build-primcall build-lambda-case build-case-lambda build-simple-lambda @@ -2349,7 +2857,7 @@ build-lexical-reference build-dynlet build-conditional - build-application + build-call build-void maybe-name-value! decorate-source @@ -2370,8 +2878,9 @@ make-let make-lambda-case make-lambda - make-sequence - make-application + make-seq + make-primcall + make-call make-conditional make-toplevel-define make-toplevel-set @@ -2518,8 +3027,12 @@ (top) (top) (top) + (top) + (top) (top)) - ("i467" + ("i471" + "i469" + "i467" "i465" "i463" "i461" @@ -2553,13 +3066,13 @@ "i405" "i403" "i401" - "i399" + "i400" "i398" - "i396" + "i395" + "i394" "i393" - "i392" "i391" - "i389" + "i390" "i388" "i386" "i384" @@ -2568,32 +3081,32 @@ "i378" "i376" "i374" - "i372" + "i371" "i369" - "i367" + "i368" "i366" "i364" "i362" "i360" + "i359" "i358" "i357" - "i356" "i355" - "i353" - "i352" + "i354" + "i351" "i349" "i347" "i345" "i343" "i341" + "i340" "i339" "i337" - "i336" "i335" - "i333" + "i334" "i331" "i330" - "i327" + "i328" "i326" "i324" "i322" @@ -2602,8 +3115,8 @@ "i316" "i314" "i312" - "i310" - "i308" + "i309" + "i307" "i305" "i303" "i301" @@ -2626,17 +3139,17 @@ "i267" "i265" "i263" - "i261" - "i260" + "i262" + "i259" "i257" + "i256" "i255" "i254" "i253" - "i252" "i251" "i249" "i247" - "i245" + "i244" "i242" "i240" "i238" @@ -2662,7 +3175,8 @@ ((top) (top) (top)) ("i46" "i45" - "i44"))) + "i44")) + #(ribcage () () ())) (hygiene guile)) #(syntax-object #f @@ -2670,7 +3184,7 @@ #(ribcage #(name) #((top)) - #("i1856")) + #("i1965")) #(ribcage () () ()) #(ribcage () () ()) #(ribcage @@ -2686,17 +3200,17 @@ (top) (top) (top)) - #("i1796" - "i1797" - "i1798" - "i1799" - "i1800" - "i1801")) + #("i1905" + "i1906" + "i1907" + "i1908" + "i1909" + "i1910")) #(ribcage () () ()) #(ribcage #(first) #((top)) - #("i1788")) + #("i1897")) #(ribcage () () ()) #(ribcage () () ()) #(ribcage () () ()) @@ -2715,13 +3229,13 @@ (top) (top) (top)) - #("i1760" - "i1761" - "i1762" - "i1763" - "i1764" - "i1765" - "i1766")) + #("i1876" + "i1877" + "i1878" + "i1879" + "i1880" + "i1881" + "i1882")) #(ribcage (lambda-var-list gen-var @@ -2736,7 +3250,7 @@ expand-local-syntax expand-body expand-macro - expand-application + expand-call expand-expr expand syntax-type @@ -2751,6 +3265,7 @@ valid-bound-ids? bound-id=? free-id=? + resolve-identifier id-var-name same-marks? join-marks @@ -2788,7 +3303,6 @@ id? nonsymbol-id? global-extend - lookup macros-only-env extend-var-env extend-env @@ -2814,6 +3328,7 @@ build-sequence build-data build-primref + build-primcall build-lambda-case build-case-lambda build-simple-lambda @@ -2825,7 +3340,7 @@ build-lexical-reference build-dynlet build-conditional - build-application + build-call build-void maybe-name-value! decorate-source @@ -2846,8 +3361,9 @@ make-let make-lambda-case make-lambda - make-sequence - make-application + make-seq + make-primcall + make-call make-conditional make-toplevel-define make-toplevel-set @@ -2994,8 +3510,12 @@ (top) (top) (top) + (top) + (top) (top)) - ("i467" + ("i471" + "i469" + "i467" "i465" "i463" "i461" @@ -3029,13 +3549,13 @@ "i405" "i403" "i401" - "i399" + "i400" "i398" - "i396" + "i395" + "i394" "i393" - "i392" "i391" - "i389" + "i390" "i388" "i386" "i384" @@ -3044,32 +3564,32 @@ "i378" "i376" "i374" - "i372" + "i371" "i369" - "i367" + "i368" "i366" "i364" "i362" "i360" + "i359" "i358" "i357" - "i356" "i355" - "i353" - "i352" + "i354" + "i351" "i349" "i347" "i345" "i343" "i341" + "i340" "i339" "i337" - "i336" "i335" - "i333" + "i334" "i331" "i330" - "i327" + "i328" "i326" "i324" "i322" @@ -3078,8 +3598,8 @@ "i316" "i314" "i312" - "i310" - "i308" + "i309" + "i307" "i305" "i303" "i301" @@ -3102,17 +3622,17 @@ "i267" "i265" "i263" - "i261" - "i260" + "i262" + "i259" "i257" + "i256" "i255" "i254" "i253" - "i252" "i251" "i249" "i247" - "i245" + "i244" "i242" "i240" "i238" @@ -3138,7 +3658,8 @@ ((top) (top) (top)) ("i46" "i45" - "i44"))) + "i44")) + #(ribcage () () ())) (hygiene guile)) #(syntax-object #f @@ -3146,7 +3667,7 @@ #(ribcage #(name) #((top)) - #("i1856")) + #("i1965")) #(ribcage () () ()) #(ribcage () () ()) #(ribcage @@ -3162,17 +3683,17 @@ (top) (top) (top)) - #("i1796" - "i1797" - "i1798" - "i1799" - "i1800" - "i1801")) + #("i1905" + "i1906" + "i1907" + "i1908" + "i1909" + "i1910")) #(ribcage () () ()) #(ribcage #(first) #((top)) - #("i1788")) + #("i1897")) #(ribcage () () ()) #(ribcage () () ()) #(ribcage () () ()) @@ -3191,13 +3712,13 @@ (top) (top) (top)) - #("i1760" - "i1761" - "i1762" - "i1763" - "i1764" - "i1765" - "i1766")) + #("i1876" + "i1877" + "i1878" + "i1879" + "i1880" + "i1881" + "i1882")) #(ribcage (lambda-var-list gen-var @@ -3212,7 +3733,7 @@ expand-local-syntax expand-body expand-macro - expand-application + expand-call expand-expr expand syntax-type @@ -3227,6 +3748,7 @@ valid-bound-ids? bound-id=? free-id=? + resolve-identifier id-var-name same-marks? join-marks @@ -3264,7 +3786,6 @@ id? nonsymbol-id? global-extend - lookup macros-only-env extend-var-env extend-env @@ -3290,6 +3811,7 @@ build-sequence build-data build-primref + build-primcall build-lambda-case build-case-lambda build-simple-lambda @@ -3301,7 +3823,7 @@ build-lexical-reference build-dynlet build-conditional - build-application + build-call build-void maybe-name-value! decorate-source @@ -3322,8 +3844,9 @@ make-let make-lambda-case make-lambda - make-sequence - make-application + make-seq + make-primcall + make-call make-conditional make-toplevel-define make-toplevel-set @@ -3470,8 +3993,12 @@ (top) (top) (top) + (top) + (top) (top)) - ("i467" + ("i471" + "i469" + "i467" "i465" "i463" "i461" @@ -3505,13 +4032,13 @@ "i405" "i403" "i401" - "i399" + "i400" "i398" - "i396" + "i395" + "i394" "i393" - "i392" "i391" - "i389" + "i390" "i388" "i386" "i384" @@ -3520,32 +4047,32 @@ "i378" "i376" "i374" - "i372" + "i371" "i369" - "i367" + "i368" "i366" "i364" "i362" "i360" + "i359" "i358" "i357" - "i356" "i355" - "i353" - "i352" + "i354" + "i351" "i349" "i347" "i345" "i343" "i341" + "i340" "i339" "i337" - "i336" "i335" - "i333" + "i334" "i331" "i330" - "i327" + "i328" "i326" "i324" "i322" @@ -3554,8 +4081,8 @@ "i316" "i314" "i312" - "i310" - "i308" + "i309" + "i307" "i305" "i303" "i301" @@ -3578,17 +4105,17 @@ "i267" "i265" "i263" - "i261" - "i260" + "i262" + "i259" "i257" + "i256" "i255" "i254" "i253" - "i252" "i251" "i249" "i247" - "i245" + "i244" "i242" "i240" "i238" @@ -3614,2535 +4141,2848 @@ ((top) (top) (top)) ("i46" "i45" - "i44"))) + "i44")) + #(ribcage () () ())) (hygiene guile))) '(()) - #{s 20840}# - #{mod 20842}#)) - #{tmp 21785}#) + #{s 24467}# + #{mod 24469}#)) + #{tmp 25243}#) (syntax-violation #f "source expression failed to match any pattern" - #{e 20837}#))))))) - (if (eqv? #{ftype 21484}# 'define-syntax) - (let ((#{tmp 21835}# + #{e 24464}#))))))) + (if (eqv? #{ftype 24486}# 'define-syntax) + (let ((#{tmp 25389}# ($sc-dispatch - #{e 20837}# + #{e 24464}# '(_ any any)))) - (if (if #{tmp 21835}# + (if (if #{tmp 25389}# (@apply - (lambda (#{name 21839}# - #{val 21840}#) - (if (symbol? #{name 21839}#) + (lambda (#{name 25393}# + #{val 25394}#) + (if (symbol? #{name 25393}#) #t (if (if (vector? - #{name 21839}#) + #{name 25393}#) (if (= (vector-length - #{name 21839}#) + #{name 25393}#) 4) (eq? (vector-ref - #{name 21839}# + #{name 25393}# 0) 'syntax-object) #f) #f) (symbol? (vector-ref - #{name 21839}# + #{name 25393}# 1)) #f))) - #{tmp 21835}#) + #{tmp 25389}#) #f) (@apply - (lambda (#{name 21867}# - #{val 21868}#) + (lambda (#{name 25421}# + #{val 25422}#) (values 'define-syntax-form - #{name 21867}# - #{val 21868}# - #{w 20839}# - #{s 20840}# - #{mod 20842}#)) - #{tmp 21835}#) + #{name 25421}# + #{val 25422}# + #{w 24466}# + #{s 24467}# + #{mod 24469}#)) + #{tmp 25389}#) (syntax-violation #f "source expression failed to match any pattern" - #{e 20837}#))) - (values - 'call - #f - #{e 20837}# - #{w 20839}# - #{s 20840}# - #{mod 20842}#)))))))))))))) - (if (if (vector? #{e 20837}#) - (if (= (vector-length #{e 20837}#) 4) - (eq? (vector-ref #{e 20837}# 0) 'syntax-object) + #{e 24464}#))) + (if (eqv? #{ftype 24486}# + 'define-syntax-parameter) + (let ((#{tmp 25433}# + ($sc-dispatch + #{e 24464}# + '(_ any any)))) + (if (if #{tmp 25433}# + (@apply + (lambda (#{name 25437}# + #{val 25438}#) + (if (symbol? #{name 25437}#) + #t + (if (if (vector? + #{name 25437}#) + (if (= (vector-length + #{name 25437}#) + 4) + (eq? (vector-ref + #{name 25437}# + 0) + 'syntax-object) + #f) + #f) + (symbol? + (vector-ref + #{name 25437}# + 1)) + #f))) + #{tmp 25433}#) + #f) + (@apply + (lambda (#{name 25465}# + #{val 25466}#) + (values + 'define-syntax-parameter-form + #{name 25465}# + #{val 25466}# + #{w 24466}# + #{s 24467}# + #{mod 24469}#)) + #{tmp 25433}#) + (syntax-violation + #f + "source expression failed to match any pattern" + #{e 24464}#))) + (values + 'call + #f + #{e 24464}# + #{w 24466}# + #{s 24467}# + #{mod 24469}#))))))))))))))) + (if (if (vector? #{e 24464}#) + (if (= (vector-length #{e 24464}#) 4) + (eq? (vector-ref #{e 24464}# 0) 'syntax-object) #f) #f) - (#{syntax-type 4332}# - (vector-ref #{e 20837}# 1) - #{r 20838}# - (#{join-wraps 4317}# - #{w 20839}# - (vector-ref #{e 20837}# 2)) - (let ((#{t 21895}# - (#{source-annotation 4294}# #{e 20837}#))) - (if #{t 21895}# #{t 21895}# #{s 20840}#)) - #{rib 20841}# - (let ((#{t 22155}# (vector-ref #{e 20837}# 3))) - (if #{t 22155}# #{t 22155}# #{mod 20842}#)) - #{for-car? 20843}#) - (if (self-evaluating? #{e 20837}#) + (#{syntax-type 4442}# + (vector-ref #{e 24464}# 1) + #{r 24465}# + (let ((#{w2 25491}# (vector-ref #{e 24464}# 2))) + (let ((#{m1 25492}# (car #{w 24466}#)) + (#{s1 25493}# (cdr #{w 24466}#))) + (if (null? #{m1 25492}#) + (if (null? #{s1 25493}#) + #{w2 25491}# + (cons (car #{w2 25491}#) + (let ((#{m2 25504}# (cdr #{w2 25491}#))) + (if (null? #{m2 25504}#) + #{s1 25493}# + (append #{s1 25493}# #{m2 25504}#))))) + (cons (let ((#{m2 25512}# (car #{w2 25491}#))) + (if (null? #{m2 25512}#) + #{m1 25492}# + (append #{m1 25492}# #{m2 25512}#))) + (let ((#{m2 25520}# (cdr #{w2 25491}#))) + (if (null? #{m2 25520}#) + #{s1 25493}# + (append #{s1 25493}# #{m2 25520}#))))))) + (let ((#{t 25525}# + (#{source-annotation 4404}# #{e 24464}#))) + (if #{t 25525}# #{t 25525}# #{s 24467}#)) + #{rib 24468}# + (let ((#{t 25823}# (vector-ref #{e 24464}# 3))) + (if #{t 25823}# #{t 25823}# #{mod 24469}#)) + #{for-car? 24470}#) + (if (self-evaluating? #{e 24464}#) (values 'constant #f - #{e 20837}# - #{w 20839}# - #{s 20840}# - #{mod 20842}#) + #{e 24464}# + #{w 24466}# + #{s 24467}# + #{mod 24469}#) (values 'other #f - #{e 20837}# - #{w 20839}# - #{s 20840}# - #{mod 20842}#))))))) - (#{expand 4333}# - (lambda (#{e 22164}# - #{r 22165}# - #{w 22166}# - #{mod 22167}#) + #{e 24464}# + #{w 24466}# + #{s 24467}# + #{mod 24469}#))))))) + (#{expand 4443}# + (lambda (#{e 25832}# + #{r 25833}# + #{w 25834}# + #{mod 25835}#) (call-with-values (lambda () - (#{syntax-type 4332}# - #{e 22164}# - #{r 22165}# - #{w 22166}# - (#{source-annotation 4294}# #{e 22164}#) + (#{syntax-type 4442}# + #{e 25832}# + #{r 25833}# + #{w 25834}# + (#{source-annotation 4404}# #{e 25832}#) #f - #{mod 22167}# + #{mod 25835}# #f)) - (lambda (#{type 22341}# - #{value 22342}# - #{e 22343}# - #{w 22344}# - #{s 22345}# - #{mod 22346}#) - (#{expand-expr 4334}# - #{type 22341}# - #{value 22342}# - #{e 22343}# - #{r 22165}# - #{w 22344}# - #{s 22345}# - #{mod 22346}#))))) - (#{expand-expr 4334}# - (lambda (#{type 22349}# - #{value 22350}# - #{e 22351}# - #{r 22352}# - #{w 22353}# - #{s 22354}# - #{mod 22355}#) - (if (eqv? #{type 22349}# 'lexical) + (lambda (#{type 26039}# + #{value 26040}# + #{e 26041}# + #{w 26042}# + #{s 26043}# + #{mod 26044}#) + (#{expand-expr 4444}# + #{type 26039}# + #{value 26040}# + #{e 26041}# + #{r 25833}# + #{w 26042}# + #{s 26043}# + #{mod 26044}#))))) + (#{expand-expr 4444}# + (lambda (#{type 26047}# + #{value 26048}# + #{e 26049}# + #{r 26050}# + #{w 26051}# + #{s 26052}# + #{mod 26053}#) + (if (eqv? #{type 26047}# 'lexical) (make-struct/no-tail (vector-ref %expanded-vtables 3) - #{s 22354}# - #{e 22351}# - #{value 22350}#) - (if (if (eqv? #{type 22349}# 'core) + #{s 26052}# + #{e 26049}# + #{value 26048}#) + (if (if (eqv? #{type 26047}# 'core) #t - (eqv? #{type 22349}# 'core-form)) - (#{value 22350}# - #{e 22351}# - #{r 22352}# - #{w 22353}# - #{s 22354}# - #{mod 22355}#) - (if (eqv? #{type 22349}# 'module-ref) + (eqv? #{type 26047}# 'core-form)) + (#{value 26048}# + #{e 26049}# + #{r 26050}# + #{w 26051}# + #{s 26052}# + #{mod 26053}#) + (if (eqv? #{type 26047}# 'module-ref) (call-with-values (lambda () - (#{value 22350}# - #{e 22351}# - #{r 22352}# - #{w 22353}#)) - (lambda (#{e 22381}# - #{r 22382}# - #{w 22383}# - #{s 22384}# - #{mod 22385}#) - (#{expand 4333}# - #{e 22381}# - #{r 22382}# - #{w 22383}# - #{mod 22385}#))) - (if (eqv? #{type 22349}# 'lexical-call) - (#{expand-application 4335}# - (let ((#{id 22465}# (car #{e 22351}#))) - (#{build-lexical-reference 4271}# + (#{value 26048}# + #{e 26049}# + #{r 26050}# + #{w 26051}#)) + (lambda (#{e 26079}# + #{r 26080}# + #{w 26081}# + #{s 26082}# + #{mod 26083}#) + (#{expand 4443}# + #{e 26079}# + #{r 26080}# + #{w 26081}# + #{mod 26083}#))) + (if (eqv? #{type 26047}# 'lexical-call) + (#{expand-call 4445}# + (let ((#{id 26264}# (car #{e 26049}#))) + (#{build-lexical-reference 4380}# 'fun - (#{source-annotation 4294}# #{id 22465}#) - (if (if (vector? #{id 22465}#) - (if (= (vector-length #{id 22465}#) 4) - (eq? (vector-ref #{id 22465}# 0) 'syntax-object) + (#{source-annotation 4404}# #{id 26264}#) + (if (if (vector? #{id 26264}#) + (if (= (vector-length #{id 26264}#) 4) + (eq? (vector-ref #{id 26264}# 0) 'syntax-object) #f) #f) - (syntax->datum #{id 22465}#) - #{id 22465}#) - #{value 22350}#)) - #{e 22351}# - #{r 22352}# - #{w 22353}# - #{s 22354}# - #{mod 22355}#) - (if (eqv? #{type 22349}# 'global-call) - (#{expand-application 4335}# - (#{build-global-reference 4274}# - (#{source-annotation 4294}# (car #{e 22351}#)) - (if (if (vector? #{value 22350}#) - (if (= (vector-length #{value 22350}#) 4) - (eq? (vector-ref #{value 22350}# 0) + (syntax->datum #{id 26264}#) + #{id 26264}#) + #{value 26048}#)) + #{e 26049}# + #{r 26050}# + #{w 26051}# + #{s 26052}# + #{mod 26053}#) + (if (eqv? #{type 26047}# 'global-call) + (#{expand-call 4445}# + (#{build-global-reference 4383}# + (#{source-annotation 4404}# (car #{e 26049}#)) + (if (if (vector? #{value 26048}#) + (if (= (vector-length #{value 26048}#) 4) + (eq? (vector-ref #{value 26048}# 0) 'syntax-object) #f) #f) - (vector-ref #{value 22350}# 1) - #{value 22350}#) - (if (if (vector? #{value 22350}#) - (if (= (vector-length #{value 22350}#) 4) - (eq? (vector-ref #{value 22350}# 0) + (vector-ref #{value 26048}# 1) + #{value 26048}#) + (if (if (vector? #{value 26048}#) + (if (= (vector-length #{value 26048}#) 4) + (eq? (vector-ref #{value 26048}# 0) 'syntax-object) #f) #f) - (vector-ref #{value 22350}# 3) - #{mod 22355}#)) - #{e 22351}# - #{r 22352}# - #{w 22353}# - #{s 22354}# - #{mod 22355}#) - (if (eqv? #{type 22349}# 'constant) - (let ((#{exp 23001}# - (#{strip 4346}# - (#{wrap 4326}# - (begin - (if (if (pair? #{e 22351}#) #{s 22354}# #f) - (set-source-properties! - #{e 22351}# - #{s 22354}#)) - #{e 22351}#) - #{w 22353}# - #{mod 22355}#) + (vector-ref #{value 26048}# 3) + #{mod 26053}#)) + #{e 26049}# + #{r 26050}# + #{w 26051}# + #{s 26052}# + #{mod 26053}#) + (if (eqv? #{type 26047}# 'constant) + (let ((#{exp 26986}# + (#{strip 4456}# + (let ((#{x 26999}# + (begin + (if (if (pair? #{e 26049}#) + #{s 26052}# + #f) + (set-source-properties! + #{e 26049}# + #{s 26052}#)) + #{e 26049}#))) + (if (if (null? (car #{w 26051}#)) + (null? (cdr #{w 26051}#)) + #f) + #{x 26999}# + (if (if (vector? #{x 26999}#) + (if (= (vector-length #{x 26999}#) 4) + (eq? (vector-ref #{x 26999}# 0) + 'syntax-object) + #f) + #f) + (let ((#{expression 27031}# + (vector-ref #{x 26999}# 1)) + (#{wrap 27032}# + (let ((#{w2 27040}# + (vector-ref #{x 26999}# 2))) + (let ((#{m1 27041}# + (car #{w 26051}#)) + (#{s1 27042}# + (cdr #{w 26051}#))) + (if (null? #{m1 27041}#) + (if (null? #{s1 27042}#) + #{w2 27040}# + (cons (car #{w2 27040}#) + (let ((#{m2 27057}# + (cdr #{w2 27040}#))) + (if (null? #{m2 27057}#) + #{s1 27042}# + (append + #{s1 27042}# + #{m2 27057}#))))) + (cons (let ((#{m2 27065}# + (car #{w2 27040}#))) + (if (null? #{m2 27065}#) + #{m1 27041}# + (append + #{m1 27041}# + #{m2 27065}#))) + (let ((#{m2 27073}# + (cdr #{w2 27040}#))) + (if (null? #{m2 27073}#) + #{s1 27042}# + (append + #{s1 27042}# + #{m2 27073}#)))))))) + (#{module 27033}# + (vector-ref #{x 26999}# 3))) + (vector + 'syntax-object + #{expression 27031}# + #{wrap 27032}# + #{module 27033}#)) + (if (null? #{x 26999}#) + #{x 26999}# + (vector + 'syntax-object + #{x 26999}# + #{w 26051}# + #{mod 26053}#))))) '(())))) (make-struct/no-tail (vector-ref %expanded-vtables 1) - #{s 22354}# - #{exp 23001}#)) - (if (eqv? #{type 22349}# 'global) - (#{analyze-variable 4273}# - #{mod 22355}# - #{value 22350}# - (lambda (#{mod 23037}# #{var 23038}# #{public? 23039}#) + #{s 26052}# + #{exp 26986}#)) + (if (eqv? #{type 26047}# 'global) + (#{analyze-variable 4382}# + #{mod 26053}# + #{value 26048}# + (lambda (#{mod 27098}# #{var 27099}# #{public? 27100}#) (make-struct/no-tail (vector-ref %expanded-vtables 5) - #{s 22354}# - #{mod 23037}# - #{var 23038}# - #{public? 23039}#)) - (lambda (#{var 23048}#) + #{s 26052}# + #{mod 27098}# + #{var 27099}# + #{public? 27100}#)) + (lambda (#{var 27108}#) (make-struct/no-tail (vector-ref %expanded-vtables 7) - #{s 22354}# - #{var 23048}#))) - (if (eqv? #{type 22349}# 'call) - (#{expand-application 4335}# - (#{expand 4333}# - (car #{e 22351}#) - #{r 22352}# - #{w 22353}# - #{mod 22355}#) - #{e 22351}# - #{r 22352}# - #{w 22353}# - #{s 22354}# - #{mod 22355}#) - (if (eqv? #{type 22349}# 'begin-form) - (let ((#{tmp 23128}# + #{s 26052}# + #{var 27108}#))) + (if (eqv? #{type 26047}# 'call) + (#{expand-call 4445}# + (#{expand 4443}# + (car #{e 26049}#) + #{r 26050}# + #{w 26051}# + #{mod 26053}#) + #{e 26049}# + #{r 26050}# + #{w 26051}# + #{s 26052}# + #{mod 26053}#) + (if (eqv? #{type 26047}# 'begin-form) + (let ((#{tmp 27286}# ($sc-dispatch - #{e 22351}# + #{e 26049}# '(_ any . each-any)))) - (if #{tmp 23128}# + (if #{tmp 27286}# (@apply - (lambda (#{e1 23132}# #{e2 23133}#) - (#{expand-sequence 4328}# - (cons #{e1 23132}# #{e2 23133}#) - #{r 22352}# - #{w 22353}# - #{s 22354}# - #{mod 22355}#)) - #{tmp 23128}#) + (lambda (#{e1 27290}# #{e2 27291}#) + (#{expand-sequence 4438}# + (cons #{e1 27290}# #{e2 27291}#) + #{r 26050}# + #{w 26051}# + #{s 26052}# + #{mod 26053}#)) + #{tmp 27286}#) (syntax-violation #f "source expression failed to match any pattern" - #{e 22351}#))) - (if (eqv? #{type 22349}# 'local-syntax-form) - (#{expand-local-syntax 4338}# - #{value 22350}# - #{e 22351}# - #{r 22352}# - #{w 22353}# - #{s 22354}# - #{mod 22355}# - #{expand-sequence 4328}#) - (if (eqv? #{type 22349}# 'eval-when-form) - (let ((#{tmp 23299}# + #{e 26049}#))) + (if (eqv? #{type 26047}# 'local-syntax-form) + (#{expand-local-syntax 4448}# + #{value 26048}# + #{e 26049}# + #{r 26050}# + #{w 26051}# + #{s 26052}# + #{mod 26053}# + #{expand-sequence 4438}#) + (if (eqv? #{type 26047}# 'eval-when-form) + (let ((#{tmp 27471}# ($sc-dispatch - #{e 22351}# + #{e 26049}# '(_ each-any any . each-any)))) - (if #{tmp 23299}# + (if #{tmp 27471}# (@apply - (lambda (#{x 23303}# - #{e1 23304}# - #{e2 23305}#) - (let ((#{when-list 23306}# - (#{parse-when-list 4331}# - #{e 22351}# - #{x 23303}#))) - (if (memq 'eval #{when-list 23306}#) - (#{expand-sequence 4328}# - (cons #{e1 23304}# #{e2 23305}#) - #{r 22352}# - #{w 22353}# - #{s 22354}# - #{mod 22355}#) + (lambda (#{x 27475}# + #{e1 27476}# + #{e2 27477}#) + (let ((#{when-list 27478}# + (#{parse-when-list 4441}# + #{e 26049}# + #{x 27475}#))) + (if (memq 'eval #{when-list 27478}#) + (#{expand-sequence 4438}# + (cons #{e1 27476}# #{e2 27477}#) + #{r 26050}# + #{w 26051}# + #{s 26052}# + #{mod 26053}#) (make-struct/no-tail (vector-ref %expanded-vtables 0) #f)))) - #{tmp 23299}#) + #{tmp 27471}#) (syntax-violation #f "source expression failed to match any pattern" - #{e 22351}#))) - (if (if (eqv? #{type 22349}# 'define-form) + #{e 26049}#))) + (if (if (eqv? #{type 26047}# 'define-form) #t - (eqv? #{type 22349}# 'define-syntax-form)) + (if (eqv? #{type 26047}# + 'define-syntax-form) + #t + (eqv? #{type 26047}# + 'define-syntax-parameter-form))) (syntax-violation #f "definition in expression context" - #{e 22351}# - (#{wrap 4326}# - #{value 22350}# - #{w 22353}# - #{mod 22355}#)) - (if (eqv? #{type 22349}# 'syntax) + #{e 26049}# + (if (if (null? (car #{w 26051}#)) + (null? (cdr #{w 26051}#)) + #f) + #{value 26048}# + (if (if (vector? #{value 26048}#) + (if (= (vector-length #{value 26048}#) + 4) + (eq? (vector-ref #{value 26048}# 0) + 'syntax-object) + #f) + #f) + (let ((#{expression 27688}# + (vector-ref #{value 26048}# 1)) + (#{wrap 27689}# + (let ((#{w2 27699}# + (vector-ref + #{value 26048}# + 2))) + (let ((#{m1 27700}# + (car #{w 26051}#)) + (#{s1 27701}# + (cdr #{w 26051}#))) + (if (null? #{m1 27700}#) + (if (null? #{s1 27701}#) + #{w2 27699}# + (cons (car #{w2 27699}#) + (let ((#{m2 27718}# + (cdr #{w2 27699}#))) + (if (null? #{m2 27718}#) + #{s1 27701}# + (append + #{s1 27701}# + #{m2 27718}#))))) + (cons (let ((#{m2 27726}# + (car #{w2 27699}#))) + (if (null? #{m2 27726}#) + #{m1 27700}# + (append + #{m1 27700}# + #{m2 27726}#))) + (let ((#{m2 27734}# + (cdr #{w2 27699}#))) + (if (null? #{m2 27734}#) + #{s1 27701}# + (append + #{s1 27701}# + #{m2 27734}#)))))))) + (#{module 27690}# + (vector-ref #{value 26048}# 3))) + (vector + 'syntax-object + #{expression 27688}# + #{wrap 27689}# + #{module 27690}#)) + (if (null? #{value 26048}#) + #{value 26048}# + (vector + 'syntax-object + #{value 26048}# + #{w 26051}# + #{mod 26053}#))))) + (if (eqv? #{type 26047}# 'syntax) (syntax-violation #f "reference to pattern variable outside syntax form" - (#{wrap 4326}# - (begin - (if (if (pair? #{e 22351}#) - #{s 22354}# + (let ((#{x 27769}# + (begin + (if (if (pair? #{e 26049}#) + #{s 26052}# + #f) + (set-source-properties! + #{e 26049}# + #{s 26052}#)) + #{e 26049}#))) + (if (if (null? (car #{w 26051}#)) + (null? (cdr #{w 26051}#)) + #f) + #{x 27769}# + (if (if (vector? #{x 27769}#) + (if (= (vector-length #{x 27769}#) + 4) + (eq? (vector-ref #{x 27769}# 0) + 'syntax-object) + #f) #f) - (set-source-properties! - #{e 22351}# - #{s 22354}#)) - #{e 22351}#) - #{w 22353}# - #{mod 22355}#)) - (if (eqv? #{type 22349}# 'displaced-lexical) + (let ((#{expression 27801}# + (vector-ref #{x 27769}# 1)) + (#{wrap 27802}# + (let ((#{w2 27810}# + (vector-ref + #{x 27769}# + 2))) + (let ((#{m1 27811}# + (car #{w 26051}#)) + (#{s1 27812}# + (cdr #{w 26051}#))) + (if (null? #{m1 27811}#) + (if (null? #{s1 27812}#) + #{w2 27810}# + (cons (car #{w2 27810}#) + (let ((#{m2 27827}# + (cdr #{w2 27810}#))) + (if (null? #{m2 27827}#) + #{s1 27812}# + (append + #{s1 27812}# + #{m2 27827}#))))) + (cons (let ((#{m2 27835}# + (car #{w2 27810}#))) + (if (null? #{m2 27835}#) + #{m1 27811}# + (append + #{m1 27811}# + #{m2 27835}#))) + (let ((#{m2 27843}# + (cdr #{w2 27810}#))) + (if (null? #{m2 27843}#) + #{s1 27812}# + (append + #{s1 27812}# + #{m2 27843}#)))))))) + (#{module 27803}# + (vector-ref #{x 27769}# 3))) + (vector + 'syntax-object + #{expression 27801}# + #{wrap 27802}# + #{module 27803}#)) + (if (null? #{x 27769}#) + #{x 27769}# + (vector + 'syntax-object + #{x 27769}# + #{w 26051}# + #{mod 26053}#)))))) + (if (eqv? #{type 26047}# 'displaced-lexical) (syntax-violation #f "reference to identifier outside its scope" - (#{wrap 4326}# - (begin - (if (if (pair? #{e 22351}#) - #{s 22354}# + (let ((#{x 27870}# + (begin + (if (if (pair? #{e 26049}#) + #{s 26052}# + #f) + (set-source-properties! + #{e 26049}# + #{s 26052}#)) + #{e 26049}#))) + (if (if (null? (car #{w 26051}#)) + (null? (cdr #{w 26051}#)) + #f) + #{x 27870}# + (if (if (vector? #{x 27870}#) + (if (= (vector-length + #{x 27870}#) + 4) + (eq? (vector-ref + #{x 27870}# + 0) + 'syntax-object) + #f) #f) - (set-source-properties! - #{e 22351}# - #{s 22354}#)) - #{e 22351}#) - #{w 22353}# - #{mod 22355}#)) + (let ((#{expression 27902}# + (vector-ref #{x 27870}# 1)) + (#{wrap 27903}# + (let ((#{w2 27911}# + (vector-ref + #{x 27870}# + 2))) + (let ((#{m1 27912}# + (car #{w 26051}#)) + (#{s1 27913}# + (cdr #{w 26051}#))) + (if (null? #{m1 27912}#) + (if (null? #{s1 27913}#) + #{w2 27911}# + (cons (car #{w2 27911}#) + (let ((#{m2 27928}# + (cdr #{w2 27911}#))) + (if (null? #{m2 27928}#) + #{s1 27913}# + (append + #{s1 27913}# + #{m2 27928}#))))) + (cons (let ((#{m2 27936}# + (car #{w2 27911}#))) + (if (null? #{m2 27936}#) + #{m1 27912}# + (append + #{m1 27912}# + #{m2 27936}#))) + (let ((#{m2 27944}# + (cdr #{w2 27911}#))) + (if (null? #{m2 27944}#) + #{s1 27913}# + (append + #{s1 27913}# + #{m2 27944}#)))))))) + (#{module 27904}# + (vector-ref #{x 27870}# 3))) + (vector + 'syntax-object + #{expression 27902}# + #{wrap 27903}# + #{module 27904}#)) + (if (null? #{x 27870}#) + #{x 27870}# + (vector + 'syntax-object + #{x 27870}# + #{w 26051}# + #{mod 26053}#)))))) (syntax-violation #f "unexpected syntax" - (#{wrap 4326}# - (begin - (if (if (pair? #{e 22351}#) - #{s 22354}# + (let ((#{x 27968}# + (begin + (if (if (pair? #{e 26049}#) + #{s 26052}# + #f) + (set-source-properties! + #{e 26049}# + #{s 26052}#)) + #{e 26049}#))) + (if (if (null? (car #{w 26051}#)) + (null? (cdr #{w 26051}#)) + #f) + #{x 27968}# + (if (if (vector? #{x 27968}#) + (if (= (vector-length + #{x 27968}#) + 4) + (eq? (vector-ref + #{x 27968}# + 0) + 'syntax-object) + #f) #f) - (set-source-properties! - #{e 22351}# - #{s 22354}#)) - #{e 22351}#) - #{w 22353}# - #{mod 22355}#)))))))))))))))))) - (#{expand-application 4335}# - (lambda (#{x 23547}# - #{e 23548}# - #{r 23549}# - #{w 23550}# - #{s 23551}# - #{mod 23552}#) - (let ((#{tmp 23554}# - ($sc-dispatch #{e 23548}# '(any . each-any)))) - (if #{tmp 23554}# + (let ((#{expression 28000}# + (vector-ref #{x 27968}# 1)) + (#{wrap 28001}# + (let ((#{w2 28009}# + (vector-ref + #{x 27968}# + 2))) + (let ((#{m1 28010}# + (car #{w 26051}#)) + (#{s1 28011}# + (cdr #{w 26051}#))) + (if (null? #{m1 28010}#) + (if (null? #{s1 28011}#) + #{w2 28009}# + (cons (car #{w2 28009}#) + (let ((#{m2 28026}# + (cdr #{w2 28009}#))) + (if (null? #{m2 28026}#) + #{s1 28011}# + (append + #{s1 28011}# + #{m2 28026}#))))) + (cons (let ((#{m2 28034}# + (car #{w2 28009}#))) + (if (null? #{m2 28034}#) + #{m1 28010}# + (append + #{m1 28010}# + #{m2 28034}#))) + (let ((#{m2 28042}# + (cdr #{w2 28009}#))) + (if (null? #{m2 28042}#) + #{s1 28011}# + (append + #{s1 28011}# + #{m2 28042}#)))))))) + (#{module 28002}# + (vector-ref #{x 27968}# 3))) + (vector + 'syntax-object + #{expression 28000}# + #{wrap 28001}# + #{module 28002}#)) + (if (null? #{x 27968}#) + #{x 27968}# + (vector + 'syntax-object + #{x 27968}# + #{w 26051}# + #{mod 26053}#)))))))))))))))))))))) + (#{expand-call 4445}# + (lambda (#{x 28057}# + #{e 28058}# + #{r 28059}# + #{w 28060}# + #{s 28061}# + #{mod 28062}#) + (let ((#{tmp 28064}# + ($sc-dispatch #{e 28058}# '(any . each-any)))) + (if #{tmp 28064}# (@apply - (lambda (#{e0 23558}# #{e1 23559}#) - (#{build-application 4268}# - #{s 23551}# - #{x 23547}# - (map (lambda (#{e 23644}#) - (#{expand 4333}# - #{e 23644}# - #{r 23549}# - #{w 23550}# - #{mod 23552}#)) - #{e1 23559}#))) - #{tmp 23554}#) + (lambda (#{e0 28068}# #{e1 28069}#) + (#{build-call 4377}# + #{s 28061}# + #{x 28057}# + (map (lambda (#{e 28161}#) + (#{expand 4443}# + #{e 28161}# + #{r 28059}# + #{w 28060}# + #{mod 28062}#)) + #{e1 28069}#))) + #{tmp 28064}#) (syntax-violation #f "source expression failed to match any pattern" - #{e 23548}#))))) - (#{expand-macro 4336}# - (lambda (#{p 23725}# - #{e 23726}# - #{r 23727}# - #{w 23728}# - #{s 23729}# - #{rib 23730}# - #{mod 23731}#) + #{e 28058}#))))) + (#{expand-macro 4446}# + (lambda (#{p 28249}# + #{e 28250}# + #{r 28251}# + #{w 28252}# + #{s 28253}# + #{rib 28254}# + #{mod 28255}#) (letrec* - ((#{rebuild-macro-output 23732}# - (lambda (#{x 23763}# #{m 23764}#) - (if (pair? #{x 23763}#) - (let ((#{e 23768}# - (cons (#{rebuild-macro-output 23732}# - (car #{x 23763}#) - #{m 23764}#) - (#{rebuild-macro-output 23732}# - (cdr #{x 23763}#) - #{m 23764}#)))) + ((#{rebuild-macro-output 28256}# + (lambda (#{x 28363}# #{m 28364}#) + (if (pair? #{x 28363}#) + (let ((#{e 28368}# + (cons (#{rebuild-macro-output 28256}# + (car #{x 28363}#) + #{m 28364}#) + (#{rebuild-macro-output 28256}# + (cdr #{x 28363}#) + #{m 28364}#)))) (begin - (if (if (pair? #{e 23768}#) #{s 23729}# #f) - (set-source-properties! #{e 23768}# #{s 23729}#)) - #{e 23768}#)) - (if (if (vector? #{x 23763}#) - (if (= (vector-length #{x 23763}#) 4) - (eq? (vector-ref #{x 23763}# 0) 'syntax-object) + (if (if (pair? #{e 28368}#) #{s 28253}# #f) + (set-source-properties! #{e 28368}# #{s 28253}#)) + #{e 28368}#)) + (if (if (vector? #{x 28363}#) + (if (= (vector-length #{x 28363}#) 4) + (eq? (vector-ref #{x 28363}# 0) 'syntax-object) #f) #f) - (let ((#{w 23784}# (vector-ref #{x 23763}# 2))) - (let ((#{ms 23785}# (car #{w 23784}#)) - (#{s 23786}# (cdr #{w 23784}#))) - (if (if (pair? #{ms 23785}#) - (eq? (car #{ms 23785}#) #f) + (let ((#{w 28384}# (vector-ref #{x 28363}# 2))) + (let ((#{ms 28385}# (car #{w 28384}#)) + (#{s 28386}# (cdr #{w 28384}#))) + (if (if (pair? #{ms 28385}#) + (eq? (car #{ms 28385}#) #f) #f) - (let ((#{expression 23794}# (vector-ref #{x 23763}# 1)) - (#{wrap 23795}# - (cons (cdr #{ms 23785}#) - (if #{rib 23730}# - (cons #{rib 23730}# (cdr #{s 23786}#)) - (cdr #{s 23786}#)))) - (#{module 23796}# (vector-ref #{x 23763}# 3))) + (let ((#{expression 28394}# (vector-ref #{x 28363}# 1)) + (#{wrap 28395}# + (cons (cdr #{ms 28385}#) + (if #{rib 28254}# + (cons #{rib 28254}# (cdr #{s 28386}#)) + (cdr #{s 28386}#)))) + (#{module 28396}# (vector-ref #{x 28363}# 3))) (vector 'syntax-object - #{expression 23794}# - #{wrap 23795}# - #{module 23796}#)) - (let ((#{expression 23806}# - (let ((#{e 23811}# (vector-ref #{x 23763}# 1))) + #{expression 28394}# + #{wrap 28395}# + #{module 28396}#)) + (let ((#{expression 28406}# + (let ((#{e 28411}# (vector-ref #{x 28363}# 1))) (begin - (if (if (pair? #{e 23811}#) #{s 23786}# #f) + (if (if (pair? #{e 28411}#) #{s 28386}# #f) (set-source-properties! - #{e 23811}# - #{s 23786}#)) - #{e 23811}#))) - (#{wrap 23807}# - (cons (cons #{m 23764}# #{ms 23785}#) - (if #{rib 23730}# - (cons #{rib 23730}# - (cons 'shift #{s 23786}#)) - (cons 'shift #{s 23786}#)))) - (#{module 23808}# (vector-ref #{x 23763}# 3))) + #{e 28411}# + #{s 28386}#)) + #{e 28411}#))) + (#{wrap 28407}# + (cons (cons #{m 28364}# #{ms 28385}#) + (if #{rib 28254}# + (cons #{rib 28254}# + (cons 'shift #{s 28386}#)) + (cons 'shift #{s 28386}#)))) + (#{module 28408}# (vector-ref #{x 28363}# 3))) (vector 'syntax-object - #{expression 23806}# - #{wrap 23807}# - #{module 23808}#))))) - (if (vector? #{x 23763}#) - (let ((#{n 23823}# (vector-length #{x 23763}#))) - (let ((#{v 23824}# - (let ((#{e 23832}# (make-vector #{n 23823}#))) + #{expression 28406}# + #{wrap 28407}# + #{module 28408}#))))) + (if (vector? #{x 28363}#) + (let ((#{n 28423}# (vector-length #{x 28363}#))) + (let ((#{v 28424}# + (let ((#{e 28432}# (make-vector #{n 28423}#))) (begin - (if (if (pair? #{e 23832}#) #{x 23763}# #f) + (if (if (pair? #{e 28432}#) #{x 28363}# #f) (set-source-properties! - #{e 23832}# - #{x 23763}#)) - #{e 23832}#)))) + #{e 28432}# + #{x 28363}#)) + #{e 28432}#)))) (letrec* - ((#{loop 23825}# - (lambda (#{i 23877}#) - (if (= #{i 23877}# #{n 23823}#) - #{v 23824}# + ((#{loop 28425}# + (lambda (#{i 28486}#) + (if (= #{i 28486}# #{n 28423}#) + #{v 28424}# (begin (vector-set! - #{v 23824}# - #{i 23877}# - (#{rebuild-macro-output 23732}# - (vector-ref #{x 23763}# #{i 23877}#) - #{m 23764}#)) - (#{loop 23825}# (#{1+}# #{i 23877}#))))))) - (#{loop 23825}# 0)))) - (if (symbol? #{x 23763}#) + #{v 28424}# + #{i 28486}# + (#{rebuild-macro-output 28256}# + (vector-ref #{x 28363}# #{i 28486}#) + #{m 28364}#)) + (#{loop 28425}# (#{1+}# #{i 28486}#))))))) + (#{loop 28425}# 0)))) + (if (symbol? #{x 28363}#) (syntax-violation #f "encountered raw symbol in macro output" - (let ((#{s 23883}# (cdr #{w 23728}#))) - (#{wrap 4326}# - (begin - (if (if (pair? #{e 23726}#) #{s 23883}# #f) - (set-source-properties! - #{e 23726}# - #{s 23883}#)) - #{e 23726}#) - #{w 23728}# - #{mod 23731}#)) - #{x 23763}#) + (let ((#{s 28492}# (cdr #{w 28252}#))) + (let ((#{x 28496}# + (begin + (if (if (pair? #{e 28250}#) #{s 28492}# #f) + (set-source-properties! + #{e 28250}# + #{s 28492}#)) + #{e 28250}#))) + (if (if (null? (car #{w 28252}#)) + (null? (cdr #{w 28252}#)) + #f) + #{x 28496}# + (if (if (vector? #{x 28496}#) + (if (= (vector-length #{x 28496}#) 4) + (eq? (vector-ref #{x 28496}# 0) + 'syntax-object) + #f) + #f) + (let ((#{expression 28528}# + (vector-ref #{x 28496}# 1)) + (#{wrap 28529}# + (let ((#{w2 28537}# + (vector-ref #{x 28496}# 2))) + (let ((#{m1 28538}# + (car #{w 28252}#)) + (#{s1 28539}# + (cdr #{w 28252}#))) + (if (null? #{m1 28538}#) + (if (null? #{s1 28539}#) + #{w2 28537}# + (cons (car #{w2 28537}#) + (let ((#{m2 28554}# + (cdr #{w2 28537}#))) + (if (null? #{m2 28554}#) + #{s1 28539}# + (append + #{s1 28539}# + #{m2 28554}#))))) + (cons (let ((#{m2 28562}# + (car #{w2 28537}#))) + (if (null? #{m2 28562}#) + #{m1 28538}# + (append + #{m1 28538}# + #{m2 28562}#))) + (let ((#{m2 28570}# + (cdr #{w2 28537}#))) + (if (null? #{m2 28570}#) + #{s1 28539}# + (append + #{s1 28539}# + #{m2 28570}#)))))))) + (#{module 28530}# + (vector-ref #{x 28496}# 3))) + (vector + 'syntax-object + #{expression 28528}# + #{wrap 28529}# + #{module 28530}#)) + (if (null? #{x 28496}#) + #{x 28496}# + (vector + 'syntax-object + #{x 28496}# + #{w 28252}# + #{mod 28255}#)))))) + #{x 28363}#) (begin - (if (if (pair? #{x 23763}#) #{s 23729}# #f) - (set-source-properties! #{x 23763}# #{s 23729}#)) - #{x 23763}#)))))))) - (#{rebuild-macro-output 23732}# - (#{p 23725}# - (let ((#{w 23739}# - (cons (cons #f (car #{w 23728}#)) - (cons 'shift (cdr #{w 23728}#))))) - (#{wrap 4326}# - (begin - (if (if (pair? #{e 23726}#) #{s 23729}# #f) - (set-source-properties! #{e 23726}# #{s 23729}#)) - #{e 23726}#) - #{w 23739}# - #{mod 23731}#))) + (if (if (pair? #{x 28363}#) #{s 28253}# #f) + (set-source-properties! #{x 28363}# #{s 28253}#)) + #{x 28363}#)))))))) + (#{rebuild-macro-output 28256}# + (#{p 28249}# + (let ((#{w 28263}# + (cons (cons #f (car #{w 28252}#)) + (cons 'shift (cdr #{w 28252}#))))) + (let ((#{x 28268}# + (begin + (if (if (pair? #{e 28250}#) #{s 28253}# #f) + (set-source-properties! #{e 28250}# #{s 28253}#)) + #{e 28250}#))) + (if (if (null? (car #{w 28263}#)) + (null? (cdr #{w 28263}#)) + #f) + #{x 28268}# + (if (if (vector? #{x 28268}#) + (if (= (vector-length #{x 28268}#) 4) + (eq? (vector-ref #{x 28268}# 0) 'syntax-object) + #f) + #f) + (let ((#{expression 28306}# (vector-ref #{x 28268}# 1)) + (#{wrap 28307}# + (let ((#{w2 28315}# (vector-ref #{x 28268}# 2))) + (let ((#{m1 28316}# (car #{w 28263}#)) + (#{s1 28317}# (cdr #{w 28263}#))) + (if (null? #{m1 28316}#) + (if (null? #{s1 28317}#) + #{w2 28315}# + (cons (car #{w2 28315}#) + (let ((#{m2 28332}# + (cdr #{w2 28315}#))) + (if (null? #{m2 28332}#) + #{s1 28317}# + (append + #{s1 28317}# + #{m2 28332}#))))) + (cons (let ((#{m2 28340}# + (car #{w2 28315}#))) + (if (null? #{m2 28340}#) + #{m1 28316}# + (append + #{m1 28316}# + #{m2 28340}#))) + (let ((#{m2 28348}# + (cdr #{w2 28315}#))) + (if (null? #{m2 28348}#) + #{s1 28317}# + (append + #{s1 28317}# + #{m2 28348}#)))))))) + (#{module 28308}# (vector-ref #{x 28268}# 3))) + (vector + 'syntax-object + #{expression 28306}# + #{wrap 28307}# + #{module 28308}#)) + (if (null? #{x 28268}#) + #{x 28268}# + (vector + 'syntax-object + #{x 28268}# + #{w 28263}# + #{mod 28255}#))))))) (gensym "m"))))) - (#{expand-body 4337}# - (lambda (#{body 23915}# - #{outer-form 23916}# - #{r 23917}# - #{w 23918}# - #{mod 23919}#) - (let ((#{r 23920}# - (cons '("placeholder" placeholder) #{r 23917}#))) - (let ((#{ribcage 23921}# (vector 'ribcage '() '() '()))) - (let ((#{w 23922}# - (cons (car #{w 23918}#) - (cons #{ribcage 23921}# (cdr #{w 23918}#))))) + (#{expand-body 4447}# + (lambda (#{body 28600}# + #{outer-form 28601}# + #{r 28602}# + #{w 28603}# + #{mod 28604}#) + (let ((#{r 28605}# + (cons '("placeholder" placeholder) #{r 28602}#))) + (let ((#{ribcage 28606}# (vector 'ribcage '() '() '()))) + (let ((#{w 28607}# + (cons (car #{w 28603}#) + (cons #{ribcage 28606}# (cdr #{w 28603}#))))) (letrec* - ((#{parse 23923}# - (lambda (#{body 23936}# - #{ids 23937}# - #{labels 23938}# - #{var-ids 23939}# - #{vars 23940}# - #{vals 23941}# - #{bindings 23942}#) - (if (null? #{body 23936}#) + ((#{parse 28608}# + (lambda (#{body 28716}# + #{ids 28717}# + #{labels 28718}# + #{var-ids 28719}# + #{vars 28720}# + #{vals 28721}# + #{bindings 28722}#) + (if (null? #{body 28716}#) (syntax-violation #f "no expressions in body" - #{outer-form 23916}#) - (let ((#{e 23943}# (cdr (car #{body 23936}#))) - (#{er 23944}# (car (car #{body 23936}#)))) + #{outer-form 28601}#) + (let ((#{e 28723}# (cdr (car #{body 28716}#))) + (#{er 28724}# (car (car #{body 28716}#)))) (call-with-values (lambda () - (#{syntax-type 4332}# - #{e 23943}# - #{er 23944}# + (#{syntax-type 4442}# + #{e 28723}# + #{er 28724}# '(()) - (#{source-annotation 4294}# #{er 23944}#) - #{ribcage 23921}# - #{mod 23919}# + (#{source-annotation 4404}# #{er 28724}#) + #{ribcage 28606}# + #{mod 28604}# #f)) - (lambda (#{type 24120}# - #{value 24121}# - #{e 24122}# - #{w 24123}# - #{s 24124}# - #{mod 24125}#) - (if (eqv? #{type 24120}# 'define-form) - (let ((#{id 24129}# - (#{wrap 4326}# - #{value 24121}# - #{w 24123}# - #{mod 24125}#)) - (#{label 24130}# + (lambda (#{type 28930}# + #{value 28931}# + #{e 28932}# + #{w 28933}# + #{s 28934}# + #{mod 28935}#) + (if (eqv? #{type 28930}# 'define-form) + (let ((#{id 28939}# + (if (if (null? (car #{w 28933}#)) + (null? (cdr #{w 28933}#)) + #f) + #{value 28931}# + (if (if (vector? #{value 28931}#) + (if (= (vector-length + #{value 28931}#) + 4) + (eq? (vector-ref + #{value 28931}# + 0) + 'syntax-object) + #f) + #f) + (let ((#{expression 28984}# + (vector-ref + #{value 28931}# + 1)) + (#{wrap 28985}# + (let ((#{w2 28995}# + (vector-ref + #{value 28931}# + 2))) + (let ((#{m1 28996}# + (car #{w 28933}#)) + (#{s1 28997}# + (cdr #{w 28933}#))) + (if (null? #{m1 28996}#) + (if (null? #{s1 28997}#) + #{w2 28995}# + (cons (car #{w2 28995}#) + (let ((#{m2 29014}# + (cdr #{w2 28995}#))) + (if (null? #{m2 29014}#) + #{s1 28997}# + (append + #{s1 28997}# + #{m2 29014}#))))) + (cons (let ((#{m2 29022}# + (car #{w2 28995}#))) + (if (null? #{m2 29022}#) + #{m1 28996}# + (append + #{m1 28996}# + #{m2 29022}#))) + (let ((#{m2 29030}# + (cdr #{w2 28995}#))) + (if (null? #{m2 29030}#) + #{s1 28997}# + (append + #{s1 28997}# + #{m2 29030}#)))))))) + (#{module 28986}# + (vector-ref + #{value 28931}# + 3))) + (vector + 'syntax-object + #{expression 28984}# + #{wrap 28985}# + #{module 28986}#)) + (if (null? #{value 28931}#) + #{value 28931}# + (vector + 'syntax-object + #{value 28931}# + #{w 28933}# + #{mod 28935}#))))) + (#{label 28940}# (symbol->string (gensym "i")))) - (let ((#{var 24131}# - (let ((#{id 24191}# - (if (if (vector? #{id 24129}#) + (let ((#{var 28941}# + (let ((#{id 29091}# + (if (if (vector? #{id 28939}#) (if (= (vector-length - #{id 24129}#) + #{id 28939}#) 4) (eq? (vector-ref - #{id 24129}# + #{id 28939}# 0) 'syntax-object) #f) #f) - (vector-ref #{id 24129}# 1) - #{id 24129}#))) + (vector-ref #{id 28939}# 1) + #{id 28939}#))) (gensym (string-append - (symbol->string #{id 24191}#) + (symbol->string #{id 29091}#) " "))))) (begin - (let ((#{update 24181}# - (cons (vector-ref #{id 24129}# 1) - (vector-ref - #{ribcage 23921}# - 1)))) - (vector-set! - #{ribcage 23921}# - 1 - #{update 24181}#)) - (let ((#{update 24183}# - (cons (car (vector-ref - #{id 24129}# - 2)) - (vector-ref - #{ribcage 23921}# - 2)))) - (vector-set! - #{ribcage 23921}# - 2 - #{update 24183}#)) - (let ((#{update 24185}# - (cons #{label 24130}# - (vector-ref - #{ribcage 23921}# - 3)))) - (vector-set! - #{ribcage 23921}# - 3 - #{update 24185}#)) - (#{parse 23923}# - (cdr #{body 23936}#) - (cons #{id 24129}# #{ids 23937}#) - (cons #{label 24130}# #{labels 23938}#) - (cons #{id 24129}# #{var-ids 23939}#) - (cons #{var 24131}# #{vars 23940}#) - (cons (cons #{er 23944}# - (#{wrap 4326}# - #{e 24122}# - #{w 24123}# - #{mod 24125}#)) - #{vals 23941}#) - (cons (cons 'lexical #{var 24131}#) - #{bindings 23942}#))))) - (if (eqv? #{type 24120}# 'define-syntax-form) - (let ((#{id 24219}# - (#{wrap 4326}# - #{value 24121}# - #{w 24123}# - #{mod 24125}#)) - (#{label 24220}# + (begin + (let ((#{update 28950}# + (cons (vector-ref #{id 28939}# 1) + (vector-ref + #{ribcage 28606}# + 1)))) + (vector-set! + #{ribcage 28606}# + 1 + #{update 28950}#)) + (let ((#{update 29062}# + (cons (car (vector-ref + #{id 28939}# + 2)) + (vector-ref + #{ribcage 28606}# + 2)))) + (vector-set! + #{ribcage 28606}# + 2 + #{update 29062}#)) + (let ((#{update 29077}# + (cons #{label 28940}# + (vector-ref + #{ribcage 28606}# + 3)))) + (vector-set! + #{ribcage 28606}# + 3 + #{update 29077}#))) + (#{parse 28608}# + (cdr #{body 28716}#) + (cons #{id 28939}# #{ids 28717}#) + (cons #{label 28940}# #{labels 28718}#) + (cons #{id 28939}# #{var-ids 28719}#) + (cons #{var 28941}# #{vars 28720}#) + (cons (cons #{er 28724}# + (if (if (null? (car #{w 28933}#)) + (null? (cdr #{w 28933}#)) + #f) + #{e 28932}# + (if (if (vector? + #{e 28932}#) + (if (= (vector-length + #{e 28932}#) + 4) + (eq? (vector-ref + #{e 28932}# + 0) + 'syntax-object) + #f) + #f) + (let ((#{expression 29143}# + (vector-ref + #{e 28932}# + 1)) + (#{wrap 29144}# + (let ((#{w2 29154}# + (vector-ref + #{e 28932}# + 2))) + (let ((#{m1 29155}# + (car #{w 28933}#)) + (#{s1 29156}# + (cdr #{w 28933}#))) + (if (null? #{m1 29155}#) + (if (null? #{s1 29156}#) + #{w2 29154}# + (cons (car #{w2 29154}#) + (let ((#{m2 29173}# + (cdr #{w2 29154}#))) + (if (null? #{m2 29173}#) + #{s1 29156}# + (append + #{s1 29156}# + #{m2 29173}#))))) + (cons (let ((#{m2 29181}# + (car #{w2 29154}#))) + (if (null? #{m2 29181}#) + #{m1 29155}# + (append + #{m1 29155}# + #{m2 29181}#))) + (let ((#{m2 29189}# + (cdr #{w2 29154}#))) + (if (null? #{m2 29189}#) + #{s1 29156}# + (append + #{s1 29156}# + #{m2 29189}#)))))))) + (#{module 29145}# + (vector-ref + #{e 28932}# + 3))) + (vector + 'syntax-object + #{expression 29143}# + #{wrap 29144}# + #{module 29145}#)) + (if (null? #{e 28932}#) + #{e 28932}# + (vector + 'syntax-object + #{e 28932}# + #{w 28933}# + #{mod 28935}#))))) + #{vals 28721}#) + (cons (cons 'lexical #{var 28941}#) + #{bindings 28722}#))))) + (if (if (eqv? #{type 28930}# 'define-syntax-form) + #t + (eqv? #{type 28930}# + 'define-syntax-parameter-form)) + (let ((#{id 29220}# + (if (if (null? (car #{w 28933}#)) + (null? (cdr #{w 28933}#)) + #f) + #{value 28931}# + (if (if (vector? #{value 28931}#) + (if (= (vector-length + #{value 28931}#) + 4) + (eq? (vector-ref + #{value 28931}# + 0) + 'syntax-object) + #f) + #f) + (let ((#{expression 29264}# + (vector-ref + #{value 28931}# + 1)) + (#{wrap 29265}# + (let ((#{w2 29275}# + (vector-ref + #{value 28931}# + 2))) + (let ((#{m1 29276}# + (car #{w 28933}#)) + (#{s1 29277}# + (cdr #{w 28933}#))) + (if (null? #{m1 29276}#) + (if (null? #{s1 29277}#) + #{w2 29275}# + (cons (car #{w2 29275}#) + (let ((#{m2 29294}# + (cdr #{w2 29275}#))) + (if (null? #{m2 29294}#) + #{s1 29277}# + (append + #{s1 29277}# + #{m2 29294}#))))) + (cons (let ((#{m2 29302}# + (car #{w2 29275}#))) + (if (null? #{m2 29302}#) + #{m1 29276}# + (append + #{m1 29276}# + #{m2 29302}#))) + (let ((#{m2 29310}# + (cdr #{w2 29275}#))) + (if (null? #{m2 29310}#) + #{s1 29277}# + (append + #{s1 29277}# + #{m2 29310}#)))))))) + (#{module 29266}# + (vector-ref + #{value 28931}# + 3))) + (vector + 'syntax-object + #{expression 29264}# + #{wrap 29265}# + #{module 29266}#)) + (if (null? #{value 28931}#) + #{value 28931}# + (vector + 'syntax-object + #{value 28931}# + #{w 28933}# + #{mod 28935}#))))) + (#{label 29221}# (symbol->string (gensym "i")))) (begin - (let ((#{update 24270}# - (cons (vector-ref #{id 24219}# 1) - (vector-ref - #{ribcage 23921}# - 1)))) - (vector-set! - #{ribcage 23921}# - 1 - #{update 24270}#)) - (let ((#{update 24272}# - (cons (car (vector-ref - #{id 24219}# - 2)) - (vector-ref - #{ribcage 23921}# - 2)))) - (vector-set! - #{ribcage 23921}# - 2 - #{update 24272}#)) - (let ((#{update 24274}# - (cons #{label 24220}# - (vector-ref - #{ribcage 23921}# - 3)))) - (vector-set! - #{ribcage 23921}# - 3 - #{update 24274}#)) - (#{parse 23923}# - (cdr #{body 23936}#) - (cons #{id 24219}# #{ids 23937}#) - (cons #{label 24220}# #{labels 23938}#) - #{var-ids 23939}# - #{vars 23940}# - #{vals 23941}# - (cons (cons 'macro - (cons #{er 23944}# - (#{wrap 4326}# - #{e 24122}# - #{w 24123}# - #{mod 24125}#))) - #{bindings 23942}#)))) - (if (eqv? #{type 24120}# 'begin-form) - (let ((#{tmp 24282}# + (begin + (let ((#{update 29230}# + (cons (vector-ref #{id 29220}# 1) + (vector-ref + #{ribcage 28606}# + 1)))) + (vector-set! + #{ribcage 28606}# + 1 + #{update 29230}#)) + (let ((#{update 29342}# + (cons (car (vector-ref + #{id 29220}# + 2)) + (vector-ref + #{ribcage 28606}# + 2)))) + (vector-set! + #{ribcage 28606}# + 2 + #{update 29342}#)) + (let ((#{update 29357}# + (cons #{label 29221}# + (vector-ref + #{ribcage 28606}# + 3)))) + (vector-set! + #{ribcage 28606}# + 3 + #{update 29357}#))) + (#{parse 28608}# + (cdr #{body 28716}#) + (cons #{id 29220}# #{ids 28717}#) + (cons #{label 29221}# #{labels 28718}#) + #{var-ids 28719}# + #{vars 28720}# + #{vals 28721}# + (cons (cons (if (eq? #{type 28930}# + 'define-syntax-parameter-form) + 'syntax-parameter + 'macro) + (cons #{er 28724}# + (if (if (null? (car #{w 28933}#)) + (null? (cdr #{w 28933}#)) + #f) + #{e 28932}# + (if (if (vector? + #{e 28932}#) + (if (= (vector-length + #{e 28932}#) + 4) + (eq? (vector-ref + #{e 28932}# + 0) + 'syntax-object) + #f) + #f) + (let ((#{expression 29396}# + (vector-ref + #{e 28932}# + 1)) + (#{wrap 29397}# + (let ((#{w2 29407}# + (vector-ref + #{e 28932}# + 2))) + (let ((#{m1 29408}# + (car #{w 28933}#)) + (#{s1 29409}# + (cdr #{w 28933}#))) + (if (null? #{m1 29408}#) + (if (null? #{s1 29409}#) + #{w2 29407}# + (cons (car #{w2 29407}#) + (let ((#{m2 29426}# + (cdr #{w2 29407}#))) + (if (null? #{m2 29426}#) + #{s1 29409}# + (append + #{s1 29409}# + #{m2 29426}#))))) + (cons (let ((#{m2 29434}# + (car #{w2 29407}#))) + (if (null? #{m2 29434}#) + #{m1 29408}# + (append + #{m1 29408}# + #{m2 29434}#))) + (let ((#{m2 29442}# + (cdr #{w2 29407}#))) + (if (null? #{m2 29442}#) + #{s1 29409}# + (append + #{s1 29409}# + #{m2 29442}#)))))))) + (#{module 29398}# + (vector-ref + #{e 28932}# + 3))) + (vector + 'syntax-object + #{expression 29396}# + #{wrap 29397}# + #{module 29398}#)) + (if (null? #{e 28932}#) + #{e 28932}# + (vector + 'syntax-object + #{e 28932}# + #{w 28933}# + #{mod 28935}#)))))) + #{bindings 28722}#)))) + (if (eqv? #{type 28930}# 'begin-form) + (let ((#{tmp 29469}# ($sc-dispatch - #{e 24122}# + #{e 28932}# '(_ . each-any)))) - (if #{tmp 24282}# + (if #{tmp 29469}# (@apply - (lambda (#{e1 24286}#) - (#{parse 23923}# + (lambda (#{e1 29473}#) + (#{parse 28608}# (letrec* - ((#{f 24287}# - (lambda (#{forms 24350}#) - (if (null? #{forms 24350}#) - (cdr #{body 23936}#) - (cons (cons #{er 23944}# - (#{wrap 4326}# - (car #{forms 24350}#) - #{w 24123}# - #{mod 24125}#)) - (#{f 24287}# - (cdr #{forms 24350}#))))))) - (#{f 24287}# #{e1 24286}#)) - #{ids 23937}# - #{labels 23938}# - #{var-ids 23939}# - #{vars 23940}# - #{vals 23941}# - #{bindings 23942}#)) - #{tmp 24282}#) + ((#{f 29474}# + (lambda (#{forms 29690}#) + (if (null? #{forms 29690}#) + (cdr #{body 28716}#) + (cons (cons #{er 28724}# + (let ((#{x 29694}# + (car #{forms 29690}#))) + (if (if (null? (car #{w 28933}#)) + (null? (cdr #{w 28933}#)) + #f) + #{x 29694}# + (if (if (vector? + #{x 29694}#) + (if (= (vector-length + #{x 29694}#) + 4) + (eq? (vector-ref + #{x 29694}# + 0) + 'syntax-object) + #f) + #f) + (let ((#{expression 29712}# + (vector-ref + #{x 29694}# + 1)) + (#{wrap 29713}# + (let ((#{w2 29721}# + (vector-ref + #{x 29694}# + 2))) + (let ((#{m1 29722}# + (car #{w 28933}#)) + (#{s1 29723}# + (cdr #{w 28933}#))) + (if (null? #{m1 29722}#) + (if (null? #{s1 29723}#) + #{w2 29721}# + (cons (car #{w2 29721}#) + (let ((#{m2 29738}# + (cdr #{w2 29721}#))) + (if (null? #{m2 29738}#) + #{s1 29723}# + (append + #{s1 29723}# + #{m2 29738}#))))) + (cons (let ((#{m2 29746}# + (car #{w2 29721}#))) + (if (null? #{m2 29746}#) + #{m1 29722}# + (append + #{m1 29722}# + #{m2 29746}#))) + (let ((#{m2 29754}# + (cdr #{w2 29721}#))) + (if (null? #{m2 29754}#) + #{s1 29723}# + (append + #{s1 29723}# + #{m2 29754}#)))))))) + (#{module 29714}# + (vector-ref + #{x 29694}# + 3))) + (vector + 'syntax-object + #{expression 29712}# + #{wrap 29713}# + #{module 29714}#)) + (if (null? #{x 29694}#) + #{x 29694}# + (vector + 'syntax-object + #{x 29694}# + #{w 28933}# + #{mod 28935}#)))))) + (#{f 29474}# + (cdr #{forms 29690}#))))))) + (#{f 29474}# #{e1 29473}#)) + #{ids 28717}# + #{labels 28718}# + #{var-ids 28719}# + #{vars 28720}# + #{vals 28721}# + #{bindings 28722}#)) + #{tmp 29469}#) (syntax-violation #f "source expression failed to match any pattern" - #{e 24122}#))) - (if (eqv? #{type 24120}# 'local-syntax-form) - (#{expand-local-syntax 4338}# - #{value 24121}# - #{e 24122}# - #{er 23944}# - #{w 24123}# - #{s 24124}# - #{mod 24125}# - (lambda (#{forms 24364}# - #{er 24365}# - #{w 24366}# - #{s 24367}# - #{mod 24368}#) - (#{parse 23923}# + #{e 28932}#))) + (if (eqv? #{type 28930}# 'local-syntax-form) + (#{expand-local-syntax 4448}# + #{value 28931}# + #{e 28932}# + #{er 28724}# + #{w 28933}# + #{s 28934}# + #{mod 28935}# + (lambda (#{forms 29780}# + #{er 29781}# + #{w 29782}# + #{s 29783}# + #{mod 29784}#) + (#{parse 28608}# (letrec* - ((#{f 24369}# - (lambda (#{forms 24432}#) - (if (null? #{forms 24432}#) - (cdr #{body 23936}#) - (cons (cons #{er 24365}# - (#{wrap 4326}# - (car #{forms 24432}#) - #{w 24366}# - #{mod 24368}#)) - (#{f 24369}# - (cdr #{forms 24432}#))))))) - (#{f 24369}# #{forms 24364}#)) - #{ids 23937}# - #{labels 23938}# - #{var-ids 23939}# - #{vars 23940}# - #{vals 23941}# - #{bindings 23942}#))) - (if (null? #{ids 23937}#) - (#{build-sequence 4282}# + ((#{f 29785}# + (lambda (#{forms 30001}#) + (if (null? #{forms 30001}#) + (cdr #{body 28716}#) + (cons (cons #{er 29781}# + (let ((#{x 30005}# + (car #{forms 30001}#))) + (if (if (null? (car #{w 29782}#)) + (null? (cdr #{w 29782}#)) + #f) + #{x 30005}# + (if (if (vector? + #{x 30005}#) + (if (= (vector-length + #{x 30005}#) + 4) + (eq? (vector-ref + #{x 30005}# + 0) + 'syntax-object) + #f) + #f) + (let ((#{expression 30023}# + (vector-ref + #{x 30005}# + 1)) + (#{wrap 30024}# + (let ((#{w2 30032}# + (vector-ref + #{x 30005}# + 2))) + (let ((#{m1 30033}# + (car #{w 29782}#)) + (#{s1 30034}# + (cdr #{w 29782}#))) + (if (null? #{m1 30033}#) + (if (null? #{s1 30034}#) + #{w2 30032}# + (cons (car #{w2 30032}#) + (let ((#{m2 30049}# + (cdr #{w2 30032}#))) + (if (null? #{m2 30049}#) + #{s1 30034}# + (append + #{s1 30034}# + #{m2 30049}#))))) + (cons (let ((#{m2 30057}# + (car #{w2 30032}#))) + (if (null? #{m2 30057}#) + #{m1 30033}# + (append + #{m1 30033}# + #{m2 30057}#))) + (let ((#{m2 30065}# + (cdr #{w2 30032}#))) + (if (null? #{m2 30065}#) + #{s1 30034}# + (append + #{s1 30034}# + #{m2 30065}#)))))))) + (#{module 30025}# + (vector-ref + #{x 30005}# + 3))) + (vector + 'syntax-object + #{expression 30023}# + #{wrap 30024}# + #{module 30025}#)) + (if (null? #{x 30005}#) + #{x 30005}# + (vector + 'syntax-object + #{x 30005}# + #{w 29782}# + #{mod 29784}#)))))) + (#{f 29785}# + (cdr #{forms 30001}#))))))) + (#{f 29785}# #{forms 29780}#)) + #{ids 28717}# + #{labels 28718}# + #{var-ids 28719}# + #{vars 28720}# + #{vals 28721}# + #{bindings 28722}#))) + (if (null? #{ids 28717}#) + (#{build-sequence 4392}# #f - (map (lambda (#{x 24502}#) - (#{expand 4333}# - (cdr #{x 24502}#) - (car #{x 24502}#) + (map (lambda (#{x 30154}#) + (#{expand 4443}# + (cdr #{x 30154}#) + (car #{x 30154}#) '(()) - #{mod 24125}#)) - (cons (cons #{er 23944}# - (#{wrap 4326}# - (begin - (if (if (pair? #{e 24122}#) - #{s 24124}# + #{mod 28935}#)) + (cons (cons #{er 28724}# + (let ((#{x 30233}# + (begin + (if (if (pair? #{e 28932}#) + #{s 28934}# + #f) + (set-source-properties! + #{e 28932}# + #{s 28934}#)) + #{e 28932}#))) + (if (if (null? (car #{w 28933}#)) + (null? (cdr #{w 28933}#)) + #f) + #{x 30233}# + (if (if (vector? + #{x 30233}#) + (if (= (vector-length + #{x 30233}#) + 4) + (eq? (vector-ref + #{x 30233}# + 0) + 'syntax-object) + #f) #f) - (set-source-properties! - #{e 24122}# - #{s 24124}#)) - #{e 24122}#) - #{w 24123}# - #{mod 24125}#)) - (cdr #{body 23936}#)))) + (let ((#{expression 30265}# + (vector-ref + #{x 30233}# + 1)) + (#{wrap 30266}# + (let ((#{w2 30274}# + (vector-ref + #{x 30233}# + 2))) + (let ((#{m1 30275}# + (car #{w 28933}#)) + (#{s1 30276}# + (cdr #{w 28933}#))) + (if (null? #{m1 30275}#) + (if (null? #{s1 30276}#) + #{w2 30274}# + (cons (car #{w2 30274}#) + (let ((#{m2 30291}# + (cdr #{w2 30274}#))) + (if (null? #{m2 30291}#) + #{s1 30276}# + (append + #{s1 30276}# + #{m2 30291}#))))) + (cons (let ((#{m2 30299}# + (car #{w2 30274}#))) + (if (null? #{m2 30299}#) + #{m1 30275}# + (append + #{m1 30275}# + #{m2 30299}#))) + (let ((#{m2 30307}# + (cdr #{w2 30274}#))) + (if (null? #{m2 30307}#) + #{s1 30276}# + (append + #{s1 30276}# + #{m2 30307}#)))))))) + (#{module 30267}# + (vector-ref + #{x 30233}# + 3))) + (vector + 'syntax-object + #{expression 30265}# + #{wrap 30266}# + #{module 30267}#)) + (if (null? #{x 30233}#) + #{x 30233}# + (vector + 'syntax-object + #{x 30233}# + #{w 28933}# + #{mod 28935}#)))))) + (cdr #{body 28716}#)))) (begin - (if (not (#{valid-bound-ids? 4323}# - #{ids 23937}#)) + (if (not (#{valid-bound-ids? 4433}# + #{ids 28717}#)) (syntax-violation #f "invalid or duplicate identifier in definition" - #{outer-form 23916}#)) + #{outer-form 28601}#)) (letrec* - ((#{loop 24664}# - (lambda (#{bs 24667}# - #{er-cache 24668}# - #{r-cache 24669}#) - (if (not (null? #{bs 24667}#)) - (let ((#{b 24670}# - (car #{bs 24667}#))) - (if (eq? (car #{b 24670}#) - 'macro) - (let ((#{er 24672}# - (car (cdr #{b 24670}#)))) - (let ((#{r-cache 24673}# - (if (eq? #{er 24672}# - #{er-cache 24668}#) - #{r-cache 24669}# - (#{macros-only-env 4297}# - #{er 24672}#)))) + ((#{loop 30406}# + (lambda (#{bs 30409}# + #{er-cache 30410}# + #{r-cache 30411}#) + (if (not (null? #{bs 30409}#)) + (let ((#{b 30412}# + (car #{bs 30409}#))) + (if (let ((#{t 30415}# + (car #{b 30412}#))) + (if (eq? #{t 30415}# + 'macro) + #t + (eq? #{t 30415}# + 'syntax-parameter))) + (let ((#{er 30417}# + (car (cdr #{b 30412}#)))) + (let ((#{r-cache 30418}# + (if (eq? #{er 30417}# + #{er-cache 30410}#) + #{r-cache 30411}# + (#{macros-only-env 4407}# + #{er 30417}#)))) (begin (set-cdr! - #{b 24670}# - (#{eval-local-transformer 4339}# - (#{expand 4333}# - (cdr (cdr #{b 24670}#)) - #{r-cache 24673}# + #{b 30412}# + (#{eval-local-transformer 4449}# + (#{expand 4443}# + (cdr (cdr #{b 30412}#)) + #{r-cache 30418}# '(()) - #{mod 24125}#) - #{mod 24125}#)) - (#{loop 24664}# - (cdr #{bs 24667}#) - #{er 24672}# - #{r-cache 24673}#)))) - (#{loop 24664}# - (cdr #{bs 24667}#) - #{er-cache 24668}# - #{r-cache 24669}#))))))) - (#{loop 24664}# - #{bindings 23942}# + #{mod 28935}#) + #{mod 28935}#)) + (if (eq? (car #{b 30412}#) + 'syntax-parameter) + (set-cdr! + #{b 30412}# + (list (cdr #{b 30412}#)))) + (#{loop 30406}# + (cdr #{bs 30409}#) + #{er 30417}# + #{r-cache 30418}#)))) + (#{loop 30406}# + (cdr #{bs 30409}#) + #{er-cache 30410}# + #{r-cache 30411}#))))))) + (#{loop 30406}# + #{bindings 28722}# #f #f)) (set-cdr! - #{r 23920}# - (#{extend-env 4295}# - #{labels 23938}# - #{bindings 23942}# - (cdr #{r 23920}#))) - (#{build-letrec 4285}# + #{r 28605}# + (#{extend-env 4405}# + #{labels 28718}# + #{bindings 28722}# + (cdr #{r 28605}#))) + (#{build-letrec 4395}# #f #t (reverse (map syntax->datum - #{var-ids 23939}#)) - (reverse #{vars 23940}#) - (map (lambda (#{x 25026}#) - (#{expand 4333}# - (cdr #{x 25026}#) - (car #{x 25026}#) + #{var-ids 28719}#)) + (reverse #{vars 28720}#) + (map (lambda (#{x 30846}#) + (#{expand 4443}# + (cdr #{x 30846}#) + (car #{x 30846}#) '(()) - #{mod 24125}#)) - (reverse #{vals 23941}#)) - (#{build-sequence 4282}# + #{mod 28935}#)) + (reverse #{vals 28721}#)) + (#{build-sequence 4392}# #f - (map (lambda (#{x 25156}#) - (#{expand 4333}# - (cdr #{x 25156}#) - (car #{x 25156}#) + (map (lambda (#{x 30990}#) + (#{expand 4443}# + (cdr #{x 30990}#) + (car #{x 30990}#) '(()) - #{mod 24125}#)) - (cons (cons #{er 23944}# - (#{wrap 4326}# - (begin - (if (if (pair? #{e 24122}#) - #{s 24124}# + #{mod 28935}#)) + (cons (cons #{er 28724}# + (let ((#{x 31069}# + (begin + (if (if (pair? #{e 28932}#) + #{s 28934}# + #f) + (set-source-properties! + #{e 28932}# + #{s 28934}#)) + #{e 28932}#))) + (if (if (null? (car #{w 28933}#)) + (null? (cdr #{w 28933}#)) + #f) + #{x 31069}# + (if (if (vector? + #{x 31069}#) + (if (= (vector-length + #{x 31069}#) + 4) + (eq? (vector-ref + #{x 31069}# + 0) + 'syntax-object) + #f) #f) - (set-source-properties! - #{e 24122}# - #{s 24124}#)) - #{e 24122}#) - #{w 24123}# - #{mod 24125}#)) - (cdr #{body 23936}#)))))))))))))))))) - (#{parse 23923}# - (map (lambda (#{x 23926}#) - (cons #{r 23920}# - (#{wrap 4326}# - #{x 23926}# - #{w 23922}# - #{mod 23919}#))) - #{body 23915}#) + (let ((#{expression 31101}# + (vector-ref + #{x 31069}# + 1)) + (#{wrap 31102}# + (let ((#{w2 31110}# + (vector-ref + #{x 31069}# + 2))) + (let ((#{m1 31111}# + (car #{w 28933}#)) + (#{s1 31112}# + (cdr #{w 28933}#))) + (if (null? #{m1 31111}#) + (if (null? #{s1 31112}#) + #{w2 31110}# + (cons (car #{w2 31110}#) + (let ((#{m2 31127}# + (cdr #{w2 31110}#))) + (if (null? #{m2 31127}#) + #{s1 31112}# + (append + #{s1 31112}# + #{m2 31127}#))))) + (cons (let ((#{m2 31135}# + (car #{w2 31110}#))) + (if (null? #{m2 31135}#) + #{m1 31111}# + (append + #{m1 31111}# + #{m2 31135}#))) + (let ((#{m2 31143}# + (cdr #{w2 31110}#))) + (if (null? #{m2 31143}#) + #{s1 31112}# + (append + #{s1 31112}# + #{m2 31143}#)))))))) + (#{module 31103}# + (vector-ref + #{x 31069}# + 3))) + (vector + 'syntax-object + #{expression 31101}# + #{wrap 31102}# + #{module 31103}#)) + (if (null? #{x 31069}#) + #{x 31069}# + (vector + 'syntax-object + #{x 31069}# + #{w 28933}# + #{mod 28935}#)))))) + (cdr #{body 28716}#)))))))))))))))))) + (#{parse 28608}# + (map (lambda (#{x 28611}#) + (cons #{r 28605}# + (if (if (null? (car #{w 28607}#)) + (null? (cdr #{w 28607}#)) + #f) + #{x 28611}# + (if (if (vector? #{x 28611}#) + (if (= (vector-length #{x 28611}#) 4) + (eq? (vector-ref #{x 28611}# 0) + 'syntax-object) + #f) + #f) + (let ((#{expression 28647}# + (vector-ref #{x 28611}# 1)) + (#{wrap 28648}# + (let ((#{w2 28658}# + (vector-ref #{x 28611}# 2))) + (let ((#{m1 28659}# + (car #{w 28607}#)) + (#{s1 28660}# + (cdr #{w 28607}#))) + (if (null? #{m1 28659}#) + (if (null? #{s1 28660}#) + #{w2 28658}# + (cons (car #{w2 28658}#) + (let ((#{m2 28677}# + (cdr #{w2 28658}#))) + (if (null? #{m2 28677}#) + #{s1 28660}# + (append + #{s1 28660}# + #{m2 28677}#))))) + (cons (let ((#{m2 28685}# + (car #{w2 28658}#))) + (if (null? #{m2 28685}#) + #{m1 28659}# + (append + #{m1 28659}# + #{m2 28685}#))) + (let ((#{m2 28693}# + (cdr #{w2 28658}#))) + (if (null? #{m2 28693}#) + #{s1 28660}# + (append + #{s1 28660}# + #{m2 28693}#)))))))) + (#{module 28649}# + (vector-ref #{x 28611}# 3))) + (vector + 'syntax-object + #{expression 28647}# + #{wrap 28648}# + #{module 28649}#)) + (if (null? #{x 28611}#) + #{x 28611}# + (vector + 'syntax-object + #{x 28611}# + #{w 28607}# + #{mod 28604}#)))))) + #{body 28600}#) '() '() '() '() '() '()))))))) - (#{expand-local-syntax 4338}# - (lambda (#{rec? 25241}# - #{e 25242}# - #{r 25243}# - #{w 25244}# - #{s 25245}# - #{mod 25246}# - #{k 25247}#) - (let ((#{tmp 25249}# + (#{expand-local-syntax 4448}# + (lambda (#{rec? 31158}# + #{e 31159}# + #{r 31160}# + #{w 31161}# + #{s 31162}# + #{mod 31163}# + #{k 31164}#) + (let ((#{tmp 31166}# ($sc-dispatch - #{e 25242}# + #{e 31159}# '(_ #(each (any any)) any . each-any)))) - (if #{tmp 25249}# + (if #{tmp 31166}# (@apply - (lambda (#{id 25253}# - #{val 25254}# - #{e1 25255}# - #{e2 25256}#) - (if (not (#{valid-bound-ids? 4323}# #{id 25253}#)) + (lambda (#{id 31170}# + #{val 31171}# + #{e1 31172}# + #{e2 31173}#) + (if (not (#{valid-bound-ids? 4433}# #{id 31170}#)) (syntax-violation #f "duplicate bound keyword" - #{e 25242}#) - (let ((#{labels 25346}# - (#{gen-labels 4304}# #{id 25253}#))) - (let ((#{new-w 25347}# - (#{make-binding-wrap 4315}# - #{id 25253}# - #{labels 25346}# - #{w 25244}#))) - (#{k 25247}# - (cons #{e1 25255}# #{e2 25256}#) - (#{extend-env 4295}# - #{labels 25346}# - (let ((#{trans-r 25385}# - (#{macros-only-env 4297}# #{r 25243}#))) + #{e 31159}#) + (let ((#{labels 31270}# + (#{gen-labels 4413}# #{id 31170}#))) + (let ((#{new-w 31271}# + (#{make-binding-wrap 4424}# + #{id 31170}# + #{labels 31270}# + #{w 31161}#))) + (#{k 31164}# + (cons #{e1 31172}# #{e2 31173}#) + (#{extend-env 4405}# + #{labels 31270}# + (let ((#{trans-r 31311}# + (#{macros-only-env 4407}# #{r 31160}#))) (begin - (if #{rec? 25241}# (if #f #f)) - (map (lambda (#{x 25386}#) + (if #{rec? 31158}# (if #f #f)) + (map (lambda (#{x 31312}#) (cons 'macro - (#{eval-local-transformer 4339}# - (#{expand 4333}# - #{x 25386}# - #{trans-r 25385}# - (if #{rec? 25241}# - #{new-w 25347}# - #{w 25244}#) - #{mod 25246}#) - #{mod 25246}#))) - #{val 25254}#))) - #{r 25243}#) - #{new-w 25347}# - #{s 25245}# - #{mod 25246}#))))) - #{tmp 25249}#) + (#{eval-local-transformer 4449}# + (#{expand 4443}# + #{x 31312}# + #{trans-r 31311}# + (if #{rec? 31158}# + #{new-w 31271}# + #{w 31161}#) + #{mod 31163}#) + #{mod 31163}#))) + #{val 31171}#))) + #{r 31160}#) + #{new-w 31271}# + #{s 31162}# + #{mod 31163}#))))) + #{tmp 31166}#) (syntax-violation #f "bad local syntax definition" - (#{wrap 4326}# - (begin - (if (if (pair? #{e 25242}#) #{s 25245}# #f) - (set-source-properties! #{e 25242}# #{s 25245}#)) - #{e 25242}#) - #{w 25244}# - #{mod 25246}#)))))) - (#{eval-local-transformer 4339}# - (lambda (#{expanded 25687}# #{mod 25688}#) - (let ((#{p 25689}# (primitive-eval #{expanded 25687}#))) - (if (procedure? #{p 25689}#) - #{p 25689}# + (let ((#{x 31645}# + (begin + (if (if (pair? #{e 31159}#) #{s 31162}# #f) + (set-source-properties! #{e 31159}# #{s 31162}#)) + #{e 31159}#))) + (if (if (null? (car #{w 31161}#)) + (null? (cdr #{w 31161}#)) + #f) + #{x 31645}# + (if (if (vector? #{x 31645}#) + (if (= (vector-length #{x 31645}#) 4) + (eq? (vector-ref #{x 31645}# 0) 'syntax-object) + #f) + #f) + (let ((#{expression 31677}# (vector-ref #{x 31645}# 1)) + (#{wrap 31678}# + (let ((#{w2 31686}# (vector-ref #{x 31645}# 2))) + (let ((#{m1 31687}# (car #{w 31161}#)) + (#{s1 31688}# (cdr #{w 31161}#))) + (if (null? #{m1 31687}#) + (if (null? #{s1 31688}#) + #{w2 31686}# + (cons (car #{w2 31686}#) + (let ((#{m2 31703}# + (cdr #{w2 31686}#))) + (if (null? #{m2 31703}#) + #{s1 31688}# + (append + #{s1 31688}# + #{m2 31703}#))))) + (cons (let ((#{m2 31711}# (car #{w2 31686}#))) + (if (null? #{m2 31711}#) + #{m1 31687}# + (append #{m1 31687}# #{m2 31711}#))) + (let ((#{m2 31719}# (cdr #{w2 31686}#))) + (if (null? #{m2 31719}#) + #{s1 31688}# + (append + #{s1 31688}# + #{m2 31719}#)))))))) + (#{module 31679}# (vector-ref #{x 31645}# 3))) + (vector + 'syntax-object + #{expression 31677}# + #{wrap 31678}# + #{module 31679}#)) + (if (null? #{x 31645}#) + #{x 31645}# + (vector + 'syntax-object + #{x 31645}# + #{w 31161}# + #{mod 31163}#)))))))))) + (#{eval-local-transformer 4449}# + (lambda (#{expanded 31737}# #{mod 31738}#) + (let ((#{p 31739}# (primitive-eval #{expanded 31737}#))) + (if (procedure? #{p 31739}#) + #{p 31739}# (syntax-violation #f "nonprocedure transformer" - #{p 25689}#))))) - (#{ellipsis? 4341}# - (lambda (#{x 5147}#) - (if (if (if (vector? #{x 5147}#) - (if (= (vector-length #{x 5147}#) 4) - (eq? (vector-ref #{x 5147}# 0) 'syntax-object) + #{p 31739}#))))) + (#{ellipsis? 4451}# + (lambda (#{x 6020}#) + (if (if (if (vector? #{x 6020}#) + (if (= (vector-length #{x 6020}#) 4) + (eq? (vector-ref #{x 6020}# 0) 'syntax-object) #f) #f) - (symbol? (vector-ref #{x 5147}# 1)) + (symbol? (vector-ref #{x 6020}# 1)) #f) - (if (eq? (if (if (vector? #{x 5147}#) - (if (= (vector-length #{x 5147}#) 4) - (eq? (vector-ref #{x 5147}# 0) 'syntax-object) - #f) - #f) - (vector-ref #{x 5147}# 1) - #{x 5147}#) - (if (if (= (vector-length - '#(syntax-object - ... - ((top) - #(ribcage () () ()) - #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i2218")) - #(ribcage - (lambda-var-list - gen-var - strip - expand-lambda-case - lambda*-formals - expand-simple-lambda - lambda-formals - ellipsis? - expand-void - eval-local-transformer - expand-local-syntax - expand-body - expand-macro - expand-application - expand-expr - expand - syntax-type - parse-when-list - expand-install-global - expand-top-sequence - expand-sequence - source-wrap - wrap - bound-id-member? - distinct-bound-ids? - valid-bound-ids? - bound-id=? - free-id=? - id-var-name - same-marks? - join-marks - join-wraps - smart-append - make-binding-wrap - extend-ribcage! - make-empty-ribcage - new-mark - anti-mark - the-anti-mark - top-marked? - top-wrap - empty-wrap - set-ribcage-labels! - set-ribcage-marks! - set-ribcage-symnames! - ribcage-labels - ribcage-marks - ribcage-symnames - ribcage? - make-ribcage - gen-labels - gen-label - make-rename - rename-marks - rename-new - rename-old - subst-rename? - wrap-subst - wrap-marks - make-wrap - id-sym-name&marks - id-sym-name - id? - nonsymbol-id? - global-extend - lookup - macros-only-env - extend-var-env - extend-env - null-env - binding-value - binding-type - make-binding - arg-check - source-annotation - no-source - set-syntax-object-module! - set-syntax-object-wrap! - set-syntax-object-expression! - syntax-object-module - syntax-object-wrap - syntax-object-expression - syntax-object? - make-syntax-object - build-lexical-var - build-letrec - build-named-let - build-let - build-sequence - build-data - build-primref - build-lambda-case - build-case-lambda - build-simple-lambda - build-global-definition - build-global-assignment - build-global-reference - analyze-variable - build-lexical-assignment - build-lexical-reference - build-dynlet - build-conditional - build-application - build-void - maybe-name-value! - decorate-source - get-global-definition-hook - put-global-definition-hook - gensym-hook - local-eval-hook - top-level-eval-hook - fx< - fx= - fx- - fx+ - set-lambda-meta! - lambda-meta - lambda? - make-dynlet - make-letrec - make-let - make-lambda-case - make-lambda - make-sequence - make-application - make-conditional - make-toplevel-define - make-toplevel-set - make-toplevel-ref - make-module-set - make-module-ref - make-lexical-set - make-lexical-ref - make-primitive-ref - make-const - make-void) - ((top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top)) - ("i467" - "i465" - "i463" - "i461" - "i459" - "i457" - "i455" - "i453" - "i451" - "i449" - "i447" - "i445" - "i443" - "i441" - "i439" - "i437" - "i435" - "i433" - "i431" - "i429" - "i427" - "i425" - "i423" - "i421" - "i419" - "i417" - "i415" - "i413" - "i411" - "i409" - "i407" - "i405" - "i403" - "i401" - "i399" - "i398" - "i396" - "i393" - "i392" - "i391" - "i389" - "i388" - "i386" - "i384" - "i382" - "i380" - "i378" - "i376" - "i374" - "i372" - "i369" - "i367" - "i366" - "i364" - "i362" - "i360" - "i358" - "i357" - "i356" - "i355" - "i353" - "i352" - "i349" - "i347" - "i345" - "i343" - "i341" - "i339" - "i337" - "i336" - "i335" - "i333" - "i331" - "i330" - "i327" - "i326" - "i324" - "i322" - "i320" - "i318" - "i316" - "i314" - "i312" - "i310" - "i308" - "i305" - "i303" - "i301" - "i299" - "i297" - "i295" - "i293" - "i291" - "i289" - "i287" - "i285" - "i283" - "i281" - "i279" - "i277" - "i275" - "i273" - "i271" - "i269" - "i267" - "i265" - "i263" - "i261" - "i260" - "i257" - "i255" - "i254" - "i253" - "i252" - "i251" - "i249" - "i247" - "i245" - "i242" - "i240" - "i238" - "i236" - "i234" - "i232" - "i230" - "i228" - "i226" - "i224" - "i222" - "i220" - "i218" - "i216" - "i214" - "i212" - "i210" - "i208")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("i46" "i45" "i44"))) - (hygiene guile))) - 4) - #t - #f) - '... - '#(syntax-object - ... - ((top) - #(ribcage () () ()) - #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i2218")) - #(ribcage - (lambda-var-list - gen-var - strip - expand-lambda-case - lambda*-formals - expand-simple-lambda - lambda-formals - ellipsis? - expand-void - eval-local-transformer - expand-local-syntax - expand-body - expand-macro - expand-application - expand-expr - expand - syntax-type - parse-when-list - expand-install-global - expand-top-sequence - expand-sequence - source-wrap - wrap - bound-id-member? - distinct-bound-ids? - valid-bound-ids? - bound-id=? - free-id=? - id-var-name - same-marks? - join-marks - join-wraps - smart-append - make-binding-wrap - extend-ribcage! - make-empty-ribcage - new-mark - anti-mark - the-anti-mark - top-marked? - top-wrap - empty-wrap - set-ribcage-labels! - set-ribcage-marks! - set-ribcage-symnames! - ribcage-labels - ribcage-marks - ribcage-symnames - ribcage? - make-ribcage - gen-labels - gen-label - make-rename - rename-marks - rename-new - rename-old - subst-rename? - wrap-subst - wrap-marks - make-wrap - id-sym-name&marks - id-sym-name - id? - nonsymbol-id? - global-extend - lookup - macros-only-env - extend-var-env - extend-env - null-env - binding-value - binding-type - make-binding - arg-check - source-annotation - no-source - set-syntax-object-module! - set-syntax-object-wrap! - set-syntax-object-expression! - syntax-object-module - syntax-object-wrap - syntax-object-expression - syntax-object? - make-syntax-object - build-lexical-var - build-letrec - build-named-let - build-let - build-sequence - build-data - build-primref - build-lambda-case - build-case-lambda - build-simple-lambda - build-global-definition - build-global-assignment - build-global-reference - analyze-variable - build-lexical-assignment - build-lexical-reference - build-dynlet - build-conditional - build-application - build-void - maybe-name-value! - decorate-source - get-global-definition-hook - put-global-definition-hook - gensym-hook - local-eval-hook - top-level-eval-hook - fx< - fx= - fx- - fx+ - set-lambda-meta! - lambda-meta - lambda? - make-dynlet - make-letrec - make-let - make-lambda-case - make-lambda - make-sequence - make-application - make-conditional - make-toplevel-define - make-toplevel-set - make-toplevel-ref - make-module-set - make-module-ref - make-lexical-set - make-lexical-ref - make-primitive-ref - make-const - make-void) - ((top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top)) - ("i467" - "i465" - "i463" - "i461" - "i459" - "i457" - "i455" - "i453" - "i451" - "i449" - "i447" - "i445" - "i443" - "i441" - "i439" - "i437" - "i435" - "i433" - "i431" - "i429" - "i427" - "i425" - "i423" - "i421" - "i419" - "i417" - "i415" - "i413" - "i411" - "i409" - "i407" - "i405" - "i403" - "i401" - "i399" - "i398" - "i396" - "i393" - "i392" - "i391" - "i389" - "i388" - "i386" - "i384" - "i382" - "i380" - "i378" - "i376" - "i374" - "i372" - "i369" - "i367" - "i366" - "i364" - "i362" - "i360" - "i358" - "i357" - "i356" - "i355" - "i353" - "i352" - "i349" - "i347" - "i345" - "i343" - "i341" - "i339" - "i337" - "i336" - "i335" - "i333" - "i331" - "i330" - "i327" - "i326" - "i324" - "i322" - "i320" - "i318" - "i316" - "i314" - "i312" - "i310" - "i308" - "i305" - "i303" - "i301" - "i299" - "i297" - "i295" - "i293" - "i291" - "i289" - "i287" - "i285" - "i283" - "i281" - "i279" - "i277" - "i275" - "i273" - "i271" - "i269" - "i267" - "i265" - "i263" - "i261" - "i260" - "i257" - "i255" - "i254" - "i253" - "i252" - "i251" - "i249" - "i247" - "i245" - "i242" - "i240" - "i238" - "i236" - "i234" - "i232" - "i230" - "i228" - "i226" - "i224" - "i222" - "i220" - "i218" - "i216" - "i214" - "i212" - "i210" - "i208")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("i46" "i45" "i44"))) - (hygiene guile)))) - (eq? (#{id-var-name 4320}# #{x 5147}# '(())) - (#{id-var-name 4320}# - '#(syntax-object - ... - ((top) - #(ribcage () () ()) - #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i2218")) - #(ribcage - (lambda-var-list - gen-var - strip - expand-lambda-case - lambda*-formals - expand-simple-lambda - lambda-formals - ellipsis? - expand-void - eval-local-transformer - expand-local-syntax - expand-body - expand-macro - expand-application - expand-expr - expand - syntax-type - parse-when-list - expand-install-global - expand-top-sequence - expand-sequence - source-wrap - wrap - bound-id-member? - distinct-bound-ids? - valid-bound-ids? - bound-id=? - free-id=? - id-var-name - same-marks? - join-marks - join-wraps - smart-append - make-binding-wrap - extend-ribcage! - make-empty-ribcage - new-mark - anti-mark - the-anti-mark - top-marked? - top-wrap - empty-wrap - set-ribcage-labels! - set-ribcage-marks! - set-ribcage-symnames! - ribcage-labels - ribcage-marks - ribcage-symnames - ribcage? - make-ribcage - gen-labels - gen-label - make-rename - rename-marks - rename-new - rename-old - subst-rename? - wrap-subst - wrap-marks - make-wrap - id-sym-name&marks - id-sym-name - id? - nonsymbol-id? - global-extend - lookup - macros-only-env - extend-var-env - extend-env - null-env - binding-value - binding-type - make-binding - arg-check - source-annotation - no-source - set-syntax-object-module! - set-syntax-object-wrap! - set-syntax-object-expression! - syntax-object-module - syntax-object-wrap - syntax-object-expression - syntax-object? - make-syntax-object - build-lexical-var - build-letrec - build-named-let - build-let - build-sequence - build-data - build-primref - build-lambda-case - build-case-lambda - build-simple-lambda - build-global-definition - build-global-assignment - build-global-reference - analyze-variable - build-lexical-assignment - build-lexical-reference - build-dynlet - build-conditional - build-application - build-void - maybe-name-value! - decorate-source - get-global-definition-hook - put-global-definition-hook - gensym-hook - local-eval-hook - top-level-eval-hook - fx< - fx= - fx- - fx+ - set-lambda-meta! - lambda-meta - lambda? - make-dynlet - make-letrec - make-let - make-lambda-case - make-lambda - make-sequence - make-application - make-conditional - make-toplevel-define - make-toplevel-set - make-toplevel-ref - make-module-set - make-module-ref - make-lexical-set - make-lexical-ref - make-primitive-ref - make-const - make-void) - ((top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top)) - ("i467" - "i465" - "i463" - "i461" - "i459" - "i457" - "i455" - "i453" - "i451" - "i449" - "i447" - "i445" - "i443" - "i441" - "i439" - "i437" - "i435" - "i433" - "i431" - "i429" - "i427" - "i425" - "i423" - "i421" - "i419" - "i417" - "i415" - "i413" - "i411" - "i409" - "i407" - "i405" - "i403" - "i401" - "i399" - "i398" - "i396" - "i393" - "i392" - "i391" - "i389" - "i388" - "i386" - "i384" - "i382" - "i380" - "i378" - "i376" - "i374" - "i372" - "i369" - "i367" - "i366" - "i364" - "i362" - "i360" - "i358" - "i357" - "i356" - "i355" - "i353" - "i352" - "i349" - "i347" - "i345" - "i343" - "i341" - "i339" - "i337" - "i336" - "i335" - "i333" - "i331" - "i330" - "i327" - "i326" - "i324" - "i322" - "i320" - "i318" - "i316" - "i314" - "i312" - "i310" - "i308" - "i305" - "i303" - "i301" - "i299" - "i297" - "i295" - "i293" - "i291" - "i289" - "i287" - "i285" - "i283" - "i281" - "i279" - "i277" - "i275" - "i273" - "i271" - "i269" - "i267" - "i265" - "i263" - "i261" - "i260" - "i257" - "i255" - "i254" - "i253" - "i252" - "i251" - "i249" - "i247" - "i245" - "i242" - "i240" - "i238" - "i236" - "i234" - "i232" - "i230" - "i228" - "i226" - "i224" - "i222" - "i220" - "i218" - "i216" - "i214" - "i212" - "i210" - "i208")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("i46" "i45" "i44"))) - (hygiene guile)) - '(()))) - #f) + (#{free-id=? 4431}# + #{x 6020}# + '#(syntax-object + ... + ((top) + #(ribcage () () ()) + #(ribcage () () ()) + #(ribcage #(x) #((top)) #("i2338")) + #(ribcage + (lambda-var-list + gen-var + strip + expand-lambda-case + lambda*-formals + expand-simple-lambda + lambda-formals + ellipsis? + expand-void + eval-local-transformer + expand-local-syntax + expand-body + expand-macro + expand-call + expand-expr + expand + syntax-type + parse-when-list + expand-install-global + expand-top-sequence + expand-sequence + source-wrap + wrap + bound-id-member? + distinct-bound-ids? + valid-bound-ids? + bound-id=? + free-id=? + resolve-identifier + id-var-name + same-marks? + join-marks + join-wraps + smart-append + make-binding-wrap + extend-ribcage! + make-empty-ribcage + new-mark + anti-mark + the-anti-mark + top-marked? + top-wrap + empty-wrap + set-ribcage-labels! + set-ribcage-marks! + set-ribcage-symnames! + ribcage-labels + ribcage-marks + ribcage-symnames + ribcage? + make-ribcage + gen-labels + gen-label + make-rename + rename-marks + rename-new + rename-old + subst-rename? + wrap-subst + wrap-marks + make-wrap + id-sym-name&marks + id-sym-name + id? + nonsymbol-id? + global-extend + macros-only-env + extend-var-env + extend-env + null-env + binding-value + binding-type + make-binding + arg-check + source-annotation + no-source + set-syntax-object-module! + set-syntax-object-wrap! + set-syntax-object-expression! + syntax-object-module + syntax-object-wrap + syntax-object-expression + syntax-object? + make-syntax-object + build-lexical-var + build-letrec + build-named-let + build-let + build-sequence + build-data + build-primref + build-primcall + build-lambda-case + build-case-lambda + build-simple-lambda + build-global-definition + build-global-assignment + build-global-reference + analyze-variable + build-lexical-assignment + build-lexical-reference + build-dynlet + build-conditional + build-call + build-void + maybe-name-value! + decorate-source + get-global-definition-hook + put-global-definition-hook + gensym-hook + local-eval-hook + top-level-eval-hook + fx< + fx= + fx- + fx+ + set-lambda-meta! + lambda-meta + lambda? + make-dynlet + make-letrec + make-let + make-lambda-case + make-lambda + make-seq + make-primcall + make-call + make-conditional + make-toplevel-define + make-toplevel-set + make-toplevel-ref + make-module-set + make-module-ref + make-lexical-set + make-lexical-ref + make-primitive-ref + make-const + make-void) + ((top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top)) + ("i471" + "i469" + "i467" + "i465" + "i463" + "i461" + "i459" + "i457" + "i455" + "i453" + "i451" + "i449" + "i447" + "i445" + "i443" + "i441" + "i439" + "i437" + "i435" + "i433" + "i431" + "i429" + "i427" + "i425" + "i423" + "i421" + "i419" + "i417" + "i415" + "i413" + "i411" + "i409" + "i407" + "i405" + "i403" + "i401" + "i400" + "i398" + "i395" + "i394" + "i393" + "i391" + "i390" + "i388" + "i386" + "i384" + "i382" + "i380" + "i378" + "i376" + "i374" + "i371" + "i369" + "i368" + "i366" + "i364" + "i362" + "i360" + "i359" + "i358" + "i357" + "i355" + "i354" + "i351" + "i349" + "i347" + "i345" + "i343" + "i341" + "i340" + "i339" + "i337" + "i335" + "i334" + "i331" + "i330" + "i328" + "i326" + "i324" + "i322" + "i320" + "i318" + "i316" + "i314" + "i312" + "i309" + "i307" + "i305" + "i303" + "i301" + "i299" + "i297" + "i295" + "i293" + "i291" + "i289" + "i287" + "i285" + "i283" + "i281" + "i279" + "i277" + "i275" + "i273" + "i271" + "i269" + "i267" + "i265" + "i263" + "i262" + "i259" + "i257" + "i256" + "i255" + "i254" + "i253" + "i251" + "i249" + "i247" + "i244" + "i242" + "i240" + "i238" + "i236" + "i234" + "i232" + "i230" + "i228" + "i226" + "i224" + "i222" + "i220" + "i218" + "i216" + "i214" + "i212" + "i210" + "i208")) + #(ribcage + (define-structure + define-expansion-accessors + define-expansion-constructors) + ((top) (top) (top)) + ("i46" "i45" "i44")) + #(ribcage () () ())) + (hygiene guile))) #f))) - (#{lambda-formals 4342}# - (lambda (#{orig-args 25694}#) + (#{lambda-formals 4452}# + (lambda (#{orig-args 31744}#) (letrec* - ((#{req 25695}# - (lambda (#{args 25699}# #{rreq 25700}#) - (let ((#{tmp 25702}# ($sc-dispatch #{args 25699}# '()))) - (if #{tmp 25702}# + ((#{req 31745}# + (lambda (#{args 31749}# #{rreq 31750}#) + (let ((#{tmp 31752}# ($sc-dispatch #{args 31749}# '()))) + (if #{tmp 31752}# (@apply (lambda () - (#{check 25696}# (reverse #{rreq 25700}#) #f)) - #{tmp 25702}#) - (let ((#{tmp 25829}# - ($sc-dispatch #{args 25699}# '(any . any)))) - (if (if #{tmp 25829}# + (#{check 31746}# (reverse #{rreq 31750}#) #f)) + #{tmp 31752}#) + (let ((#{tmp 31868}# + ($sc-dispatch #{args 31749}# '(any . any)))) + (if (if #{tmp 31868}# (@apply - (lambda (#{a 25833}# #{b 25834}#) - (if (symbol? #{a 25833}#) + (lambda (#{a 31872}# #{b 31873}#) + (if (symbol? #{a 31872}#) #t - (if (if (vector? #{a 25833}#) - (if (= (vector-length #{a 25833}#) 4) - (eq? (vector-ref #{a 25833}# 0) + (if (if (vector? #{a 31872}#) + (if (= (vector-length #{a 31872}#) 4) + (eq? (vector-ref #{a 31872}# 0) 'syntax-object) #f) #f) - (symbol? (vector-ref #{a 25833}# 1)) + (symbol? (vector-ref #{a 31872}# 1)) #f))) - #{tmp 25829}#) + #{tmp 31868}#) #f) (@apply - (lambda (#{a 25861}# #{b 25862}#) - (#{req 25695}# - #{b 25862}# - (cons #{a 25861}# #{rreq 25700}#))) - #{tmp 25829}#) - (let ((#{tmp 25863}# (list #{args 25699}#))) + (lambda (#{a 31900}# #{b 31901}#) + (#{req 31745}# + #{b 31901}# + (cons #{a 31900}# #{rreq 31750}#))) + #{tmp 31868}#) + (let ((#{tmp 31902}# (list #{args 31749}#))) (if (@apply - (lambda (#{r 25865}#) - (if (symbol? #{r 25865}#) + (lambda (#{r 31904}#) + (if (symbol? #{r 31904}#) #t - (if (if (vector? #{r 25865}#) - (if (= (vector-length #{r 25865}#) 4) - (eq? (vector-ref #{r 25865}# 0) + (if (if (vector? #{r 31904}#) + (if (= (vector-length #{r 31904}#) 4) + (eq? (vector-ref #{r 31904}# 0) 'syntax-object) #f) #f) - (symbol? (vector-ref #{r 25865}# 1)) + (symbol? (vector-ref #{r 31904}# 1)) #f))) - #{tmp 25863}#) + #{tmp 31902}#) (@apply - (lambda (#{r 25895}#) - (#{check 25696}# - (reverse #{rreq 25700}#) - #{r 25895}#)) - #{tmp 25863}#) + (lambda (#{r 31934}#) + (#{check 31746}# + (reverse #{rreq 31750}#) + #{r 31934}#)) + #{tmp 31902}#) (syntax-violation 'lambda "invalid argument list" - #{orig-args 25694}# - #{args 25699}#))))))))) - (#{check 25696}# - (lambda (#{req 26030}# #{rest 26031}#) - (if (#{distinct-bound-ids? 4324}# - (if #{rest 26031}# - (cons #{rest 26031}# #{req 26030}#) - #{req 26030}#)) - (values #{req 26030}# #f #{rest 26031}# #f) + #{orig-args 31744}# + #{args 31749}#))))))))) + (#{check 31746}# + (lambda (#{req 32058}# #{rest 32059}#) + (if (#{distinct-bound-ids? 4434}# + (if #{rest 32059}# + (cons #{rest 32059}# #{req 32058}#) + #{req 32058}#)) + (values #{req 32058}# #f #{rest 32059}# #f) (syntax-violation 'lambda "duplicate identifier in argument list" - #{orig-args 25694}#))))) - (#{req 25695}# #{orig-args 25694}# '())))) - (#{expand-simple-lambda 4343}# - (lambda (#{e 26151}# - #{r 26152}# - #{w 26153}# - #{s 26154}# - #{mod 26155}# - #{req 26156}# - #{rest 26157}# - #{meta 26158}# - #{body 26159}#) - (let ((#{ids 26160}# - (if #{rest 26157}# - (append #{req 26156}# (list #{rest 26157}#)) - #{req 26156}#))) - (let ((#{vars 26161}# - (map #{gen-var 4347}# #{ids 26160}#))) - (let ((#{labels 26162}# - (#{gen-labels 4304}# #{ids 26160}#))) - (#{build-simple-lambda 4277}# - #{s 26154}# - (map syntax->datum #{req 26156}#) - (if #{rest 26157}# - (syntax->datum #{rest 26157}#) + #{orig-args 31744}#))))) + (#{req 31745}# #{orig-args 31744}# '())))) + (#{expand-simple-lambda 4453}# + (lambda (#{e 32168}# + #{r 32169}# + #{w 32170}# + #{s 32171}# + #{mod 32172}# + #{req 32173}# + #{rest 32174}# + #{meta 32175}# + #{body 32176}#) + (let ((#{ids 32177}# + (if #{rest 32174}# + (append #{req 32173}# (list #{rest 32174}#)) + #{req 32173}#))) + (let ((#{vars 32178}# + (map #{gen-var 4457}# #{ids 32177}#))) + (let ((#{labels 32179}# + (#{gen-labels 4413}# #{ids 32177}#))) + (#{build-simple-lambda 4386}# + #{s 32171}# + (map syntax->datum #{req 32173}#) + (if #{rest 32174}# + (syntax->datum #{rest 32174}#) #f) - #{vars 26161}# - #{meta 26158}# - (#{expand-body 4337}# - #{body 26159}# - (#{wrap 4326}# - (begin - (if (if (pair? #{e 26151}#) #{s 26154}# #f) - (set-source-properties! #{e 26151}# #{s 26154}#)) - #{e 26151}#) - #{w 26153}# - #{mod 26155}#) - (#{extend-var-env 4296}# - #{labels 26162}# - #{vars 26161}# - #{r 26152}#) - (#{make-binding-wrap 4315}# - #{ids 26160}# - #{labels 26162}# - #{w 26153}#) - #{mod 26155}#))))))) - (#{lambda*-formals 4344}# - (lambda (#{orig-args 26462}#) + #{vars 32178}# + #{meta 32175}# + (#{expand-body 4447}# + #{body 32176}# + (let ((#{x 32368}# + (begin + (if (if (pair? #{e 32168}#) #{s 32171}# #f) + (set-source-properties! #{e 32168}# #{s 32171}#)) + #{e 32168}#))) + (if (if (null? (car #{w 32170}#)) + (null? (cdr #{w 32170}#)) + #f) + #{x 32368}# + (if (if (vector? #{x 32368}#) + (if (= (vector-length #{x 32368}#) 4) + (eq? (vector-ref #{x 32368}# 0) 'syntax-object) + #f) + #f) + (let ((#{expression 32400}# (vector-ref #{x 32368}# 1)) + (#{wrap 32401}# + (let ((#{w2 32409}# (vector-ref #{x 32368}# 2))) + (let ((#{m1 32410}# (car #{w 32170}#)) + (#{s1 32411}# (cdr #{w 32170}#))) + (if (null? #{m1 32410}#) + (if (null? #{s1 32411}#) + #{w2 32409}# + (cons (car #{w2 32409}#) + (let ((#{m2 32426}# + (cdr #{w2 32409}#))) + (if (null? #{m2 32426}#) + #{s1 32411}# + (append + #{s1 32411}# + #{m2 32426}#))))) + (cons (let ((#{m2 32434}# + (car #{w2 32409}#))) + (if (null? #{m2 32434}#) + #{m1 32410}# + (append + #{m1 32410}# + #{m2 32434}#))) + (let ((#{m2 32442}# + (cdr #{w2 32409}#))) + (if (null? #{m2 32442}#) + #{s1 32411}# + (append + #{s1 32411}# + #{m2 32442}#)))))))) + (#{module 32402}# (vector-ref #{x 32368}# 3))) + (vector + 'syntax-object + #{expression 32400}# + #{wrap 32401}# + #{module 32402}#)) + (if (null? #{x 32368}#) + #{x 32368}# + (vector + 'syntax-object + #{x 32368}# + #{w 32170}# + #{mod 32172}#))))) + (#{extend-var-env 4406}# + #{labels 32179}# + #{vars 32178}# + #{r 32169}#) + (#{make-binding-wrap 4424}# + #{ids 32177}# + #{labels 32179}# + #{w 32170}#) + #{mod 32172}#))))))) + (#{lambda*-formals 4454}# + (lambda (#{orig-args 32673}#) (letrec* - ((#{req 26463}# - (lambda (#{args 26470}# #{rreq 26471}#) - (let ((#{tmp 26473}# ($sc-dispatch #{args 26470}# '()))) - (if #{tmp 26473}# + ((#{req 32674}# + (lambda (#{args 32681}# #{rreq 32682}#) + (let ((#{tmp 32684}# ($sc-dispatch #{args 32681}# '()))) + (if #{tmp 32684}# (@apply (lambda () - (#{check 26467}# - (reverse #{rreq 26471}#) + (#{check 32678}# + (reverse #{rreq 32682}#) '() #f '())) - #{tmp 26473}#) - (let ((#{tmp 26479}# - ($sc-dispatch #{args 26470}# '(any . any)))) - (if (if #{tmp 26479}# + #{tmp 32684}#) + (let ((#{tmp 32803}# + ($sc-dispatch #{args 32681}# '(any . any)))) + (if (if #{tmp 32803}# (@apply - (lambda (#{a 26483}# #{b 26484}#) - (if (symbol? #{a 26483}#) + (lambda (#{a 32807}# #{b 32808}#) + (if (symbol? #{a 32807}#) #t - (if (if (vector? #{a 26483}#) - (if (= (vector-length #{a 26483}#) 4) - (eq? (vector-ref #{a 26483}# 0) + (if (if (vector? #{a 32807}#) + (if (= (vector-length #{a 32807}#) 4) + (eq? (vector-ref #{a 32807}# 0) 'syntax-object) #f) #f) - (symbol? (vector-ref #{a 26483}# 1)) + (symbol? (vector-ref #{a 32807}# 1)) #f))) - #{tmp 26479}#) + #{tmp 32803}#) #f) (@apply - (lambda (#{a 26511}# #{b 26512}#) - (#{req 26463}# - #{b 26512}# - (cons #{a 26511}# #{rreq 26471}#))) - #{tmp 26479}#) - (let ((#{tmp 26513}# - ($sc-dispatch #{args 26470}# '(any . any)))) - (if (if #{tmp 26513}# + (lambda (#{a 32835}# #{b 32836}#) + (#{req 32674}# + #{b 32836}# + (cons #{a 32835}# #{rreq 32682}#))) + #{tmp 32803}#) + (let ((#{tmp 32837}# + ($sc-dispatch #{args 32681}# '(any . any)))) + (if (if #{tmp 32837}# (@apply - (lambda (#{a 26517}# #{b 26518}#) - (eq? (syntax->datum #{a 26517}#) #:optional)) - #{tmp 26513}#) + (lambda (#{a 32841}# #{b 32842}#) + (eq? (syntax->datum #{a 32841}#) #:optional)) + #{tmp 32837}#) #f) (@apply - (lambda (#{a 26519}# #{b 26520}#) - (#{opt 26464}# - #{b 26520}# - (reverse #{rreq 26471}#) + (lambda (#{a 32843}# #{b 32844}#) + (#{opt 32675}# + #{b 32844}# + (reverse #{rreq 32682}#) '())) - #{tmp 26513}#) - (let ((#{tmp 26523}# - ($sc-dispatch #{args 26470}# '(any . any)))) - (if (if #{tmp 26523}# + #{tmp 32837}#) + (let ((#{tmp 32847}# + ($sc-dispatch #{args 32681}# '(any . any)))) + (if (if #{tmp 32847}# (@apply - (lambda (#{a 26527}# #{b 26528}#) - (eq? (syntax->datum #{a 26527}#) #:key)) - #{tmp 26523}#) + (lambda (#{a 32851}# #{b 32852}#) + (eq? (syntax->datum #{a 32851}#) #:key)) + #{tmp 32847}#) #f) (@apply - (lambda (#{a 26529}# #{b 26530}#) - (#{key 26465}# - #{b 26530}# - (reverse #{rreq 26471}#) + (lambda (#{a 32853}# #{b 32854}#) + (#{key 32676}# + #{b 32854}# + (reverse #{rreq 32682}#) '() '())) - #{tmp 26523}#) - (let ((#{tmp 26533}# + #{tmp 32847}#) + (let ((#{tmp 32857}# ($sc-dispatch - #{args 26470}# + #{args 32681}# '(any any)))) - (if (if #{tmp 26533}# + (if (if #{tmp 32857}# (@apply - (lambda (#{a 26537}# #{b 26538}#) - (eq? (syntax->datum #{a 26537}#) + (lambda (#{a 32861}# #{b 32862}#) + (eq? (syntax->datum #{a 32861}#) #:rest)) - #{tmp 26533}#) + #{tmp 32857}#) #f) (@apply - (lambda (#{a 26539}# #{b 26540}#) - (#{rest 26466}# - #{b 26540}# - (reverse #{rreq 26471}#) + (lambda (#{a 32863}# #{b 32864}#) + (#{rest 32677}# + #{b 32864}# + (reverse #{rreq 32682}#) '() '())) - #{tmp 26533}#) - (let ((#{tmp 26543}# (list #{args 26470}#))) + #{tmp 32857}#) + (let ((#{tmp 32867}# (list #{args 32681}#))) (if (@apply - (lambda (#{r 26545}#) - (if (symbol? #{r 26545}#) + (lambda (#{r 32869}#) + (if (symbol? #{r 32869}#) #t - (if (if (vector? #{r 26545}#) + (if (if (vector? #{r 32869}#) (if (= (vector-length - #{r 26545}#) + #{r 32869}#) 4) (eq? (vector-ref - #{r 26545}# + #{r 32869}# 0) 'syntax-object) #f) #f) (symbol? - (vector-ref #{r 26545}# 1)) + (vector-ref #{r 32869}# 1)) #f))) - #{tmp 26543}#) + #{tmp 32867}#) (@apply - (lambda (#{r 26575}#) - (#{rest 26466}# - #{r 26575}# - (reverse #{rreq 26471}#) + (lambda (#{r 32899}#) + (#{rest 32677}# + #{r 32899}# + (reverse #{rreq 32682}#) '() '())) - #{tmp 26543}#) + #{tmp 32867}#) (syntax-violation 'lambda* "invalid argument list" - #{orig-args 26462}# - #{args 26470}#))))))))))))))) - (#{opt 26464}# - (lambda (#{args 26594}# #{req 26595}# #{ropt 26596}#) - (let ((#{tmp 26598}# ($sc-dispatch #{args 26594}# '()))) - (if #{tmp 26598}# + #{orig-args 32673}# + #{args 32681}#))))))))))))))) + (#{opt 32675}# + (lambda (#{args 32918}# #{req 32919}# #{ropt 32920}#) + (let ((#{tmp 32922}# ($sc-dispatch #{args 32918}# '()))) + (if #{tmp 32922}# (@apply (lambda () - (#{check 26467}# - #{req 26595}# - (reverse #{ropt 26596}#) + (#{check 32678}# + #{req 32919}# + (reverse #{ropt 32920}#) #f '())) - #{tmp 26598}#) - (let ((#{tmp 26604}# - ($sc-dispatch #{args 26594}# '(any . any)))) - (if (if #{tmp 26604}# + #{tmp 32922}#) + (let ((#{tmp 33043}# + ($sc-dispatch #{args 32918}# '(any . any)))) + (if (if #{tmp 33043}# (@apply - (lambda (#{a 26608}# #{b 26609}#) - (if (symbol? #{a 26608}#) + (lambda (#{a 33047}# #{b 33048}#) + (if (symbol? #{a 33047}#) #t - (if (if (vector? #{a 26608}#) - (if (= (vector-length #{a 26608}#) 4) - (eq? (vector-ref #{a 26608}# 0) + (if (if (vector? #{a 33047}#) + (if (= (vector-length #{a 33047}#) 4) + (eq? (vector-ref #{a 33047}# 0) 'syntax-object) #f) #f) - (symbol? (vector-ref #{a 26608}# 1)) + (symbol? (vector-ref #{a 33047}# 1)) #f))) - #{tmp 26604}#) + #{tmp 33043}#) #f) (@apply - (lambda (#{a 26636}# #{b 26637}#) - (#{opt 26464}# - #{b 26637}# - #{req 26595}# - (cons (cons #{a 26636}# + (lambda (#{a 33075}# #{b 33076}#) + (#{opt 32675}# + #{b 33076}# + #{req 32919}# + (cons (cons #{a 33075}# '(#(syntax-object #f ((top) #(ribcage #(a b) #((top) (top)) - #("i2357" "i2358")) + #("i2477" "i2478")) #(ribcage () () ()) #(ribcage #(args req ropt) #((top) (top) (top)) - #("i2347" "i2348" "i2349")) + #("i2467" "i2468" "i2469")) #(ribcage (check rest key opt req) ((top) (top) (top) (top) (top)) - ("i2293" - "i2291" - "i2289" - "i2287" - "i2285")) + ("i2413" + "i2411" + "i2409" + "i2407" + "i2405")) #(ribcage #(orig-args) #((top)) - #("i2284")) + #("i2404")) #(ribcage (lambda-var-list gen-var @@ -6157,7 +6997,7 @@ expand-local-syntax expand-body expand-macro - expand-application + expand-call expand-expr expand syntax-type @@ -6172,6 +7012,7 @@ valid-bound-ids? bound-id=? free-id=? + resolve-identifier id-var-name same-marks? join-marks @@ -6209,7 +7050,6 @@ id? nonsymbol-id? global-extend - lookup macros-only-env extend-var-env extend-env @@ -6235,6 +7075,7 @@ build-sequence build-data build-primref + build-primcall build-lambda-case build-case-lambda build-simple-lambda @@ -6246,7 +7087,7 @@ build-lexical-reference build-dynlet build-conditional - build-application + build-call build-void maybe-name-value! decorate-source @@ -6267,8 +7108,9 @@ make-let make-lambda-case make-lambda - make-sequence - make-application + make-seq + make-primcall + make-call make-conditional make-toplevel-define make-toplevel-set @@ -6415,8 +7257,12 @@ (top) (top) (top) + (top) + (top) (top)) - ("i467" + ("i471" + "i469" + "i467" "i465" "i463" "i461" @@ -6450,13 +7296,13 @@ "i405" "i403" "i401" - "i399" + "i400" "i398" - "i396" + "i395" + "i394" "i393" - "i392" "i391" - "i389" + "i390" "i388" "i386" "i384" @@ -6465,32 +7311,32 @@ "i378" "i376" "i374" - "i372" + "i371" "i369" - "i367" + "i368" "i366" "i364" "i362" "i360" + "i359" "i358" "i357" - "i356" "i355" - "i353" - "i352" + "i354" + "i351" "i349" "i347" "i345" "i343" "i341" + "i340" "i339" "i337" - "i336" "i335" - "i333" + "i334" "i331" "i330" - "i327" + "i328" "i326" "i324" "i322" @@ -6499,8 +7345,8 @@ "i316" "i314" "i312" - "i310" - "i308" + "i309" + "i307" "i305" "i303" "i301" @@ -6523,17 +7369,17 @@ "i267" "i265" "i263" - "i261" - "i260" + "i262" + "i259" "i257" + "i256" "i255" "i254" "i253" - "i252" "i251" "i249" "i247" - "i245" + "i244" "i242" "i240" "i238" @@ -6557,149 +7403,150 @@ define-expansion-accessors define-expansion-constructors) ((top) (top) (top)) - ("i46" "i45" "i44"))) + ("i46" "i45" "i44")) + #(ribcage () () ())) (hygiene guile)))) - #{ropt 26596}#))) - #{tmp 26604}#) - (let ((#{tmp 26638}# + #{ropt 32920}#))) + #{tmp 33043}#) + (let ((#{tmp 33077}# ($sc-dispatch - #{args 26594}# + #{args 32918}# '((any any) . any)))) - (if (if #{tmp 26638}# + (if (if #{tmp 33077}# (@apply - (lambda (#{a 26642}# - #{init 26643}# - #{b 26644}#) - (if (symbol? #{a 26642}#) + (lambda (#{a 33081}# + #{init 33082}# + #{b 33083}#) + (if (symbol? #{a 33081}#) #t - (if (if (vector? #{a 26642}#) - (if (= (vector-length #{a 26642}#) 4) - (eq? (vector-ref #{a 26642}# 0) + (if (if (vector? #{a 33081}#) + (if (= (vector-length #{a 33081}#) 4) + (eq? (vector-ref #{a 33081}# 0) 'syntax-object) #f) #f) - (symbol? (vector-ref #{a 26642}# 1)) + (symbol? (vector-ref #{a 33081}# 1)) #f))) - #{tmp 26638}#) + #{tmp 33077}#) #f) (@apply - (lambda (#{a 26671}# #{init 26672}# #{b 26673}#) - (#{opt 26464}# - #{b 26673}# - #{req 26595}# - (cons (list #{a 26671}# #{init 26672}#) - #{ropt 26596}#))) - #{tmp 26638}#) - (let ((#{tmp 26674}# - ($sc-dispatch #{args 26594}# '(any . any)))) - (if (if #{tmp 26674}# + (lambda (#{a 33110}# #{init 33111}# #{b 33112}#) + (#{opt 32675}# + #{b 33112}# + #{req 32919}# + (cons (list #{a 33110}# #{init 33111}#) + #{ropt 32920}#))) + #{tmp 33077}#) + (let ((#{tmp 33113}# + ($sc-dispatch #{args 32918}# '(any . any)))) + (if (if #{tmp 33113}# (@apply - (lambda (#{a 26678}# #{b 26679}#) - (eq? (syntax->datum #{a 26678}#) #:key)) - #{tmp 26674}#) + (lambda (#{a 33117}# #{b 33118}#) + (eq? (syntax->datum #{a 33117}#) #:key)) + #{tmp 33113}#) #f) (@apply - (lambda (#{a 26680}# #{b 26681}#) - (#{key 26465}# - #{b 26681}# - #{req 26595}# - (reverse #{ropt 26596}#) + (lambda (#{a 33119}# #{b 33120}#) + (#{key 32676}# + #{b 33120}# + #{req 32919}# + (reverse #{ropt 32920}#) '())) - #{tmp 26674}#) - (let ((#{tmp 26684}# + #{tmp 33113}#) + (let ((#{tmp 33123}# ($sc-dispatch - #{args 26594}# + #{args 32918}# '(any any)))) - (if (if #{tmp 26684}# + (if (if #{tmp 33123}# (@apply - (lambda (#{a 26688}# #{b 26689}#) - (eq? (syntax->datum #{a 26688}#) + (lambda (#{a 33127}# #{b 33128}#) + (eq? (syntax->datum #{a 33127}#) #:rest)) - #{tmp 26684}#) + #{tmp 33123}#) #f) (@apply - (lambda (#{a 26690}# #{b 26691}#) - (#{rest 26466}# - #{b 26691}# - #{req 26595}# - (reverse #{ropt 26596}#) + (lambda (#{a 33129}# #{b 33130}#) + (#{rest 32677}# + #{b 33130}# + #{req 32919}# + (reverse #{ropt 32920}#) '())) - #{tmp 26684}#) - (let ((#{tmp 26694}# (list #{args 26594}#))) + #{tmp 33123}#) + (let ((#{tmp 33133}# (list #{args 32918}#))) (if (@apply - (lambda (#{r 26696}#) - (if (symbol? #{r 26696}#) + (lambda (#{r 33135}#) + (if (symbol? #{r 33135}#) #t - (if (if (vector? #{r 26696}#) + (if (if (vector? #{r 33135}#) (if (= (vector-length - #{r 26696}#) + #{r 33135}#) 4) (eq? (vector-ref - #{r 26696}# + #{r 33135}# 0) 'syntax-object) #f) #f) (symbol? - (vector-ref #{r 26696}# 1)) + (vector-ref #{r 33135}# 1)) #f))) - #{tmp 26694}#) + #{tmp 33133}#) (@apply - (lambda (#{r 26726}#) - (#{rest 26466}# - #{r 26726}# - #{req 26595}# - (reverse #{ropt 26596}#) + (lambda (#{r 33165}#) + (#{rest 32677}# + #{r 33165}# + #{req 32919}# + (reverse #{ropt 32920}#) '())) - #{tmp 26694}#) + #{tmp 33133}#) (syntax-violation 'lambda* "invalid optional argument list" - #{orig-args 26462}# - #{args 26594}#))))))))))))))) - (#{key 26465}# - (lambda (#{args 26745}# - #{req 26746}# - #{opt 26747}# - #{rkey 26748}#) - (let ((#{tmp 26750}# ($sc-dispatch #{args 26745}# '()))) - (if #{tmp 26750}# + #{orig-args 32673}# + #{args 32918}#))))))))))))))) + (#{key 32676}# + (lambda (#{args 33184}# + #{req 33185}# + #{opt 33186}# + #{rkey 33187}#) + (let ((#{tmp 33189}# ($sc-dispatch #{args 33184}# '()))) + (if #{tmp 33189}# (@apply (lambda () - (#{check 26467}# - #{req 26746}# - #{opt 26747}# + (#{check 32678}# + #{req 33185}# + #{opt 33186}# #f - (cons #f (reverse #{rkey 26748}#)))) - #{tmp 26750}#) - (let ((#{tmp 26756}# - ($sc-dispatch #{args 26745}# '(any . any)))) - (if (if #{tmp 26756}# + (cons #f (reverse #{rkey 33187}#)))) + #{tmp 33189}#) + (let ((#{tmp 33311}# + ($sc-dispatch #{args 33184}# '(any . any)))) + (if (if #{tmp 33311}# (@apply - (lambda (#{a 26760}# #{b 26761}#) - (if (symbol? #{a 26760}#) + (lambda (#{a 33315}# #{b 33316}#) + (if (symbol? #{a 33315}#) #t - (if (if (vector? #{a 26760}#) - (if (= (vector-length #{a 26760}#) 4) - (eq? (vector-ref #{a 26760}# 0) + (if (if (vector? #{a 33315}#) + (if (= (vector-length #{a 33315}#) 4) + (eq? (vector-ref #{a 33315}# 0) 'syntax-object) #f) #f) - (symbol? (vector-ref #{a 26760}# 1)) + (symbol? (vector-ref #{a 33315}# 1)) #f))) - #{tmp 26756}#) + #{tmp 33311}#) #f) (@apply - (lambda (#{a 26788}# #{b 26789}#) - (let ((#{tmp 26790}# + (lambda (#{a 33343}# #{b 33344}#) + (let ((#{tmp 33345}# (symbol->keyword - (syntax->datum #{a 26788}#)))) - (#{key 26465}# - #{b 26789}# - #{req 26746}# - #{opt 26747}# - (cons (cons #{tmp 26790}# - (cons #{a 26788}# + (syntax->datum #{a 33343}#)))) + (#{key 32676}# + #{b 33344}# + #{req 33185}# + #{opt 33186}# + (cons (cons #{tmp 33345}# + (cons #{a 33343}# '(#(syntax-object #f ((top) @@ -6707,11 +7554,11 @@ #(ribcage #(k) #((top)) - #("i2420")) + #("i2540")) #(ribcage #(a b) #((top) (top)) - #("i2414" "i2415")) + #("i2534" "i2535")) #(ribcage () () ()) #(ribcage #(args req opt rkey) @@ -6719,10 +7566,10 @@ (top) (top) (top)) - #("i2403" - "i2404" - "i2405" - "i2406")) + #("i2523" + "i2524" + "i2525" + "i2526")) #(ribcage (check rest key opt req) ((top) @@ -6730,15 +7577,15 @@ (top) (top) (top)) - ("i2293" - "i2291" - "i2289" - "i2287" - "i2285")) + ("i2413" + "i2411" + "i2409" + "i2407" + "i2405")) #(ribcage #(orig-args) #((top)) - #("i2284")) + #("i2404")) #(ribcage (lambda-var-list gen-var @@ -6753,7 +7600,7 @@ expand-local-syntax expand-body expand-macro - expand-application + expand-call expand-expr expand syntax-type @@ -6768,6 +7615,7 @@ valid-bound-ids? bound-id=? free-id=? + resolve-identifier id-var-name same-marks? join-marks @@ -6805,7 +7653,6 @@ id? nonsymbol-id? global-extend - lookup macros-only-env extend-var-env extend-env @@ -6831,6 +7678,7 @@ build-sequence build-data build-primref + build-primcall build-lambda-case build-case-lambda build-simple-lambda @@ -6842,7 +7690,7 @@ build-lexical-reference build-dynlet build-conditional - build-application + build-call build-void maybe-name-value! decorate-source @@ -6863,8 +7711,9 @@ make-let make-lambda-case make-lambda - make-sequence - make-application + make-seq + make-primcall + make-call make-conditional make-toplevel-define make-toplevel-set @@ -7011,8 +7860,12 @@ (top) (top) (top) + (top) + (top) (top)) - ("i467" + ("i471" + "i469" + "i467" "i465" "i463" "i461" @@ -7046,13 +7899,13 @@ "i405" "i403" "i401" - "i399" + "i400" "i398" - "i396" + "i395" + "i394" "i393" - "i392" "i391" - "i389" + "i390" "i388" "i386" "i384" @@ -7061,32 +7914,32 @@ "i378" "i376" "i374" - "i372" + "i371" "i369" - "i367" + "i368" "i366" "i364" "i362" "i360" + "i359" "i358" "i357" - "i356" "i355" - "i353" - "i352" + "i354" + "i351" "i349" "i347" "i345" "i343" "i341" + "i340" "i339" "i337" - "i336" "i335" - "i333" + "i334" "i331" "i330" - "i327" + "i328" "i326" "i324" "i322" @@ -7095,8 +7948,8 @@ "i316" "i314" "i312" - "i310" - "i308" + "i309" + "i307" "i305" "i303" "i301" @@ -7119,17 +7972,17 @@ "i267" "i265" "i263" - "i261" - "i260" + "i262" + "i259" "i257" + "i256" "i255" "i254" "i253" - "i252" "i251" "i249" "i247" - "i245" + "i244" "i242" "i240" "i238" @@ -7153,782 +8006,1012 @@ define-expansion-accessors define-expansion-constructors) ((top) (top) (top)) - ("i46" "i45" "i44"))) + ("i46" "i45" "i44")) + #(ribcage () () ())) (hygiene guile))))) - #{rkey 26748}#)))) - #{tmp 26756}#) - (let ((#{tmp 26793}# + #{rkey 33187}#)))) + #{tmp 33311}#) + (let ((#{tmp 33348}# ($sc-dispatch - #{args 26745}# + #{args 33184}# '((any any) . any)))) - (if (if #{tmp 26793}# + (if (if #{tmp 33348}# (@apply - (lambda (#{a 26797}# - #{init 26798}# - #{b 26799}#) - (if (symbol? #{a 26797}#) + (lambda (#{a 33352}# + #{init 33353}# + #{b 33354}#) + (if (symbol? #{a 33352}#) #t - (if (if (vector? #{a 26797}#) - (if (= (vector-length #{a 26797}#) 4) - (eq? (vector-ref #{a 26797}# 0) + (if (if (vector? #{a 33352}#) + (if (= (vector-length #{a 33352}#) 4) + (eq? (vector-ref #{a 33352}# 0) 'syntax-object) #f) #f) - (symbol? (vector-ref #{a 26797}# 1)) + (symbol? (vector-ref #{a 33352}# 1)) #f))) - #{tmp 26793}#) + #{tmp 33348}#) #f) (@apply - (lambda (#{a 26826}# #{init 26827}# #{b 26828}#) - (let ((#{tmp 26829}# + (lambda (#{a 33381}# #{init 33382}# #{b 33383}#) + (let ((#{tmp 33384}# (symbol->keyword - (syntax->datum #{a 26826}#)))) - (#{key 26465}# - #{b 26828}# - #{req 26746}# - #{opt 26747}# - (cons (list #{tmp 26829}# - #{a 26826}# - #{init 26827}#) - #{rkey 26748}#)))) - #{tmp 26793}#) - (let ((#{tmp 26832}# + (syntax->datum #{a 33381}#)))) + (#{key 32676}# + #{b 33383}# + #{req 33185}# + #{opt 33186}# + (cons (list #{tmp 33384}# + #{a 33381}# + #{init 33382}#) + #{rkey 33187}#)))) + #{tmp 33348}#) + (let ((#{tmp 33387}# ($sc-dispatch - #{args 26745}# + #{args 33184}# '((any any any) . any)))) - (if (if #{tmp 26832}# + (if (if #{tmp 33387}# (@apply - (lambda (#{a 26836}# - #{init 26837}# - #{k 26838}# - #{b 26839}#) - (if (if (symbol? #{a 26836}#) + (lambda (#{a 33391}# + #{init 33392}# + #{k 33393}# + #{b 33394}#) + (if (if (symbol? #{a 33391}#) #t - (if (if (vector? #{a 26836}#) + (if (if (vector? #{a 33391}#) (if (= (vector-length - #{a 26836}#) + #{a 33391}#) 4) (eq? (vector-ref - #{a 26836}# + #{a 33391}# 0) 'syntax-object) #f) #f) (symbol? - (vector-ref #{a 26836}# 1)) + (vector-ref #{a 33391}# 1)) #f)) - (keyword? (syntax->datum #{k 26838}#)) + (keyword? (syntax->datum #{k 33393}#)) #f)) - #{tmp 26832}#) + #{tmp 33387}#) #f) (@apply - (lambda (#{a 26866}# - #{init 26867}# - #{k 26868}# - #{b 26869}#) - (#{key 26465}# - #{b 26869}# - #{req 26746}# - #{opt 26747}# - (cons (list #{k 26868}# - #{a 26866}# - #{init 26867}#) - #{rkey 26748}#))) - #{tmp 26832}#) - (let ((#{tmp 26870}# - ($sc-dispatch #{args 26745}# '(any)))) - (if (if #{tmp 26870}# + (lambda (#{a 33421}# + #{init 33422}# + #{k 33423}# + #{b 33424}#) + (#{key 32676}# + #{b 33424}# + #{req 33185}# + #{opt 33186}# + (cons (list #{k 33423}# + #{a 33421}# + #{init 33422}#) + #{rkey 33187}#))) + #{tmp 33387}#) + (let ((#{tmp 33425}# + ($sc-dispatch #{args 33184}# '(any)))) + (if (if #{tmp 33425}# (@apply - (lambda (#{aok 26874}#) - (eq? (syntax->datum #{aok 26874}#) + (lambda (#{aok 33429}#) + (eq? (syntax->datum #{aok 33429}#) #:allow-other-keys)) - #{tmp 26870}#) + #{tmp 33425}#) #f) (@apply - (lambda (#{aok 26875}#) - (#{check 26467}# - #{req 26746}# - #{opt 26747}# + (lambda (#{aok 33430}#) + (#{check 32678}# + #{req 33185}# + #{opt 33186}# #f - (cons #t (reverse #{rkey 26748}#)))) - #{tmp 26870}#) - (let ((#{tmp 26878}# + (cons #t (reverse #{rkey 33187}#)))) + #{tmp 33425}#) + (let ((#{tmp 33549}# ($sc-dispatch - #{args 26745}# + #{args 33184}# '(any any any)))) - (if (if #{tmp 26878}# + (if (if #{tmp 33549}# (@apply - (lambda (#{aok 26882}# - #{a 26883}# - #{b 26884}#) + (lambda (#{aok 33553}# + #{a 33554}# + #{b 33555}#) (if (eq? (syntax->datum - #{aok 26882}#) + #{aok 33553}#) #:allow-other-keys) (eq? (syntax->datum - #{a 26883}#) + #{a 33554}#) #:rest) #f)) - #{tmp 26878}#) + #{tmp 33549}#) #f) (@apply - (lambda (#{aok 26885}# - #{a 26886}# - #{b 26887}#) - (#{rest 26466}# - #{b 26887}# - #{req 26746}# - #{opt 26747}# + (lambda (#{aok 33556}# + #{a 33557}# + #{b 33558}#) + (#{rest 32677}# + #{b 33558}# + #{req 33185}# + #{opt 33186}# (cons #t - (reverse #{rkey 26748}#)))) - #{tmp 26878}#) - (let ((#{tmp 26890}# + (reverse #{rkey 33187}#)))) + #{tmp 33549}#) + (let ((#{tmp 33561}# ($sc-dispatch - #{args 26745}# + #{args 33184}# '(any . any)))) - (if (if #{tmp 26890}# + (if (if #{tmp 33561}# (@apply - (lambda (#{aok 26894}# - #{r 26895}#) + (lambda (#{aok 33565}# + #{r 33566}#) (if (eq? (syntax->datum - #{aok 26894}#) + #{aok 33565}#) #:allow-other-keys) - (if (symbol? #{r 26895}#) + (if (symbol? #{r 33566}#) #t (if (if (vector? - #{r 26895}#) + #{r 33566}#) (if (= (vector-length - #{r 26895}#) + #{r 33566}#) 4) (eq? (vector-ref - #{r 26895}# + #{r 33566}# 0) 'syntax-object) #f) #f) (symbol? (vector-ref - #{r 26895}# + #{r 33566}# 1)) #f)) #f)) - #{tmp 26890}#) + #{tmp 33561}#) #f) (@apply - (lambda (#{aok 26922}# #{r 26923}#) - (#{rest 26466}# - #{r 26923}# - #{req 26746}# - #{opt 26747}# + (lambda (#{aok 33593}# #{r 33594}#) + (#{rest 32677}# + #{r 33594}# + #{req 33185}# + #{opt 33186}# (cons #t (reverse - #{rkey 26748}#)))) - #{tmp 26890}#) - (let ((#{tmp 26926}# + #{rkey 33187}#)))) + #{tmp 33561}#) + (let ((#{tmp 33597}# ($sc-dispatch - #{args 26745}# + #{args 33184}# '(any any)))) - (if (if #{tmp 26926}# + (if (if #{tmp 33597}# (@apply - (lambda (#{a 26930}# - #{b 26931}#) + (lambda (#{a 33601}# + #{b 33602}#) (eq? (syntax->datum - #{a 26930}#) + #{a 33601}#) #:rest)) - #{tmp 26926}#) + #{tmp 33597}#) #f) (@apply - (lambda (#{a 26932}# - #{b 26933}#) - (#{rest 26466}# - #{b 26933}# - #{req 26746}# - #{opt 26747}# + (lambda (#{a 33603}# + #{b 33604}#) + (#{rest 32677}# + #{b 33604}# + #{req 33185}# + #{opt 33186}# (cons #f (reverse - #{rkey 26748}#)))) - #{tmp 26926}#) - (let ((#{tmp 26936}# - (list #{args 26745}#))) + #{rkey 33187}#)))) + #{tmp 33597}#) + (let ((#{tmp 33607}# + (list #{args 33184}#))) (if (@apply - (lambda (#{r 26938}#) + (lambda (#{r 33609}#) (if (symbol? - #{r 26938}#) + #{r 33609}#) #t (if (if (vector? - #{r 26938}#) + #{r 33609}#) (if (= (vector-length - #{r 26938}#) + #{r 33609}#) 4) (eq? (vector-ref - #{r 26938}# + #{r 33609}# 0) 'syntax-object) #f) #f) (symbol? (vector-ref - #{r 26938}# + #{r 33609}# 1)) #f))) - #{tmp 26936}#) + #{tmp 33607}#) (@apply - (lambda (#{r 26968}#) - (#{rest 26466}# - #{r 26968}# - #{req 26746}# - #{opt 26747}# + (lambda (#{r 33639}#) + (#{rest 32677}# + #{r 33639}# + #{req 33185}# + #{opt 33186}# (cons #f (reverse - #{rkey 26748}#)))) - #{tmp 26936}#) + #{rkey 33187}#)))) + #{tmp 33607}#) (syntax-violation 'lambda* "invalid keyword argument list" - #{orig-args 26462}# - #{args 26745}#))))))))))))))))))))) - (#{rest 26466}# - (lambda (#{args 26996}# - #{req 26997}# - #{opt 26998}# - #{kw 26999}#) - (let ((#{tmp 27001}# (list #{args 26996}#))) + #{orig-args 32673}# + #{args 33184}#))))))))))))))))))))) + (#{rest 32677}# + (lambda (#{args 33667}# + #{req 33668}# + #{opt 33669}# + #{kw 33670}#) + (let ((#{tmp 33672}# (list #{args 33667}#))) (if (@apply - (lambda (#{r 27003}#) - (if (symbol? #{r 27003}#) + (lambda (#{r 33674}#) + (if (symbol? #{r 33674}#) #t - (if (if (vector? #{r 27003}#) - (if (= (vector-length #{r 27003}#) 4) - (eq? (vector-ref #{r 27003}# 0) + (if (if (vector? #{r 33674}#) + (if (= (vector-length #{r 33674}#) 4) + (eq? (vector-ref #{r 33674}# 0) 'syntax-object) #f) #f) - (symbol? (vector-ref #{r 27003}# 1)) + (symbol? (vector-ref #{r 33674}# 1)) #f))) - #{tmp 27001}#) + #{tmp 33672}#) (@apply - (lambda (#{r 27033}#) - (#{check 26467}# - #{req 26997}# - #{opt 26998}# - #{r 27033}# - #{kw 26999}#)) - #{tmp 27001}#) + (lambda (#{r 33704}#) + (#{check 32678}# + #{req 33668}# + #{opt 33669}# + #{r 33704}# + #{kw 33670}#)) + #{tmp 33672}#) (syntax-violation 'lambda* "invalid rest argument" - #{orig-args 26462}# - #{args 26996}#))))) - (#{check 26467}# - (lambda (#{req 27037}# - #{opt 27038}# - #{rest 27039}# - #{kw 27040}#) - (if (#{distinct-bound-ids? 4324}# + #{orig-args 32673}# + #{args 33667}#))))) + (#{check 32678}# + (lambda (#{req 33832}# + #{opt 33833}# + #{rest 33834}# + #{kw 33835}#) + (if (#{distinct-bound-ids? 4434}# (append - #{req 27037}# - (map car #{opt 27038}#) - (if #{rest 27039}# (list #{rest 27039}#) '()) - (if (pair? #{kw 27040}#) - (map cadr (cdr #{kw 27040}#)) + #{req 33832}# + (map car #{opt 33833}#) + (if #{rest 33834}# (list #{rest 33834}#) '()) + (if (pair? #{kw 33835}#) + (map cadr (cdr #{kw 33835}#)) '()))) (values - #{req 27037}# - #{opt 27038}# - #{rest 27039}# - #{kw 27040}#) + #{req 33832}# + #{opt 33833}# + #{rest 33834}# + #{kw 33835}#) (syntax-violation 'lambda* "duplicate identifier in argument list" - #{orig-args 26462}#))))) - (#{req 26463}# #{orig-args 26462}# '())))) - (#{expand-lambda-case 4345}# - (lambda (#{e 27160}# - #{r 27161}# - #{w 27162}# - #{s 27163}# - #{mod 27164}# - #{get-formals 27165}# - #{clauses 27166}#) + #{orig-args 32673}#))))) + (#{req 32674}# #{orig-args 32673}# '())))) + (#{expand-lambda-case 4455}# + (lambda (#{e 33944}# + #{r 33945}# + #{w 33946}# + #{s 33947}# + #{mod 33948}# + #{get-formals 33949}# + #{clauses 33950}#) (letrec* - ((#{parse-req 27167}# - (lambda (#{req 27301}# - #{opt 27302}# - #{rest 27303}# - #{kw 27304}# - #{body 27305}#) - (let ((#{vars 27306}# - (map #{gen-var 4347}# #{req 27301}#)) - (#{labels 27307}# - (#{gen-labels 4304}# #{req 27301}#))) - (let ((#{r* 27308}# - (#{extend-var-env 4296}# - #{labels 27307}# - #{vars 27306}# - #{r 27161}#)) - (#{w* 27309}# - (#{make-binding-wrap 4315}# - #{req 27301}# - #{labels 27307}# - #{w 27162}#))) - (#{parse-opt 27168}# - (map syntax->datum #{req 27301}#) - #{opt 27302}# - #{rest 27303}# - #{kw 27304}# - #{body 27305}# - (reverse #{vars 27306}#) - #{r* 27308}# - #{w* 27309}# + ((#{parse-req 33951}# + (lambda (#{req 34087}# + #{opt 34088}# + #{rest 34089}# + #{kw 34090}# + #{body 34091}#) + (let ((#{vars 34092}# + (map #{gen-var 4457}# #{req 34087}#)) + (#{labels 34093}# + (#{gen-labels 4413}# #{req 34087}#))) + (let ((#{r* 34094}# + (#{extend-var-env 4406}# + #{labels 34093}# + #{vars 34092}# + #{r 33945}#)) + (#{w* 34095}# + (#{make-binding-wrap 4424}# + #{req 34087}# + #{labels 34093}# + #{w 33946}#))) + (#{parse-opt 33952}# + (map syntax->datum #{req 34087}#) + #{opt 34088}# + #{rest 34089}# + #{kw 34090}# + #{body 34091}# + (reverse #{vars 34092}#) + #{r* 34094}# + #{w* 34095}# '() '()))))) - (#{parse-opt 27168}# - (lambda (#{req 27525}# - #{opt 27526}# - #{rest 27527}# - #{kw 27528}# - #{body 27529}# - #{vars 27530}# - #{r* 27531}# - #{w* 27532}# - #{out 27533}# - #{inits 27534}#) - (if (pair? #{opt 27526}#) - (let ((#{tmp 27535}# (car #{opt 27526}#))) - (let ((#{tmp 27536}# - ($sc-dispatch #{tmp 27535}# '(any any)))) - (if #{tmp 27536}# + (#{parse-opt 33952}# + (lambda (#{req 34331}# + #{opt 34332}# + #{rest 34333}# + #{kw 34334}# + #{body 34335}# + #{vars 34336}# + #{r* 34337}# + #{w* 34338}# + #{out 34339}# + #{inits 34340}#) + (if (pair? #{opt 34332}#) + (let ((#{tmp 34341}# (car #{opt 34332}#))) + (let ((#{tmp 34342}# + ($sc-dispatch #{tmp 34341}# '(any any)))) + (if #{tmp 34342}# (@apply - (lambda (#{id 27538}# #{i 27539}#) - (let ((#{v 27540}# - (let ((#{id 27548}# - (if (if (vector? #{id 27538}#) + (lambda (#{id 34344}# #{i 34345}#) + (let ((#{v 34346}# + (let ((#{id 34354}# + (if (if (vector? #{id 34344}#) (if (= (vector-length - #{id 27538}#) + #{id 34344}#) 4) (eq? (vector-ref - #{id 27538}# + #{id 34344}# 0) 'syntax-object) #f) #f) - (vector-ref #{id 27538}# 1) - #{id 27538}#))) + (vector-ref #{id 34344}# 1) + #{id 34344}#))) (gensym (string-append - (symbol->string #{id 27548}#) + (symbol->string #{id 34354}#) " "))))) - (let ((#{l 27541}# - (#{gen-labels 4304}# (list #{v 27540}#)))) - (let ((#{r** 27542}# - (#{extend-var-env 4296}# - #{l 27541}# - (list #{v 27540}#) - #{r* 27531}#))) - (let ((#{w** 27543}# - (#{make-binding-wrap 4315}# - (list #{id 27538}#) - #{l 27541}# - #{w* 27532}#))) - (#{parse-opt 27168}# - #{req 27525}# - (cdr #{opt 27526}#) - #{rest 27527}# - #{kw 27528}# - #{body 27529}# - (cons #{v 27540}# #{vars 27530}#) - #{r** 27542}# - #{w** 27543}# - (cons (syntax->datum #{id 27538}#) - #{out 27533}#) - (cons (#{expand 4333}# - #{i 27539}# - #{r* 27531}# - #{w* 27532}# - #{mod 27164}#) - #{inits 27534}#))))))) - #{tmp 27536}#) + (let ((#{l 34347}# + (#{gen-labels 4413}# (list #{v 34346}#)))) + (let ((#{r** 34348}# + (#{extend-var-env 4406}# + #{l 34347}# + (list #{v 34346}#) + #{r* 34337}#))) + (let ((#{w** 34349}# + (#{make-binding-wrap 4424}# + (list #{id 34344}#) + #{l 34347}# + #{w* 34338}#))) + (#{parse-opt 33952}# + #{req 34331}# + (cdr #{opt 34332}#) + #{rest 34333}# + #{kw 34334}# + #{body 34335}# + (cons #{v 34346}# #{vars 34336}#) + #{r** 34348}# + #{w** 34349}# + (cons (syntax->datum #{id 34344}#) + #{out 34339}#) + (cons (#{expand 4443}# + #{i 34345}# + #{r* 34337}# + #{w* 34338}# + #{mod 33948}#) + #{inits 34340}#))))))) + #{tmp 34342}#) (syntax-violation #f "source expression failed to match any pattern" - #{tmp 27535}#)))) - (if #{rest 27527}# - (let ((#{v 27820}# - (let ((#{id 27830}# - (if (if (vector? #{rest 27527}#) - (if (= (vector-length #{rest 27527}#) + #{tmp 34341}#)))) + (if #{rest 34333}# + (let ((#{v 34655}# + (let ((#{id 34665}# + (if (if (vector? #{rest 34333}#) + (if (= (vector-length #{rest 34333}#) 4) - (eq? (vector-ref #{rest 27527}# 0) + (eq? (vector-ref #{rest 34333}# 0) 'syntax-object) #f) #f) - (vector-ref #{rest 27527}# 1) - #{rest 27527}#))) + (vector-ref #{rest 34333}# 1) + #{rest 34333}#))) (gensym (string-append - (symbol->string #{id 27830}#) + (symbol->string #{id 34665}#) " "))))) - (let ((#{l 27821}# - (#{gen-labels 4304}# (list #{v 27820}#)))) - (let ((#{r* 27822}# - (#{extend-var-env 4296}# - #{l 27821}# - (list #{v 27820}#) - #{r* 27531}#))) - (let ((#{w* 27823}# - (#{make-binding-wrap 4315}# - (list #{rest 27527}#) - #{l 27821}# - #{w* 27532}#))) - (#{parse-kw 27169}# - #{req 27525}# - (if (pair? #{out 27533}#) - (reverse #{out 27533}#) + (let ((#{l 34656}# + (#{gen-labels 4413}# (list #{v 34655}#)))) + (let ((#{r* 34657}# + (#{extend-var-env 4406}# + #{l 34656}# + (list #{v 34655}#) + #{r* 34337}#))) + (let ((#{w* 34658}# + (#{make-binding-wrap 4424}# + (list #{rest 34333}#) + #{l 34656}# + #{w* 34338}#))) + (#{parse-kw 33953}# + #{req 34331}# + (if (pair? #{out 34339}#) + (reverse #{out 34339}#) #f) - (syntax->datum #{rest 27527}#) - (if (pair? #{kw 27528}#) - (cdr #{kw 27528}#) - #{kw 27528}#) - #{body 27529}# - (cons #{v 27820}# #{vars 27530}#) - #{r* 27822}# - #{w* 27823}# - (if (pair? #{kw 27528}#) (car #{kw 27528}#) #f) + (syntax->datum #{rest 34333}#) + (if (pair? #{kw 34334}#) + (cdr #{kw 34334}#) + #{kw 34334}#) + #{body 34335}# + (cons #{v 34655}# #{vars 34336}#) + #{r* 34657}# + #{w* 34658}# + (if (pair? #{kw 34334}#) (car #{kw 34334}#) #f) '() - #{inits 27534}#))))) - (#{parse-kw 27169}# - #{req 27525}# - (if (pair? #{out 27533}#) - (reverse #{out 27533}#) + #{inits 34340}#))))) + (#{parse-kw 33953}# + #{req 34331}# + (if (pair? #{out 34339}#) + (reverse #{out 34339}#) #f) #f - (if (pair? #{kw 27528}#) - (cdr #{kw 27528}#) - #{kw 27528}#) - #{body 27529}# - #{vars 27530}# - #{r* 27531}# - #{w* 27532}# - (if (pair? #{kw 27528}#) (car #{kw 27528}#) #f) + (if (pair? #{kw 34334}#) + (cdr #{kw 34334}#) + #{kw 34334}#) + #{body 34335}# + #{vars 34336}# + #{r* 34337}# + #{w* 34338}# + (if (pair? #{kw 34334}#) (car #{kw 34334}#) #f) '() - #{inits 27534}#))))) - (#{parse-kw 27169}# - (lambda (#{req 28030}# - #{opt 28031}# - #{rest 28032}# - #{kw 28033}# - #{body 28034}# - #{vars 28035}# - #{r* 28036}# - #{w* 28037}# - #{aok 28038}# - #{out 28039}# - #{inits 28040}#) - (if (pair? #{kw 28033}#) - (let ((#{tmp 28041}# (car #{kw 28033}#))) - (let ((#{tmp 28042}# - ($sc-dispatch #{tmp 28041}# '(any any any)))) - (if #{tmp 28042}# + #{inits 34340}#))))) + (#{parse-kw 33953}# + (lambda (#{req 34887}# + #{opt 34888}# + #{rest 34889}# + #{kw 34890}# + #{body 34891}# + #{vars 34892}# + #{r* 34893}# + #{w* 34894}# + #{aok 34895}# + #{out 34896}# + #{inits 34897}#) + (if (pair? #{kw 34890}#) + (let ((#{tmp 34898}# (car #{kw 34890}#))) + (let ((#{tmp 34899}# + ($sc-dispatch #{tmp 34898}# '(any any any)))) + (if #{tmp 34899}# (@apply - (lambda (#{k 28044}# #{id 28045}# #{i 28046}#) - (let ((#{v 28047}# - (let ((#{id 28055}# - (if (if (vector? #{id 28045}#) + (lambda (#{k 34901}# #{id 34902}# #{i 34903}#) + (let ((#{v 34904}# + (let ((#{id 34912}# + (if (if (vector? #{id 34902}#) (if (= (vector-length - #{id 28045}#) + #{id 34902}#) 4) (eq? (vector-ref - #{id 28045}# + #{id 34902}# 0) 'syntax-object) #f) #f) - (vector-ref #{id 28045}# 1) - #{id 28045}#))) + (vector-ref #{id 34902}# 1) + #{id 34902}#))) (gensym (string-append - (symbol->string #{id 28055}#) + (symbol->string #{id 34912}#) " "))))) - (let ((#{l 28048}# - (#{gen-labels 4304}# (list #{v 28047}#)))) - (let ((#{r** 28049}# - (#{extend-var-env 4296}# - #{l 28048}# - (list #{v 28047}#) - #{r* 28036}#))) - (let ((#{w** 28050}# - (#{make-binding-wrap 4315}# - (list #{id 28045}#) - #{l 28048}# - #{w* 28037}#))) - (#{parse-kw 27169}# - #{req 28030}# - #{opt 28031}# - #{rest 28032}# - (cdr #{kw 28033}#) - #{body 28034}# - (cons #{v 28047}# #{vars 28035}#) - #{r** 28049}# - #{w** 28050}# - #{aok 28038}# - (cons (list (syntax->datum #{k 28044}#) - (syntax->datum #{id 28045}#) - #{v 28047}#) - #{out 28039}#) - (cons (#{expand 4333}# - #{i 28046}# - #{r* 28036}# - #{w* 28037}# - #{mod 27164}#) - #{inits 28040}#))))))) - #{tmp 28042}#) + (let ((#{l 34905}# + (#{gen-labels 4413}# (list #{v 34904}#)))) + (let ((#{r** 34906}# + (#{extend-var-env 4406}# + #{l 34905}# + (list #{v 34904}#) + #{r* 34893}#))) + (let ((#{w** 34907}# + (#{make-binding-wrap 4424}# + (list #{id 34902}#) + #{l 34905}# + #{w* 34894}#))) + (#{parse-kw 33953}# + #{req 34887}# + #{opt 34888}# + #{rest 34889}# + (cdr #{kw 34890}#) + #{body 34891}# + (cons #{v 34904}# #{vars 34892}#) + #{r** 34906}# + #{w** 34907}# + #{aok 34895}# + (cons (list (syntax->datum #{k 34901}#) + (syntax->datum #{id 34902}#) + #{v 34904}#) + #{out 34896}#) + (cons (#{expand 4443}# + #{i 34903}# + #{r* 34893}# + #{w* 34894}# + #{mod 33948}#) + #{inits 34897}#))))))) + #{tmp 34899}#) (syntax-violation #f "source expression failed to match any pattern" - #{tmp 28041}#)))) - (#{parse-body 27170}# - #{req 28030}# - #{opt 28031}# - #{rest 28032}# - (if (if #{aok 28038}# - #{aok 28038}# - (pair? #{out 28039}#)) - (cons #{aok 28038}# (reverse #{out 28039}#)) + #{tmp 34898}#)))) + (#{parse-body 33954}# + #{req 34887}# + #{opt 34888}# + #{rest 34889}# + (if (if #{aok 34895}# + #{aok 34895}# + (pair? #{out 34896}#)) + (cons #{aok 34895}# (reverse #{out 34896}#)) #f) - #{body 28034}# - (reverse #{vars 28035}#) - #{r* 28036}# - #{w* 28037}# - (reverse #{inits 28040}#) + #{body 34891}# + (reverse #{vars 34892}#) + #{r* 34893}# + #{w* 34894}# + (reverse #{inits 34897}#) '())))) - (#{parse-body 27170}# - (lambda (#{req 28336}# - #{opt 28337}# - #{rest 28338}# - #{kw 28339}# - #{body 28340}# - #{vars 28341}# - #{r* 28342}# - #{w* 28343}# - #{inits 28344}# - #{meta 28345}#) - (let ((#{tmp 28347}# + (#{parse-body 33954}# + (lambda (#{req 35222}# + #{opt 35223}# + #{rest 35224}# + #{kw 35225}# + #{body 35226}# + #{vars 35227}# + #{r* 35228}# + #{w* 35229}# + #{inits 35230}# + #{meta 35231}#) + (let ((#{tmp 35233}# ($sc-dispatch - #{body 28340}# + #{body 35226}# '(any any . each-any)))) - (if (if #{tmp 28347}# + (if (if #{tmp 35233}# (@apply - (lambda (#{docstring 28351}# #{e1 28352}# #{e2 28353}#) - (string? (syntax->datum #{docstring 28351}#))) - #{tmp 28347}#) + (lambda (#{docstring 35237}# #{e1 35238}# #{e2 35239}#) + (string? (syntax->datum #{docstring 35237}#))) + #{tmp 35233}#) #f) (@apply - (lambda (#{docstring 28354}# #{e1 28355}# #{e2 28356}#) - (#{parse-body 27170}# - #{req 28336}# - #{opt 28337}# - #{rest 28338}# - #{kw 28339}# - (cons #{e1 28355}# #{e2 28356}#) - #{vars 28341}# - #{r* 28342}# - #{w* 28343}# - #{inits 28344}# + (lambda (#{docstring 35240}# #{e1 35241}# #{e2 35242}#) + (#{parse-body 33954}# + #{req 35222}# + #{opt 35223}# + #{rest 35224}# + #{kw 35225}# + (cons #{e1 35241}# #{e2 35242}#) + #{vars 35227}# + #{r* 35228}# + #{w* 35229}# + #{inits 35230}# (append - #{meta 28345}# + #{meta 35231}# (list (cons 'documentation - (syntax->datum #{docstring 28354}#)))))) - #{tmp 28347}#) - (let ((#{tmp 28357}# + (syntax->datum #{docstring 35240}#)))))) + #{tmp 35233}#) + (let ((#{tmp 35243}# ($sc-dispatch - #{body 28340}# + #{body 35226}# '(#(vector #(each (any . any))) any . each-any)))) - (if #{tmp 28357}# + (if #{tmp 35243}# (@apply - (lambda (#{k 28361}# - #{v 28362}# - #{e1 28363}# - #{e2 28364}#) - (#{parse-body 27170}# - #{req 28336}# - #{opt 28337}# - #{rest 28338}# - #{kw 28339}# - (cons #{e1 28363}# #{e2 28364}#) - #{vars 28341}# - #{r* 28342}# - #{w* 28343}# - #{inits 28344}# + (lambda (#{k 35247}# + #{v 35248}# + #{e1 35249}# + #{e2 35250}#) + (#{parse-body 33954}# + #{req 35222}# + #{opt 35223}# + #{rest 35224}# + #{kw 35225}# + (cons #{e1 35249}# #{e2 35250}#) + #{vars 35227}# + #{r* 35228}# + #{w* 35229}# + #{inits 35230}# (append - #{meta 28345}# + #{meta 35231}# (syntax->datum - (map cons #{k 28361}# #{v 28362}#))))) - #{tmp 28357}#) - (let ((#{tmp 28365}# - ($sc-dispatch #{body 28340}# '(any . each-any)))) - (if #{tmp 28365}# + (map cons #{k 35247}# #{v 35248}#))))) + #{tmp 35243}#) + (let ((#{tmp 35251}# + ($sc-dispatch #{body 35226}# '(any . each-any)))) + (if #{tmp 35251}# (@apply - (lambda (#{e1 28369}# #{e2 28370}#) + (lambda (#{e1 35255}# #{e2 35256}#) (values - #{meta 28345}# - #{req 28336}# - #{opt 28337}# - #{rest 28338}# - #{kw 28339}# - #{inits 28344}# - #{vars 28341}# - (#{expand-body 4337}# - (cons #{e1 28369}# #{e2 28370}#) - (#{wrap 4326}# - (begin - (if (if (pair? #{e 27160}#) - #{s 27163}# + #{meta 35231}# + #{req 35222}# + #{opt 35223}# + #{rest 35224}# + #{kw 35225}# + #{inits 35230}# + #{vars 35227}# + (#{expand-body 4447}# + (cons #{e1 35255}# #{e2 35256}#) + (let ((#{x 35268}# + (begin + (if (if (pair? #{e 33944}#) + #{s 33947}# + #f) + (set-source-properties! + #{e 33944}# + #{s 33947}#)) + #{e 33944}#))) + (if (if (null? (car #{w 33946}#)) + (null? (cdr #{w 33946}#)) + #f) + #{x 35268}# + (if (if (vector? #{x 35268}#) + (if (= (vector-length #{x 35268}#) + 4) + (eq? (vector-ref #{x 35268}# 0) + 'syntax-object) + #f) #f) - (set-source-properties! - #{e 27160}# - #{s 27163}#)) - #{e 27160}#) - #{w 27162}# - #{mod 27164}#) - #{r* 28342}# - #{w* 28343}# - #{mod 27164}#))) - #{tmp 28365}#) + (let ((#{expression 35300}# + (vector-ref #{x 35268}# 1)) + (#{wrap 35301}# + (let ((#{w2 35309}# + (vector-ref + #{x 35268}# + 2))) + (let ((#{m1 35310}# + (car #{w 33946}#)) + (#{s1 35311}# + (cdr #{w 33946}#))) + (if (null? #{m1 35310}#) + (if (null? #{s1 35311}#) + #{w2 35309}# + (cons (car #{w2 35309}#) + (let ((#{m2 35326}# + (cdr #{w2 35309}#))) + (if (null? #{m2 35326}#) + #{s1 35311}# + (append + #{s1 35311}# + #{m2 35326}#))))) + (cons (let ((#{m2 35334}# + (car #{w2 35309}#))) + (if (null? #{m2 35334}#) + #{m1 35310}# + (append + #{m1 35310}# + #{m2 35334}#))) + (let ((#{m2 35342}# + (cdr #{w2 35309}#))) + (if (null? #{m2 35342}#) + #{s1 35311}# + (append + #{s1 35311}# + #{m2 35342}#)))))))) + (#{module 35302}# + (vector-ref #{x 35268}# 3))) + (vector + 'syntax-object + #{expression 35300}# + #{wrap 35301}# + #{module 35302}#)) + (if (null? #{x 35268}#) + #{x 35268}# + (vector + 'syntax-object + #{x 35268}# + #{w 33946}# + #{mod 33948}#))))) + #{r* 35228}# + #{w* 35229}# + #{mod 33948}#))) + #{tmp 35251}#) (syntax-violation #f "source expression failed to match any pattern" - #{body 28340}#)))))))))) - (let ((#{tmp 27172}# - ($sc-dispatch #{clauses 27166}# '()))) - (if #{tmp 27172}# + #{body 35226}#)))))))))) + (let ((#{tmp 33956}# + ($sc-dispatch #{clauses 33950}# '()))) + (if #{tmp 33956}# (@apply (lambda () (values '() #f)) - #{tmp 27172}#) - (let ((#{tmp 27177}# + #{tmp 33956}#) + (let ((#{tmp 33961}# ($sc-dispatch - #{clauses 27166}# + #{clauses 33950}# '((any any . each-any) . #(each (any any . each-any)))))) - (if #{tmp 27177}# + (if #{tmp 33961}# (@apply - (lambda (#{args 27181}# - #{e1 27182}# - #{e2 27183}# - #{args* 27184}# - #{e1* 27185}# - #{e2* 27186}#) + (lambda (#{args 33965}# + #{e1 33966}# + #{e2 33967}# + #{args* 33968}# + #{e1* 33969}# + #{e2* 33970}#) (call-with-values (lambda () - (#{get-formals 27165}# #{args 27181}#)) - (lambda (#{req 27187}# - #{opt 27188}# - #{rest 27189}# - #{kw 27190}#) + (#{get-formals 33949}# #{args 33965}#)) + (lambda (#{req 33971}# + #{opt 33972}# + #{rest 33973}# + #{kw 33974}#) (call-with-values (lambda () - (#{parse-req 27167}# - #{req 27187}# - #{opt 27188}# - #{rest 27189}# - #{kw 27190}# - (cons #{e1 27182}# #{e2 27183}#))) - (lambda (#{meta 27257}# - #{req 27258}# - #{opt 27259}# - #{rest 27260}# - #{kw 27261}# - #{inits 27262}# - #{vars 27263}# - #{body 27264}#) + (#{parse-req 33951}# + #{req 33971}# + #{opt 33972}# + #{rest 33973}# + #{kw 33974}# + (cons #{e1 33966}# #{e2 33967}#))) + (lambda (#{meta 34043}# + #{req 34044}# + #{opt 34045}# + #{rest 34046}# + #{kw 34047}# + #{inits 34048}# + #{vars 34049}# + #{body 34050}#) (call-with-values (lambda () - (#{expand-lambda-case 4345}# - #{e 27160}# - #{r 27161}# - #{w 27162}# - #{s 27163}# - #{mod 27164}# - #{get-formals 27165}# - (map (lambda (#{tmp 2763 27265}# - #{tmp 2762 27266}# - #{tmp 2761 27267}#) - (cons #{tmp 2761 27267}# - (cons #{tmp 2762 27266}# - #{tmp 2763 27265}#))) - #{e2* 27186}# - #{e1* 27185}# - #{args* 27184}#))) - (lambda (#{meta* 27268}# #{else* 27269}#) + (#{expand-lambda-case 4455}# + #{e 33944}# + #{r 33945}# + #{w 33946}# + #{s 33947}# + #{mod 33948}# + #{get-formals 33949}# + (map (lambda (#{tmp 2883 34051}# + #{tmp 2882 34052}# + #{tmp 2881 34053}#) + (cons #{tmp 2881 34053}# + (cons #{tmp 2882 34052}# + #{tmp 2883 34051}#))) + #{e2* 33970}# + #{e1* 33969}# + #{args* 33968}#))) + (lambda (#{meta* 34054}# #{else* 34055}#) (values - (append #{meta 27257}# #{meta* 27268}#) + (append #{meta 34043}# #{meta* 34054}#) (make-struct/no-tail - (vector-ref %expanded-vtables 14) - #{s 27163}# - #{req 27258}# - #{opt 27259}# - #{rest 27260}# - #{kw 27261}# - #{inits 27262}# - #{vars 27263}# - #{body 27264}# - #{else* 27269}#))))))))) - #{tmp 27177}#) + (vector-ref %expanded-vtables 15) + #{s 33947}# + #{req 34044}# + #{opt 34045}# + #{rest 34046}# + #{kw 34047}# + #{inits 34048}# + #{vars 34049}# + #{body 34050}# + #{else* 34055}#))))))))) + #{tmp 33961}#) (syntax-violation #f "source expression failed to match any pattern" - #{clauses 27166}#)))))))) - (#{strip 4346}# - (lambda (#{x 28407}# #{w 28408}#) - (if (memq 'top (car #{w 28408}#)) - #{x 28407}# + #{clauses 33950}#)))))))) + (#{strip 4456}# + (lambda (#{x 35369}# #{w 35370}#) + (if (memq 'top (car #{w 35370}#)) + #{x 35369}# (letrec* - ((#{f 28409}# - (lambda (#{x 28412}#) - (if (if (vector? #{x 28412}#) - (if (= (vector-length #{x 28412}#) 4) - (eq? (vector-ref #{x 28412}# 0) 'syntax-object) + ((#{f 35371}# + (lambda (#{x 35374}#) + (if (if (vector? #{x 35374}#) + (if (= (vector-length #{x 35374}#) 4) + (eq? (vector-ref #{x 35374}# 0) 'syntax-object) #f) #f) - (#{strip 4346}# - (vector-ref #{x 28412}# 1) - (vector-ref #{x 28412}# 2)) - (if (pair? #{x 28412}#) - (let ((#{a 28431}# (#{f 28409}# (car #{x 28412}#))) - (#{d 28432}# (#{f 28409}# (cdr #{x 28412}#)))) - (if (if (eq? #{a 28431}# (car #{x 28412}#)) - (eq? #{d 28432}# (cdr #{x 28412}#)) + (#{strip 4456}# + (vector-ref #{x 35374}# 1) + (vector-ref #{x 35374}# 2)) + (if (pair? #{x 35374}#) + (let ((#{a 35393}# (#{f 35371}# (car #{x 35374}#))) + (#{d 35394}# (#{f 35371}# (cdr #{x 35374}#)))) + (if (if (eq? #{a 35393}# (car #{x 35374}#)) + (eq? #{d 35394}# (cdr #{x 35374}#)) #f) - #{x 28412}# - (cons #{a 28431}# #{d 28432}#))) - (if (vector? #{x 28412}#) - (let ((#{old 28435}# (vector->list #{x 28412}#))) - (let ((#{new 28436}# (map #{f 28409}# #{old 28435}#))) + #{x 35374}# + (cons #{a 35393}# #{d 35394}#))) + (if (vector? #{x 35374}#) + (let ((#{old 35397}# (vector->list #{x 35374}#))) + (let ((#{new 35398}# (map #{f 35371}# #{old 35397}#))) (letrec* - ((#{lp 28437}# - (lambda (#{l1 28513}# #{l2 28514}#) - (if (null? #{l1 28513}#) - #{x 28412}# - (if (eq? (car #{l1 28513}#) - (car #{l2 28514}#)) - (#{lp 28437}# - (cdr #{l1 28513}#) - (cdr #{l2 28514}#)) - (list->vector #{new 28436}#)))))) - (#{lp 28437}# #{old 28435}# #{new 28436}#)))) - #{x 28412}#)))))) - (#{f 28409}# #{x 28407}#))))) - (#{gen-var 4347}# - (lambda (#{id 27313}#) - (let ((#{id 27314}# - (if (if (vector? #{id 27313}#) - (if (= (vector-length #{id 27313}#) 4) - (eq? (vector-ref #{id 27313}# 0) 'syntax-object) + ((#{lp 35399}# + (lambda (#{l1 35496}# #{l2 35497}#) + (if (null? #{l1 35496}#) + #{x 35374}# + (if (eq? (car #{l1 35496}#) + (car #{l2 35497}#)) + (#{lp 35399}# + (cdr #{l1 35496}#) + (cdr #{l2 35497}#)) + (list->vector #{new 35398}#)))))) + (#{lp 35399}# #{old 35397}# #{new 35398}#)))) + #{x 35374}#)))))) + (#{f 35371}# #{x 35369}#))))) + (#{gen-var 4457}# + (lambda (#{id 34099}#) + (let ((#{id 34100}# + (if (if (vector? #{id 34099}#) + (if (= (vector-length #{id 34099}#) 4) + (eq? (vector-ref #{id 34099}# 0) 'syntax-object) #f) #f) - (vector-ref #{id 27313}# 1) - #{id 27313}#))) + (vector-ref #{id 34099}# 1) + #{id 34099}#))) (gensym - (string-append (symbol->string #{id 27314}#) " ")))))) + (string-append (symbol->string #{id 34100}#) " "))))) + (#{lambda-var-list 4458}# + (lambda (#{vars 35498}#) + (letrec* + ((#{lvl 35499}# + (lambda (#{vars 35502}# #{ls 35503}# #{w 35504}#) + (if (pair? #{vars 35502}#) + (#{lvl 35499}# + (cdr #{vars 35502}#) + (cons (let ((#{x 35508}# (car #{vars 35502}#))) + (if (if (null? (car #{w 35504}#)) + (null? (cdr #{w 35504}#)) + #f) + #{x 35508}# + (if (if (vector? #{x 35508}#) + (if (= (vector-length #{x 35508}#) 4) + (eq? (vector-ref #{x 35508}# 0) + 'syntax-object) + #f) + #f) + (let ((#{expression 35526}# + (vector-ref #{x 35508}# 1)) + (#{wrap 35527}# + (let ((#{w2 35535}# + (vector-ref #{x 35508}# 2))) + (let ((#{m1 35536}# (car #{w 35504}#)) + (#{s1 35537}# (cdr #{w 35504}#))) + (if (null? #{m1 35536}#) + (if (null? #{s1 35537}#) + #{w2 35535}# + (cons (car #{w2 35535}#) + (let ((#{m2 35552}# + (cdr #{w2 35535}#))) + (if (null? #{m2 35552}#) + #{s1 35537}# + (append + #{s1 35537}# + #{m2 35552}#))))) + (cons (let ((#{m2 35560}# + (car #{w2 35535}#))) + (if (null? #{m2 35560}#) + #{m1 35536}# + (append + #{m1 35536}# + #{m2 35560}#))) + (let ((#{m2 35568}# + (cdr #{w2 35535}#))) + (if (null? #{m2 35568}#) + #{s1 35537}# + (append + #{s1 35537}# + #{m2 35568}#)))))))) + (#{module 35528}# + (vector-ref #{x 35508}# 3))) + (vector + 'syntax-object + #{expression 35526}# + #{wrap 35527}# + #{module 35528}#)) + (if (null? #{x 35508}#) + #{x 35508}# + (vector + 'syntax-object + #{x 35508}# + #{w 35504}# + #f))))) + #{ls 35503}#) + #{w 35504}#) + (if (if (symbol? #{vars 35502}#) + #t + (if (if (vector? #{vars 35502}#) + (if (= (vector-length #{vars 35502}#) 4) + (eq? (vector-ref #{vars 35502}# 0) + 'syntax-object) + #f) + #f) + (symbol? (vector-ref #{vars 35502}# 1)) + #f)) + (cons (if (if (null? (car #{w 35504}#)) + (null? (cdr #{w 35504}#)) + #f) + #{vars 35502}# + (if (if (vector? #{vars 35502}#) + (if (= (vector-length #{vars 35502}#) 4) + (eq? (vector-ref #{vars 35502}# 0) + 'syntax-object) + #f) + #f) + (let ((#{expression 35638}# + (vector-ref #{vars 35502}# 1)) + (#{wrap 35639}# + (let ((#{w2 35649}# + (vector-ref #{vars 35502}# 2))) + (let ((#{m1 35650}# (car #{w 35504}#)) + (#{s1 35651}# (cdr #{w 35504}#))) + (if (null? #{m1 35650}#) + (if (null? #{s1 35651}#) + #{w2 35649}# + (cons (car #{w2 35649}#) + (let ((#{m2 35668}# + (cdr #{w2 35649}#))) + (if (null? #{m2 35668}#) + #{s1 35651}# + (append + #{s1 35651}# + #{m2 35668}#))))) + (cons (let ((#{m2 35676}# + (car #{w2 35649}#))) + (if (null? #{m2 35676}#) + #{m1 35650}# + (append + #{m1 35650}# + #{m2 35676}#))) + (let ((#{m2 35684}# + (cdr #{w2 35649}#))) + (if (null? #{m2 35684}#) + #{s1 35651}# + (append + #{s1 35651}# + #{m2 35684}#)))))))) + (#{module 35640}# + (vector-ref #{vars 35502}# 3))) + (vector + 'syntax-object + #{expression 35638}# + #{wrap 35639}# + #{module 35640}#)) + (if (null? #{vars 35502}#) + #{vars 35502}# + (vector + 'syntax-object + #{vars 35502}# + #{w 35504}# + #f)))) + #{ls 35503}#) + (if (null? #{vars 35502}#) + #{ls 35503}# + (if (if (vector? #{vars 35502}#) + (if (= (vector-length #{vars 35502}#) 4) + (eq? (vector-ref #{vars 35502}# 0) + 'syntax-object) + #f) + #f) + (#{lvl 35499}# + (vector-ref #{vars 35502}# 1) + #{ls 35503}# + (let ((#{w2 35725}# (vector-ref #{vars 35502}# 2))) + (let ((#{m1 35726}# (car #{w 35504}#)) + (#{s1 35727}# (cdr #{w 35504}#))) + (if (null? #{m1 35726}#) + (if (null? #{s1 35727}#) + #{w2 35725}# + (cons (car #{w2 35725}#) + (let ((#{m2 35738}# (cdr #{w2 35725}#))) + (if (null? #{m2 35738}#) + #{s1 35727}# + (append + #{s1 35727}# + #{m2 35738}#))))) + (cons (let ((#{m2 35746}# (car #{w2 35725}#))) + (if (null? #{m2 35746}#) + #{m1 35726}# + (append #{m1 35726}# #{m2 35746}#))) + (let ((#{m2 35754}# (cdr #{w2 35725}#))) + (if (null? #{m2 35754}#) + #{s1 35727}# + (append + #{s1 35727}# + #{m2 35754}#)))))))) + (cons #{vars 35502}# #{ls 35503}#)))))))) + (#{lvl 35499}# #{vars 35498}# '() '(())))))) (begin (module-define! (current-module) @@ -7944,1354 +9027,2070 @@ 'let-syntax 'local-syntax #f)) - (#{global-extend 4299}# + (#{global-extend 4408}# 'core - 'fluid-let-syntax - (lambda (#{e 4468}# - #{r 4469}# - #{w 4470}# - #{s 4471}# - #{mod 4472}#) - (let ((#{tmp 4474}# + 'syntax-parameterize + (lambda (#{e 4585}# + #{r 4586}# + #{w 4587}# + #{s 4588}# + #{mod 4589}#) + (let ((#{tmp 4591}# ($sc-dispatch - #{e 4468}# + #{e 4585}# '(_ #(each (any any)) any . each-any)))) - (if (if #{tmp 4474}# + (if (if #{tmp 4591}# (@apply - (lambda (#{var 4478}# - #{val 4479}# - #{e1 4480}# - #{e2 4481}#) - (#{valid-bound-ids? 4323}# #{var 4478}#)) - #{tmp 4474}#) + (lambda (#{var 4595}# + #{val 4596}# + #{e1 4597}# + #{e2 4598}#) + (#{valid-bound-ids? 4433}# #{var 4595}#)) + #{tmp 4591}#) #f) (@apply - (lambda (#{var 4559}# - #{val 4560}# - #{e1 4561}# - #{e2 4562}#) - (let ((#{names 4563}# - (map (lambda (#{x 4753}#) - (#{id-var-name 4320}# #{x 4753}# #{w 4470}#)) - #{var 4559}#))) - (begin - (for-each - (lambda (#{id 4564}# #{n 4565}#) - (let ((#{atom-key 4566}# - (car (let ((#{t 4690}# - (assq #{n 4565}# #{r 4469}#))) - (if #{t 4690}# - (cdr #{t 4690}#) - (if (symbol? #{n 4565}#) - (let ((#{t 4695}# - (begin - (if (if (not #{mod 4472}#) - (current-module) - #f) - (warn "module system is booted, we should have a module" - #{n 4565}#)) - (let ((#{v 4732}# - (module-variable - (if #{mod 4472}# - (resolve-module - (cdr #{mod 4472}#)) - (current-module)) - #{n 4565}#))) - (if #{v 4732}# - (if (variable-bound? - #{v 4732}#) - (let ((#{val 4741}# - (variable-ref - #{v 4732}#))) - (if (macro? - #{val 4741}#) - (if (macro-type - #{val 4741}#) - (cons (macro-type - #{val 4741}#) - (macro-binding - #{val 4741}#)) - #f) - #f)) - #f) - #f))))) - (if #{t 4695}# - #{t 4695}# - '(global))) - '(displaced-lexical))))))) - (if (let ((#{t 4599}# #{atom-key 4566}#)) - (eqv? #{t 4599}# 'displaced-lexical)) - (syntax-violation - 'fluid-let-syntax - "identifier out of context" - #{e 4468}# - (#{wrap 4326}# - (begin - (if (if (pair? #{id 4564}#) #{s 4471}# #f) - (set-source-properties! - #{id 4564}# - #{s 4471}#)) - #{id 4564}#) - #{w 4470}# - #{mod 4472}#))))) - #{var 4559}# - #{names 4563}#) - (#{expand-body 4337}# - (cons #{e1 4561}# #{e2 4562}#) - (#{wrap 4326}# - (begin - (if (if (pair? #{e 4468}#) #{s 4471}# #f) - (set-source-properties! #{e 4468}# #{s 4471}#)) - #{e 4468}#) - #{w 4470}# - #{mod 4472}#) - (#{extend-env 4295}# - #{names 4563}# - (let ((#{trans-r 4839}# - (#{macros-only-env 4297}# #{r 4469}#))) - (map (lambda (#{x 4840}#) + (lambda (#{var 4683}# + #{val 4684}# + #{e1 4685}# + #{e2 4686}#) + (let ((#{names 4687}# + (map (lambda (#{x 5036}#) + (call-with-values + (lambda () + (#{resolve-identifier 4430}# + #{x 5036}# + #{w 4587}# + #{r 4586}# + #{mod 4589}# + #f)) + (lambda (#{type 5039}# + #{value 5040}# + #{mod 5041}#) + (if (eqv? #{type 5039}# 'displaced-lexical) + (syntax-violation + 'syntax-parameterize + "identifier out of context" + #{e 4585}# + (let ((#{x 5054}# + (begin + (if (if (pair? #{x 5036}#) + #{s 4588}# + #f) + (set-source-properties! + #{x 5036}# + #{s 4588}#)) + #{x 5036}#))) + (if (if (null? (car #{w 4587}#)) + (null? (cdr #{w 4587}#)) + #f) + #{x 5054}# + (if (if (vector? #{x 5054}#) + (if (= (vector-length + #{x 5054}#) + 4) + (eq? (vector-ref + #{x 5054}# + 0) + 'syntax-object) + #f) + #f) + (let ((#{expression 5086}# + (vector-ref #{x 5054}# 1)) + (#{wrap 5087}# + (let ((#{w2 5095}# + (vector-ref + #{x 5054}# + 2))) + (let ((#{m1 5096}# + (car #{w 4587}#)) + (#{s1 5097}# + (cdr #{w 4587}#))) + (if (null? #{m1 5096}#) + (if (null? #{s1 5097}#) + #{w2 5095}# + (cons (car #{w2 5095}#) + (let ((#{m2 5112}# + (cdr #{w2 5095}#))) + (if (null? #{m2 5112}#) + #{s1 5097}# + (append + #{s1 5097}# + #{m2 5112}#))))) + (cons (let ((#{m2 5120}# + (car #{w2 5095}#))) + (if (null? #{m2 5120}#) + #{m1 5096}# + (append + #{m1 5096}# + #{m2 5120}#))) + (let ((#{m2 5128}# + (cdr #{w2 5095}#))) + (if (null? #{m2 5128}#) + #{s1 5097}# + (append + #{s1 5097}# + #{m2 5128}#)))))))) + (#{module 5088}# + (vector-ref + #{x 5054}# + 3))) + (vector + 'syntax-object + #{expression 5086}# + #{wrap 5087}# + #{module 5088}#)) + (if (null? #{x 5054}#) + #{x 5054}# + (vector + 'syntax-object + #{x 5054}# + #{w 4587}# + #{mod 5041}#)))))) + (if (eqv? #{type 5039}# 'syntax-parameter) + #{value 5040}# + (syntax-violation + 'syntax-parameterize + "invalid syntax parameter" + #{e 4585}# + (let ((#{x 5155}# + (begin + (if (if (pair? #{x 5036}#) + #{s 4588}# + #f) + (set-source-properties! + #{x 5036}# + #{s 4588}#)) + #{x 5036}#))) + (if (if (null? (car #{w 4587}#)) + (null? (cdr #{w 4587}#)) + #f) + #{x 5155}# + (if (if (vector? #{x 5155}#) + (if (= (vector-length + #{x 5155}#) + 4) + (eq? (vector-ref + #{x 5155}# + 0) + 'syntax-object) + #f) + #f) + (let ((#{expression 5187}# + (vector-ref + #{x 5155}# + 1)) + (#{wrap 5188}# + (let ((#{w2 5196}# + (vector-ref + #{x 5155}# + 2))) + (let ((#{m1 5197}# + (car #{w 4587}#)) + (#{s1 5198}# + (cdr #{w 4587}#))) + (if (null? #{m1 5197}#) + (if (null? #{s1 5198}#) + #{w2 5196}# + (cons (car #{w2 5196}#) + (let ((#{m2 5213}# + (cdr #{w2 5196}#))) + (if (null? #{m2 5213}#) + #{s1 5198}# + (append + #{s1 5198}# + #{m2 5213}#))))) + (cons (let ((#{m2 5221}# + (car #{w2 5196}#))) + (if (null? #{m2 5221}#) + #{m1 5197}# + (append + #{m1 5197}# + #{m2 5221}#))) + (let ((#{m2 5229}# + (cdr #{w2 5196}#))) + (if (null? #{m2 5229}#) + #{s1 5198}# + (append + #{s1 5198}# + #{m2 5229}#)))))))) + (#{module 5189}# + (vector-ref + #{x 5155}# + 3))) + (vector + 'syntax-object + #{expression 5187}# + #{wrap 5188}# + #{module 5189}#)) + (if (null? #{x 5155}#) + #{x 5155}# + (vector + 'syntax-object + #{x 5155}# + #{w 4587}# + #{mod 5041}#))))))))))) + #{var 4683}#)) + (#{bindings 4688}# + (let ((#{trans-r 5244}# + (#{macros-only-env 4407}# #{r 4586}#))) + (map (lambda (#{x 5245}#) (cons 'macro - (#{eval-local-transformer 4339}# - (#{expand 4333}# - #{x 4840}# - #{trans-r 4839}# - #{w 4470}# - #{mod 4472}#) - #{mod 4472}#))) - #{val 4560}#)) - #{r 4469}#) - #{w 4470}# - #{mod 4472}#)))) - #{tmp 4474}#) + (#{eval-local-transformer 4449}# + (#{expand 4443}# + #{x 5245}# + #{trans-r 5244}# + #{w 4587}# + #{mod 4589}#) + #{mod 4589}#))) + #{val 4684}#)))) + (#{expand-body 4447}# + (cons #{e1 4685}# #{e2 4686}#) + (let ((#{x 4700}# + (begin + (if (if (pair? #{e 4585}#) #{s 4588}# #f) + (set-source-properties! #{e 4585}# #{s 4588}#)) + #{e 4585}#))) + (if (if (null? (car #{w 4587}#)) + (null? (cdr #{w 4587}#)) + #f) + #{x 4700}# + (if (if (vector? #{x 4700}#) + (if (= (vector-length #{x 4700}#) 4) + (eq? (vector-ref #{x 4700}# 0) 'syntax-object) + #f) + #f) + (let ((#{expression 4732}# (vector-ref #{x 4700}# 1)) + (#{wrap 4733}# + (let ((#{w2 4741}# + (vector-ref #{x 4700}# 2))) + (let ((#{m1 4742}# (car #{w 4587}#)) + (#{s1 4743}# (cdr #{w 4587}#))) + (if (null? #{m1 4742}#) + (if (null? #{s1 4743}#) + #{w2 4741}# + (cons (car #{w2 4741}#) + (let ((#{m2 4758}# + (cdr #{w2 4741}#))) + (if (null? #{m2 4758}#) + #{s1 4743}# + (append + #{s1 4743}# + #{m2 4758}#))))) + (cons (let ((#{m2 4766}# + (car #{w2 4741}#))) + (if (null? #{m2 4766}#) + #{m1 4742}# + (append + #{m1 4742}# + #{m2 4766}#))) + (let ((#{m2 4774}# + (cdr #{w2 4741}#))) + (if (null? #{m2 4774}#) + #{s1 4743}# + (append + #{s1 4743}# + #{m2 4774}#)))))))) + (#{module 4734}# (vector-ref #{x 4700}# 3))) + (vector + 'syntax-object + #{expression 4732}# + #{wrap 4733}# + #{module 4734}#)) + (if (null? #{x 4700}#) + #{x 4700}# + (vector + 'syntax-object + #{x 4700}# + #{w 4587}# + #{mod 4589}#))))) + (#{extend-env 4405}# + #{names 4687}# + #{bindings 4688}# + #{r 4586}#) + #{w 4587}# + #{mod 4589}#))) + #{tmp 4591}#) (syntax-violation - 'fluid-let-syntax + 'syntax-parameterize "bad syntax" - (#{wrap 4326}# - (begin - (if (if (pair? #{e 4468}#) #{s 4471}# #f) - (set-source-properties! #{e 4468}# #{s 4471}#)) - #{e 4468}#) - #{w 4470}# - #{mod 4472}#)))))) + (let ((#{x 5469}# + (begin + (if (if (pair? #{e 4585}#) #{s 4588}# #f) + (set-source-properties! #{e 4585}# #{s 4588}#)) + #{e 4585}#))) + (if (if (null? (car #{w 4587}#)) + (null? (cdr #{w 4587}#)) + #f) + #{x 5469}# + (if (if (vector? #{x 5469}#) + (if (= (vector-length #{x 5469}#) 4) + (eq? (vector-ref #{x 5469}# 0) 'syntax-object) + #f) + #f) + (let ((#{expression 5501}# (vector-ref #{x 5469}# 1)) + (#{wrap 5502}# + (let ((#{w2 5510}# (vector-ref #{x 5469}# 2))) + (let ((#{m1 5511}# (car #{w 4587}#)) + (#{s1 5512}# (cdr #{w 4587}#))) + (if (null? #{m1 5511}#) + (if (null? #{s1 5512}#) + #{w2 5510}# + (cons (car #{w2 5510}#) + (let ((#{m2 5527}# + (cdr #{w2 5510}#))) + (if (null? #{m2 5527}#) + #{s1 5512}# + (append + #{s1 5512}# + #{m2 5527}#))))) + (cons (let ((#{m2 5535}# (car #{w2 5510}#))) + (if (null? #{m2 5535}#) + #{m1 5511}# + (append #{m1 5511}# #{m2 5535}#))) + (let ((#{m2 5543}# (cdr #{w2 5510}#))) + (if (null? #{m2 5543}#) + #{s1 5512}# + (append + #{s1 5512}# + #{m2 5543}#)))))))) + (#{module 5503}# (vector-ref #{x 5469}# 3))) + (vector + 'syntax-object + #{expression 5501}# + #{wrap 5502}# + #{module 5503}#)) + (if (null? #{x 5469}#) + #{x 5469}# + (vector + 'syntax-object + #{x 5469}# + #{w 4587}# + #{mod 4589}#)))))))))) (module-define! (current-module) 'quote (make-syntax-transformer 'quote 'core - (lambda (#{e 5054}# - #{r 5055}# - #{w 5056}# - #{s 5057}# - #{mod 5058}#) - (let ((#{tmp 5060}# ($sc-dispatch #{e 5054}# '(_ any)))) - (if #{tmp 5060}# + (lambda (#{e 5571}# + #{r 5572}# + #{w 5573}# + #{s 5574}# + #{mod 5575}#) + (let ((#{tmp 5577}# ($sc-dispatch #{e 5571}# '(_ any)))) + (if #{tmp 5577}# (@apply - (lambda (#{e 5063}#) - (let ((#{exp 5067}# - (#{strip 4346}# #{e 5063}# #{w 5056}#))) + (lambda (#{e 5580}#) + (let ((#{exp 5584}# + (#{strip 4456}# #{e 5580}# #{w 5573}#))) (make-struct/no-tail (vector-ref %expanded-vtables 1) - #{s 5057}# - #{exp 5067}#))) - #{tmp 5060}#) + #{s 5574}# + #{exp 5584}#))) + #{tmp 5577}#) (syntax-violation 'quote "bad syntax" - (#{wrap 4326}# - (begin - (if (if (pair? #{e 5054}#) #{s 5057}# #f) - (set-source-properties! #{e 5054}# #{s 5057}#)) - #{e 5054}#) - #{w 5056}# - #{mod 5058}#))))))) - (#{global-extend 4299}# + (let ((#{x 5598}# + (begin + (if (if (pair? #{e 5571}#) #{s 5574}# #f) + (set-source-properties! #{e 5571}# #{s 5574}#)) + #{e 5571}#))) + (if (if (null? (car #{w 5573}#)) + (null? (cdr #{w 5573}#)) + #f) + #{x 5598}# + (if (if (vector? #{x 5598}#) + (if (= (vector-length #{x 5598}#) 4) + (eq? (vector-ref #{x 5598}# 0) 'syntax-object) + #f) + #f) + (let ((#{expression 5630}# (vector-ref #{x 5598}# 1)) + (#{wrap 5631}# + (let ((#{w2 5639}# (vector-ref #{x 5598}# 2))) + (let ((#{m1 5640}# (car #{w 5573}#)) + (#{s1 5641}# (cdr #{w 5573}#))) + (if (null? #{m1 5640}#) + (if (null? #{s1 5641}#) + #{w2 5639}# + (cons (car #{w2 5639}#) + (let ((#{m2 5656}# + (cdr #{w2 5639}#))) + (if (null? #{m2 5656}#) + #{s1 5641}# + (append + #{s1 5641}# + #{m2 5656}#))))) + (cons (let ((#{m2 5664}# + (car #{w2 5639}#))) + (if (null? #{m2 5664}#) + #{m1 5640}# + (append + #{m1 5640}# + #{m2 5664}#))) + (let ((#{m2 5672}# + (cdr #{w2 5639}#))) + (if (null? #{m2 5672}#) + #{s1 5641}# + (append + #{s1 5641}# + #{m2 5672}#)))))))) + (#{module 5632}# (vector-ref #{x 5598}# 3))) + (vector + 'syntax-object + #{expression 5630}# + #{wrap 5631}# + #{module 5632}#)) + (if (null? #{x 5598}#) + #{x 5598}# + (vector + 'syntax-object + #{x 5598}# + #{w 5573}# + #{mod 5575}#))))))))))) + (#{global-extend 4408}# 'core 'syntax (letrec* - ((#{gen-syntax 5294}# - (lambda (#{src 5396}# - #{e 5397}# - #{r 5398}# - #{maps 5399}# - #{ellipsis? 5400}# - #{mod 5401}#) - (if (if (symbol? #{e 5397}#) + ((#{gen-syntax 5896}# + (lambda (#{src 6359}# + #{e 6360}# + #{r 6361}# + #{maps 6362}# + #{ellipsis? 6363}# + #{mod 6364}#) + (if (if (symbol? #{e 6360}#) #t - (if (if (vector? #{e 5397}#) - (if (= (vector-length #{e 5397}#) 4) - (eq? (vector-ref #{e 5397}# 0) 'syntax-object) + (if (if (vector? #{e 6360}#) + (if (= (vector-length #{e 6360}#) 4) + (eq? (vector-ref #{e 6360}# 0) 'syntax-object) #f) #f) - (symbol? (vector-ref #{e 5397}# 1)) + (symbol? (vector-ref #{e 6360}# 1)) #f)) - (let ((#{label 5428}# - (#{id-var-name 4320}# #{e 5397}# '(())))) - (let ((#{b 5429}# - (let ((#{t 5566}# (assq #{label 5428}# #{r 5398}#))) - (if #{t 5566}# - (cdr #{t 5566}#) - (if (symbol? #{label 5428}#) - (let ((#{t 5571}# - (begin - (if (if (not #{mod 5401}#) - (current-module) - #f) - (warn "module system is booted, we should have a module" - #{label 5428}#)) - (let ((#{v 5608}# - (module-variable - (if #{mod 5401}# - (resolve-module - (cdr #{mod 5401}#)) - (current-module)) - #{label 5428}#))) - (if #{v 5608}# - (if (variable-bound? #{v 5608}#) - (let ((#{val 5617}# - (variable-ref - #{v 5608}#))) - (if (macro? #{val 5617}#) - (if (macro-type - #{val 5617}#) - (cons (macro-type - #{val 5617}#) - (macro-binding - #{val 5617}#)) - #f) - #f)) - #f) - #f))))) - (if #{t 5571}# #{t 5571}# '(global))) - '(displaced-lexical)))))) - (if (eq? (car #{b 5429}#) 'syntax) + (call-with-values + (lambda () + (#{resolve-identifier 4430}# + #{e 6360}# + '(()) + #{r 6361}# + #{mod 6364}# + #f)) + (lambda (#{type 6393}# #{value 6394}# #{mod 6395}#) + (if (eqv? #{type 6393}# 'syntax) (call-with-values (lambda () - (let ((#{var.lev 5462}# (cdr #{b 5429}#))) - (#{gen-ref 5295}# - #{src 5396}# - (car #{var.lev 5462}#) - (cdr #{var.lev 5462}#) - #{maps 5399}#))) - (lambda (#{var 5558}# #{maps 5559}#) - (values (list 'ref #{var 5558}#) #{maps 5559}#))) - (if (#{ellipsis? 5400}# #{e 5397}#) + (#{gen-ref 5897}# + #{src 6359}# + (car #{value 6394}#) + (cdr #{value 6394}#) + #{maps 6362}#)) + (lambda (#{var 6401}# #{maps 6402}#) + (values (list 'ref #{var 6401}#) #{maps 6402}#))) + (if (#{ellipsis? 6363}# #{e 6360}#) (syntax-violation 'syntax "misplaced ellipsis" - #{src 5396}#) - (values (list 'quote #{e 5397}#) #{maps 5399}#))))) - (let ((#{tmp 5629}# - ($sc-dispatch #{e 5397}# '(any any)))) - (if (if #{tmp 5629}# + #{src 6359}#) + (values (list 'quote #{e 6360}#) #{maps 6362}#))))) + (let ((#{tmp 6404}# + ($sc-dispatch #{e 6360}# '(any any)))) + (if (if #{tmp 6404}# (@apply - (lambda (#{dots 5633}# #{e 5634}#) - (#{ellipsis? 5400}# #{dots 5633}#)) - #{tmp 5629}#) + (lambda (#{dots 6408}# #{e 6409}#) + (#{ellipsis? 6363}# #{dots 6408}#)) + #{tmp 6404}#) #f) (@apply - (lambda (#{dots 5635}# #{e 5636}#) - (#{gen-syntax 5294}# - #{src 5396}# - #{e 5636}# - #{r 5398}# - #{maps 5399}# - (lambda (#{x 5637}#) #f) - #{mod 5401}#)) - #{tmp 5629}#) - (let ((#{tmp 5638}# - ($sc-dispatch #{e 5397}# '(any any . any)))) - (if (if #{tmp 5638}# + (lambda (#{dots 6410}# #{e 6411}#) + (#{gen-syntax 5896}# + #{src 6359}# + #{e 6411}# + #{r 6361}# + #{maps 6362}# + (lambda (#{x 6412}#) #f) + #{mod 6364}#)) + #{tmp 6404}#) + (let ((#{tmp 6413}# + ($sc-dispatch #{e 6360}# '(any any . any)))) + (if (if #{tmp 6413}# (@apply - (lambda (#{x 5642}# #{dots 5643}# #{y 5644}#) - (#{ellipsis? 5400}# #{dots 5643}#)) - #{tmp 5638}#) + (lambda (#{x 6417}# #{dots 6418}# #{y 6419}#) + (#{ellipsis? 6363}# #{dots 6418}#)) + #{tmp 6413}#) #f) (@apply - (lambda (#{x 5645}# #{dots 5646}# #{y 5647}#) + (lambda (#{x 6420}# #{dots 6421}# #{y 6422}#) (letrec* - ((#{f 5648}# - (lambda (#{y 5656}# #{k 5657}#) - (let ((#{tmp 5659}# + ((#{f 6423}# + (lambda (#{y 6431}# #{k 6432}#) + (let ((#{tmp 6434}# ($sc-dispatch - #{y 5656}# + #{y 6431}# '(any . any)))) - (if (if #{tmp 5659}# + (if (if #{tmp 6434}# (@apply - (lambda (#{dots 5663}# #{y 5664}#) - (#{ellipsis? 5400}# - #{dots 5663}#)) - #{tmp 5659}#) + (lambda (#{dots 6438}# #{y 6439}#) + (#{ellipsis? 6363}# + #{dots 6438}#)) + #{tmp 6434}#) #f) (@apply - (lambda (#{dots 5665}# #{y 5666}#) - (#{f 5648}# - #{y 5666}# - (lambda (#{maps 5667}#) + (lambda (#{dots 6440}# #{y 6441}#) + (#{f 6423}# + #{y 6441}# + (lambda (#{maps 6442}#) (call-with-values (lambda () - (#{k 5657}# - (cons '() #{maps 5667}#))) - (lambda (#{x 5668}# - #{maps 5669}#) - (if (null? (car #{maps 5669}#)) + (#{k 6432}# + (cons '() #{maps 6442}#))) + (lambda (#{x 6443}# + #{maps 6444}#) + (if (null? (car #{maps 6444}#)) (syntax-violation 'syntax "extra ellipsis" - #{src 5396}#) + #{src 6359}#) (values - (let ((#{map-env 5673}# - (car #{maps 5669}#))) + (let ((#{map-env 6448}# + (car #{maps 6444}#))) (list 'apply '(primitive append) - (#{gen-map 5297}# - #{x 5668}# - #{map-env 5673}#))) - (cdr #{maps 5669}#)))))))) - #{tmp 5659}#) + (#{gen-map 5899}# + #{x 6443}# + #{map-env 6448}#))) + (cdr #{maps 6444}#)))))))) + #{tmp 6434}#) (call-with-values (lambda () - (#{gen-syntax 5294}# - #{src 5396}# - #{y 5656}# - #{r 5398}# - #{maps 5399}# - #{ellipsis? 5400}# - #{mod 5401}#)) - (lambda (#{y 5676}# #{maps 5677}#) + (#{gen-syntax 5896}# + #{src 6359}# + #{y 6431}# + #{r 6361}# + #{maps 6362}# + #{ellipsis? 6363}# + #{mod 6364}#)) + (lambda (#{y 6451}# #{maps 6452}#) (call-with-values (lambda () - (#{k 5657}# #{maps 5677}#)) - (lambda (#{x 5678}# #{maps 5679}#) + (#{k 6432}# #{maps 6452}#)) + (lambda (#{x 6453}# #{maps 6454}#) (values - (if (equal? #{y 5676}# ''()) - #{x 5678}# + (if (equal? #{y 6451}# ''()) + #{x 6453}# (list 'append - #{x 5678}# - #{y 5676}#)) - #{maps 5679}#)))))))))) - (#{f 5648}# - #{y 5647}# - (lambda (#{maps 5651}#) + #{x 6453}# + #{y 6451}#)) + #{maps 6454}#)))))))))) + (#{f 6423}# + #{y 6422}# + (lambda (#{maps 6426}#) (call-with-values (lambda () - (#{gen-syntax 5294}# - #{src 5396}# - #{x 5645}# - #{r 5398}# - (cons '() #{maps 5651}#) - #{ellipsis? 5400}# - #{mod 5401}#)) - (lambda (#{x 5652}# #{maps 5653}#) - (if (null? (car #{maps 5653}#)) + (#{gen-syntax 5896}# + #{src 6359}# + #{x 6420}# + #{r 6361}# + (cons '() #{maps 6426}#) + #{ellipsis? 6363}# + #{mod 6364}#)) + (lambda (#{x 6427}# #{maps 6428}#) + (if (null? (car #{maps 6428}#)) (syntax-violation 'syntax "extra ellipsis" - #{src 5396}#) + #{src 6359}#) (values - (#{gen-map 5297}# - #{x 5652}# - (car #{maps 5653}#)) - (cdr #{maps 5653}#))))))))) - #{tmp 5638}#) - (let ((#{tmp 5695}# - ($sc-dispatch #{e 5397}# '(any . any)))) - (if #{tmp 5695}# + (#{gen-map 5899}# + #{x 6427}# + (car #{maps 6428}#)) + (cdr #{maps 6428}#))))))))) + #{tmp 6413}#) + (let ((#{tmp 6470}# + ($sc-dispatch #{e 6360}# '(any . any)))) + (if #{tmp 6470}# (@apply - (lambda (#{x 5699}# #{y 5700}#) + (lambda (#{x 6474}# #{y 6475}#) (call-with-values (lambda () - (#{gen-syntax 5294}# - #{src 5396}# - #{x 5699}# - #{r 5398}# - #{maps 5399}# - #{ellipsis? 5400}# - #{mod 5401}#)) - (lambda (#{x 5701}# #{maps 5702}#) + (#{gen-syntax 5896}# + #{src 6359}# + #{x 6474}# + #{r 6361}# + #{maps 6362}# + #{ellipsis? 6363}# + #{mod 6364}#)) + (lambda (#{x 6476}# #{maps 6477}#) (call-with-values (lambda () - (#{gen-syntax 5294}# - #{src 5396}# - #{y 5700}# - #{r 5398}# - #{maps 5702}# - #{ellipsis? 5400}# - #{mod 5401}#)) - (lambda (#{y 5703}# #{maps 5704}#) + (#{gen-syntax 5896}# + #{src 6359}# + #{y 6475}# + #{r 6361}# + #{maps 6477}# + #{ellipsis? 6363}# + #{mod 6364}#)) + (lambda (#{y 6478}# #{maps 6479}#) (values - (let ((#{atom-key 5709}# - (car #{y 5703}#))) - (if (eqv? #{atom-key 5709}# 'quote) - (if (eq? (car #{x 5701}#) 'quote) + (let ((#{atom-key 6484}# + (car #{y 6478}#))) + (if (eqv? #{atom-key 6484}# 'quote) + (if (eq? (car #{x 6476}#) 'quote) (list 'quote - (cons (car (cdr #{x 5701}#)) - (car (cdr #{y 5703}#)))) - (if (eq? (car (cdr #{y 5703}#)) + (cons (car (cdr #{x 6476}#)) + (car (cdr #{y 6478}#)))) + (if (eq? (car (cdr #{y 6478}#)) '()) - (list 'list #{x 5701}#) + (list 'list #{x 6476}#) (list 'cons - #{x 5701}# - #{y 5703}#))) - (if (eqv? #{atom-key 5709}# 'list) + #{x 6476}# + #{y 6478}#))) + (if (eqv? #{atom-key 6484}# 'list) (cons 'list - (cons #{x 5701}# - (cdr #{y 5703}#))) + (cons #{x 6476}# + (cdr #{y 6478}#))) (list 'cons - #{x 5701}# - #{y 5703}#)))) - #{maps 5704}#)))))) - #{tmp 5695}#) - (let ((#{tmp 5738}# + #{x 6476}# + #{y 6478}#)))) + #{maps 6479}#)))))) + #{tmp 6470}#) + (let ((#{tmp 6513}# ($sc-dispatch - #{e 5397}# + #{e 6360}# '#(vector (any . each-any))))) - (if #{tmp 5738}# + (if #{tmp 6513}# (@apply - (lambda (#{e1 5742}# #{e2 5743}#) + (lambda (#{e1 6517}# #{e2 6518}#) (call-with-values (lambda () - (#{gen-syntax 5294}# - #{src 5396}# - (cons #{e1 5742}# #{e2 5743}#) - #{r 5398}# - #{maps 5399}# - #{ellipsis? 5400}# - #{mod 5401}#)) - (lambda (#{e 5744}# #{maps 5745}#) + (#{gen-syntax 5896}# + #{src 6359}# + (cons #{e1 6517}# #{e2 6518}#) + #{r 6361}# + #{maps 6362}# + #{ellipsis? 6363}# + #{mod 6364}#)) + (lambda (#{e 6519}# #{maps 6520}#) (values - (if (eq? (car #{e 5744}#) 'list) - (cons 'vector (cdr #{e 5744}#)) - (if (eq? (car #{e 5744}#) 'quote) + (if (eq? (car #{e 6519}#) 'list) + (cons 'vector (cdr #{e 6519}#)) + (if (eq? (car #{e 6519}#) 'quote) (list 'quote (list->vector - (car (cdr #{e 5744}#)))) - (list 'list->vector #{e 5744}#))) - #{maps 5745}#)))) - #{tmp 5738}#) + (car (cdr #{e 6519}#)))) + (list 'list->vector #{e 6519}#))) + #{maps 6520}#)))) + #{tmp 6513}#) (values - (list 'quote #{e 5397}#) - #{maps 5399}#)))))))))))) - (#{gen-ref 5295}# - (lambda (#{src 5772}# - #{var 5773}# - #{level 5774}# - #{maps 5775}#) - (if (= #{level 5774}# 0) - (values #{var 5773}# #{maps 5775}#) - (if (null? #{maps 5775}#) + (list 'quote #{e 6360}#) + #{maps 6362}#)))))))))))) + (#{gen-ref 5897}# + (lambda (#{src 6547}# + #{var 6548}# + #{level 6549}# + #{maps 6550}#) + (if (= #{level 6549}# 0) + (values #{var 6548}# #{maps 6550}#) + (if (null? #{maps 6550}#) (syntax-violation 'syntax "missing ellipsis" - #{src 5772}#) + #{src 6547}#) (call-with-values (lambda () - (#{gen-ref 5295}# - #{src 5772}# - #{var 5773}# - (#{1-}# #{level 5774}#) - (cdr #{maps 5775}#))) - (lambda (#{outer-var 5776}# #{outer-maps 5777}#) - (let ((#{b 5778}# - (assq #{outer-var 5776}# (car #{maps 5775}#)))) - (if #{b 5778}# - (values (cdr #{b 5778}#) #{maps 5775}#) - (let ((#{inner-var 5780}# + (#{gen-ref 5897}# + #{src 6547}# + #{var 6548}# + (#{1-}# #{level 6549}#) + (cdr #{maps 6550}#))) + (lambda (#{outer-var 6551}# #{outer-maps 6552}#) + (let ((#{b 6553}# + (assq #{outer-var 6551}# (car #{maps 6550}#)))) + (if #{b 6553}# + (values (cdr #{b 6553}#) #{maps 6550}#) + (let ((#{inner-var 6555}# (gensym (string-append (symbol->string 'tmp) " ")))) (values - #{inner-var 5780}# - (cons (cons (cons #{outer-var 5776}# - #{inner-var 5780}#) - (car #{maps 5775}#)) - #{outer-maps 5777}#))))))))))) - (#{gen-map 5297}# - (lambda (#{e 5794}# #{map-env 5795}#) - (let ((#{formals 5796}# (map cdr #{map-env 5795}#)) - (#{actuals 5797}# - (map (lambda (#{x 5799}#) - (list 'ref (car #{x 5799}#))) - #{map-env 5795}#))) - (if (eq? (car #{e 5794}#) 'ref) - (car #{actuals 5797}#) + #{inner-var 6555}# + (cons (cons (cons #{outer-var 6551}# + #{inner-var 6555}#) + (car #{maps 6550}#)) + #{outer-maps 6552}#))))))))))) + (#{gen-map 5899}# + (lambda (#{e 6569}# #{map-env 6570}#) + (let ((#{formals 6571}# (map cdr #{map-env 6570}#)) + (#{actuals 6572}# + (map (lambda (#{x 6574}#) + (list 'ref (car #{x 6574}#))) + #{map-env 6570}#))) + (if (eq? (car #{e 6569}#) 'ref) + (car #{actuals 6572}#) (if (and-map - (lambda (#{x 5800}#) - (if (eq? (car #{x 5800}#) 'ref) - (memq (car (cdr #{x 5800}#)) #{formals 5796}#) + (lambda (#{x 6575}#) + (if (eq? (car #{x 6575}#) 'ref) + (memq (car (cdr #{x 6575}#)) #{formals 6571}#) #f)) - (cdr #{e 5794}#)) + (cdr #{e 6569}#)) (cons 'map - (cons (list 'primitive (car #{e 5794}#)) - (map (let ((#{r 5802}# + (cons (list 'primitive (car #{e 6569}#)) + (map (let ((#{r 6577}# (map cons - #{formals 5796}# - #{actuals 5797}#))) - (lambda (#{x 5803}#) - (cdr (assq (car (cdr #{x 5803}#)) - #{r 5802}#)))) - (cdr #{e 5794}#)))) + #{formals 6571}# + #{actuals 6572}#))) + (lambda (#{x 6578}#) + (cdr (assq (car (cdr #{x 6578}#)) + #{r 6577}#)))) + (cdr #{e 6569}#)))) (cons 'map - (cons (list 'lambda #{formals 5796}# #{e 5794}#) - #{actuals 5797}#))))))) - (#{regen 5301}# - (lambda (#{x 5805}#) - (let ((#{atom-key 5806}# (car #{x 5805}#))) - (if (eqv? #{atom-key 5806}# 'ref) - (let ((#{name 5816}# (car (cdr #{x 5805}#))) - (#{var 5817}# (car (cdr #{x 5805}#)))) + (cons (list 'lambda #{formals 6571}# #{e 6569}#) + #{actuals 6572}#))))))) + (#{regen 5903}# + (lambda (#{x 6580}#) + (let ((#{atom-key 6581}# (car #{x 6580}#))) + (if (eqv? #{atom-key 6581}# 'ref) + (let ((#{name 6591}# (car (cdr #{x 6580}#))) + (#{var 6592}# (car (cdr #{x 6580}#)))) (make-struct/no-tail (vector-ref %expanded-vtables 3) #f - #{name 5816}# - #{var 5817}#)) - (if (eqv? #{atom-key 5806}# 'primitive) - (let ((#{name 5829}# (car (cdr #{x 5805}#)))) - (if (equal? (module-name (current-module)) '(guile)) - (make-struct/no-tail - (vector-ref %expanded-vtables 7) - #f - #{name 5829}#) - (make-struct/no-tail - (vector-ref %expanded-vtables 5) - #f - '(guile) - #{name 5829}# - #f))) - (if (eqv? #{atom-key 5806}# 'quote) - (let ((#{exp 5847}# (car (cdr #{x 5805}#)))) + #{name 6591}# + #{var 6592}#)) + (if (eqv? #{atom-key 6581}# 'primitive) + (let ((#{name 6603}# (car (cdr #{x 6580}#)))) + (make-struct/no-tail + (vector-ref %expanded-vtables 2) + #f + #{name 6603}#)) + (if (eqv? #{atom-key 6581}# 'quote) + (let ((#{exp 6614}# (car (cdr #{x 6580}#)))) (make-struct/no-tail (vector-ref %expanded-vtables 1) #f - #{exp 5847}#)) - (if (eqv? #{atom-key 5806}# 'lambda) - (if (list? (car (cdr #{x 5805}#))) - (let ((#{req 5858}# (car (cdr #{x 5805}#))) - (#{vars 5860}# (car (cdr #{x 5805}#))) - (#{exp 5862}# - (#{regen 5301}# - (car (cdr (cdr #{x 5805}#)))))) - (let ((#{body 5867}# + #{exp 6614}#)) + (if (eqv? #{atom-key 6581}# 'lambda) + (if (list? (car (cdr #{x 6580}#))) + (let ((#{req 6625}# (car (cdr #{x 6580}#))) + (#{vars 6627}# (car (cdr #{x 6580}#))) + (#{exp 6629}# + (#{regen 5903}# + (car (cdr (cdr #{x 6580}#)))))) + (let ((#{body 6634}# (make-struct/no-tail - (vector-ref %expanded-vtables 14) + (vector-ref %expanded-vtables 15) #f - #{req 5858}# + #{req 6625}# #f #f #f '() - #{vars 5860}# - #{exp 5862}# + #{vars 6627}# + #{exp 6629}# #f))) (make-struct/no-tail - (vector-ref %expanded-vtables 13) + (vector-ref %expanded-vtables 14) #f '() - #{body 5867}#))) - (error "how did we get here" #{x 5805}#)) - (let ((#{fun-exp 5883}# - (let ((#{name 5892}# (car #{x 5805}#))) - (if (equal? - (module-name (current-module)) - '(guile)) - (make-struct/no-tail - (vector-ref %expanded-vtables 7) - #f - #{name 5892}#) - (make-struct/no-tail - (vector-ref %expanded-vtables 5) - #f - '(guile) - #{name 5892}# - #f)))) - (#{arg-exps 5884}# - (map #{regen 5301}# (cdr #{x 5805}#)))) + #{body 6634}#))) + (error "how did we get here" #{x 6580}#)) + (let ((#{name 6650}# (car #{x 6580}#)) + (#{args 6651}# + (map #{regen 5903}# (cdr #{x 6580}#)))) (make-struct/no-tail - (vector-ref %expanded-vtables 11) + (vector-ref %expanded-vtables 12) #f - #{fun-exp 5883}# - #{arg-exps 5884}#)))))))))) - (lambda (#{e 5302}# - #{r 5303}# - #{w 5304}# - #{s 5305}# - #{mod 5306}#) - (let ((#{e 5307}# - (#{wrap 4326}# - (begin - (if (if (pair? #{e 5302}#) #{s 5305}# #f) - (set-source-properties! #{e 5302}# #{s 5305}#)) - #{e 5302}#) - #{w 5304}# - #{mod 5306}#))) - (let ((#{tmp 5309}# ($sc-dispatch #{e 5307}# '(_ any)))) - (if #{tmp 5309}# - (@apply - (lambda (#{x 5334}#) - (call-with-values - (lambda () - (#{gen-syntax 5294}# - #{e 5307}# - #{x 5334}# - #{r 5303}# - '() - #{ellipsis? 4341}# - #{mod 5306}#)) - (lambda (#{e 5388}# #{maps 5389}#) - (#{regen 5301}# #{e 5388}#)))) - #{tmp 5309}#) - (syntax-violation - 'syntax - "bad `syntax' form" - #{e 5307}#))))))) - (#{global-extend 4299}# + #{name 6650}# + #{args 6651}#)))))))))) + (lambda (#{e 5904}# + #{r 5905}# + #{w 5906}# + #{s 5907}# + #{mod 5908}#) + (let ((#{e 5909}# + (let ((#{x 6270}# + (begin + (if (if (pair? #{e 5904}#) #{s 5907}# #f) + (set-source-properties! #{e 5904}# #{s 5907}#)) + #{e 5904}#))) + (if (if (null? (car #{w 5906}#)) + (null? (cdr #{w 5906}#)) + #f) + #{x 6270}# + (if (if (vector? #{x 6270}#) + (if (= (vector-length #{x 6270}#) 4) + (eq? (vector-ref #{x 6270}# 0) 'syntax-object) + #f) + #f) + (let ((#{expression 6302}# (vector-ref #{x 6270}# 1)) + (#{wrap 6303}# + (let ((#{w2 6311}# (vector-ref #{x 6270}# 2))) + (let ((#{m1 6312}# (car #{w 5906}#)) + (#{s1 6313}# (cdr #{w 5906}#))) + (if (null? #{m1 6312}#) + (if (null? #{s1 6313}#) + #{w2 6311}# + (cons (car #{w2 6311}#) + (let ((#{m2 6328}# + (cdr #{w2 6311}#))) + (if (null? #{m2 6328}#) + #{s1 6313}# + (append + #{s1 6313}# + #{m2 6328}#))))) + (cons (let ((#{m2 6336}# + (car #{w2 6311}#))) + (if (null? #{m2 6336}#) + #{m1 6312}# + (append + #{m1 6312}# + #{m2 6336}#))) + (let ((#{m2 6344}# + (cdr #{w2 6311}#))) + (if (null? #{m2 6344}#) + #{s1 6313}# + (append + #{s1 6313}# + #{m2 6344}#)))))))) + (#{module 6304}# (vector-ref #{x 6270}# 3))) + (vector + 'syntax-object + #{expression 6302}# + #{wrap 6303}# + #{module 6304}#)) + (if (null? #{x 6270}#) + #{x 6270}# + (vector + 'syntax-object + #{x 6270}# + #{w 5906}# + #{mod 5908}#))))))) + (let ((#{tmp 5910}# #{e 5909}#)) + (let ((#{tmp 5911}# + ($sc-dispatch #{tmp 5910}# '(_ any)))) + (if #{tmp 5911}# + (@apply + (lambda (#{x 5963}#) + (call-with-values + (lambda () + (#{gen-syntax 5896}# + #{e 5909}# + #{x 5963}# + #{r 5905}# + '() + #{ellipsis? 4451}# + #{mod 5908}#)) + (lambda (#{e 6046}# #{maps 6047}#) + (#{regen 5903}# #{e 6046}#)))) + #{tmp 5911}#) + (syntax-violation + 'syntax + "bad `syntax' form" + #{e 5909}#)))))))) + (#{global-extend 4408}# 'core 'lambda - (lambda (#{e 6087}# - #{r 6088}# - #{w 6089}# - #{s 6090}# - #{mod 6091}#) - (let ((#{tmp 6093}# - ($sc-dispatch #{e 6087}# '(_ any any . each-any)))) - (if #{tmp 6093}# + (lambda (#{e 6887}# + #{r 6888}# + #{w 6889}# + #{s 6890}# + #{mod 6891}#) + (let ((#{tmp 6893}# + ($sc-dispatch #{e 6887}# '(_ any any . each-any)))) + (if #{tmp 6893}# (@apply - (lambda (#{args 6097}# #{e1 6098}# #{e2 6099}#) + (lambda (#{args 6897}# #{e1 6898}# #{e2 6899}#) (call-with-values (lambda () - (#{lambda-formals 4342}# #{args 6097}#)) - (lambda (#{req 6102}# - #{opt 6103}# - #{rest 6104}# - #{kw 6105}#) + (#{lambda-formals 4452}# #{args 6897}#)) + (lambda (#{req 6902}# + #{opt 6903}# + #{rest 6904}# + #{kw 6905}#) (letrec* - ((#{lp 6106}# - (lambda (#{body 6109}# #{meta 6110}#) - (let ((#{tmp 6112}# + ((#{lp 6906}# + (lambda (#{body 6909}# #{meta 6910}#) + (let ((#{tmp 6912}# ($sc-dispatch - #{body 6109}# + #{body 6909}# '(any any . each-any)))) - (if (if #{tmp 6112}# + (if (if #{tmp 6912}# (@apply - (lambda (#{docstring 6116}# - #{e1 6117}# - #{e2 6118}#) + (lambda (#{docstring 6916}# + #{e1 6917}# + #{e2 6918}#) (string? - (syntax->datum #{docstring 6116}#))) - #{tmp 6112}#) + (syntax->datum #{docstring 6916}#))) + #{tmp 6912}#) #f) (@apply - (lambda (#{docstring 6119}# - #{e1 6120}# - #{e2 6121}#) - (#{lp 6106}# - (cons #{e1 6120}# #{e2 6121}#) + (lambda (#{docstring 6919}# + #{e1 6920}# + #{e2 6921}#) + (#{lp 6906}# + (cons #{e1 6920}# #{e2 6921}#) (append - #{meta 6110}# + #{meta 6910}# (list (cons 'documentation (syntax->datum - #{docstring 6119}#)))))) - #{tmp 6112}#) - (let ((#{tmp 6122}# + #{docstring 6919}#)))))) + #{tmp 6912}#) + (let ((#{tmp 6922}# ($sc-dispatch - #{body 6109}# + #{body 6909}# '(#(vector #(each (any . any))) any . each-any)))) - (if #{tmp 6122}# + (if #{tmp 6922}# (@apply - (lambda (#{k 6126}# - #{v 6127}# - #{e1 6128}# - #{e2 6129}#) - (#{lp 6106}# - (cons #{e1 6128}# #{e2 6129}#) + (lambda (#{k 6926}# + #{v 6927}# + #{e1 6928}# + #{e2 6929}#) + (#{lp 6906}# + (cons #{e1 6928}# #{e2 6929}#) (append - #{meta 6110}# + #{meta 6910}# (syntax->datum (map cons - #{k 6126}# - #{v 6127}#))))) - #{tmp 6122}#) - (#{expand-simple-lambda 4343}# - #{e 6087}# - #{r 6088}# - #{w 6089}# - #{s 6090}# - #{mod 6091}# - #{req 6102}# - #{rest 6104}# - #{meta 6110}# - #{body 6109}#)))))))) - (#{lp 6106}# (cons #{e1 6098}# #{e2 6099}#) '()))))) - #{tmp 6093}#) + #{k 6926}# + #{v 6927}#))))) + #{tmp 6922}#) + (#{expand-simple-lambda 4453}# + #{e 6887}# + #{r 6888}# + #{w 6889}# + #{s 6890}# + #{mod 6891}# + #{req 6902}# + #{rest 6904}# + #{meta 6910}# + #{body 6909}#)))))))) + (#{lp 6906}# (cons #{e1 6898}# #{e2 6899}#) '()))))) + #{tmp 6893}#) (syntax-violation 'lambda "bad lambda" - #{e 6087}#))))) - (#{global-extend 4299}# + #{e 6887}#))))) + (#{global-extend 4408}# 'core 'lambda* - (lambda (#{e 6421}# - #{r 6422}# - #{w 6423}# - #{s 6424}# - #{mod 6425}#) - (let ((#{tmp 6427}# - ($sc-dispatch #{e 6421}# '(_ any any . each-any)))) - (if #{tmp 6427}# + (lambda (#{e 7313}# + #{r 7314}# + #{w 7315}# + #{s 7316}# + #{mod 7317}#) + (let ((#{tmp 7319}# + ($sc-dispatch #{e 7313}# '(_ any any . each-any)))) + (if #{tmp 7319}# (@apply - (lambda (#{args 6431}# #{e1 6432}# #{e2 6433}#) + (lambda (#{args 7323}# #{e1 7324}# #{e2 7325}#) (call-with-values (lambda () - (#{expand-lambda-case 4345}# - #{e 6421}# - #{r 6422}# - #{w 6423}# - #{s 6424}# - #{mod 6425}# - #{lambda*-formals 4344}# - (list (cons #{args 6431}# - (cons #{e1 6432}# #{e2 6433}#))))) - (lambda (#{meta 6436}# #{lcase 6437}#) + (#{expand-lambda-case 4455}# + #{e 7313}# + #{r 7314}# + #{w 7315}# + #{s 7316}# + #{mod 7317}# + #{lambda*-formals 4454}# + (list (cons #{args 7323}# + (cons #{e1 7324}# #{e2 7325}#))))) + (lambda (#{meta 7328}# #{lcase 7329}#) (make-struct/no-tail - (vector-ref %expanded-vtables 13) - #{s 6424}# - #{meta 6436}# - #{lcase 6437}#)))) - #{tmp 6427}#) + (vector-ref %expanded-vtables 14) + #{s 7316}# + #{meta 7328}# + #{lcase 7329}#)))) + #{tmp 7319}#) (syntax-violation 'lambda "bad lambda*" - #{e 6421}#))))) - (#{global-extend 4299}# + #{e 7313}#))))) + (#{global-extend 4408}# 'core 'case-lambda - (lambda (#{e 6611}# - #{r 6612}# - #{w 6613}# - #{s 6614}# - #{mod 6615}#) - (let ((#{tmp 6617}# + (lambda (#{e 7492}# + #{r 7493}# + #{w 7494}# + #{s 7495}# + #{mod 7496}#) + (let ((#{tmp 7498}# ($sc-dispatch - #{e 6611}# + #{e 7492}# '(_ (any any . each-any) . #(each (any any . each-any)))))) - (if #{tmp 6617}# + (if #{tmp 7498}# (@apply - (lambda (#{args 6621}# - #{e1 6622}# - #{e2 6623}# - #{args* 6624}# - #{e1* 6625}# - #{e2* 6626}#) + (lambda (#{args 7502}# + #{e1 7503}# + #{e2 7504}# + #{args* 7505}# + #{e1* 7506}# + #{e2* 7507}#) (call-with-values (lambda () - (#{expand-lambda-case 4345}# - #{e 6611}# - #{r 6612}# - #{w 6613}# - #{s 6614}# - #{mod 6615}# - #{lambda-formals 4342}# - (cons (cons #{args 6621}# - (cons #{e1 6622}# #{e2 6623}#)) - (map (lambda (#{tmp 3262 6629}# - #{tmp 3261 6630}# - #{tmp 3260 6631}#) - (cons #{tmp 3260 6631}# - (cons #{tmp 3261 6630}# - #{tmp 3262 6629}#))) - #{e2* 6626}# - #{e1* 6625}# - #{args* 6624}#)))) - (lambda (#{meta 6632}# #{lcase 6633}#) + (#{expand-lambda-case 4455}# + #{e 7492}# + #{r 7493}# + #{w 7494}# + #{s 7495}# + #{mod 7496}# + #{lambda-formals 4452}# + (cons (cons #{args 7502}# + (cons #{e1 7503}# #{e2 7504}#)) + (map (lambda (#{tmp 3382 7510}# + #{tmp 3381 7511}# + #{tmp 3380 7512}#) + (cons #{tmp 3380 7512}# + (cons #{tmp 3381 7511}# + #{tmp 3382 7510}#))) + #{e2* 7507}# + #{e1* 7506}# + #{args* 7505}#)))) + (lambda (#{meta 7513}# #{lcase 7514}#) (make-struct/no-tail - (vector-ref %expanded-vtables 13) - #{s 6614}# - #{meta 6632}# - #{lcase 6633}#)))) - #{tmp 6617}#) + (vector-ref %expanded-vtables 14) + #{s 7495}# + #{meta 7513}# + #{lcase 7514}#)))) + #{tmp 7498}#) (syntax-violation 'case-lambda "bad case-lambda" - #{e 6611}#))))) - (#{global-extend 4299}# + #{e 7492}#))))) + (#{global-extend 4408}# 'core 'case-lambda* - (lambda (#{e 6796}# - #{r 6797}# - #{w 6798}# - #{s 6799}# - #{mod 6800}#) - (let ((#{tmp 6802}# + (lambda (#{e 7683}# + #{r 7684}# + #{w 7685}# + #{s 7686}# + #{mod 7687}#) + (let ((#{tmp 7689}# ($sc-dispatch - #{e 6796}# + #{e 7683}# '(_ (any any . each-any) . #(each (any any . each-any)))))) - (if #{tmp 6802}# + (if #{tmp 7689}# (@apply - (lambda (#{args 6806}# - #{e1 6807}# - #{e2 6808}# - #{args* 6809}# - #{e1* 6810}# - #{e2* 6811}#) + (lambda (#{args 7693}# + #{e1 7694}# + #{e2 7695}# + #{args* 7696}# + #{e1* 7697}# + #{e2* 7698}#) (call-with-values (lambda () - (#{expand-lambda-case 4345}# - #{e 6796}# - #{r 6797}# - #{w 6798}# - #{s 6799}# - #{mod 6800}# - #{lambda*-formals 4344}# - (cons (cons #{args 6806}# - (cons #{e1 6807}# #{e2 6808}#)) - (map (lambda (#{tmp 3297 6814}# - #{tmp 3296 6815}# - #{tmp 3295 6816}#) - (cons #{tmp 3295 6816}# - (cons #{tmp 3296 6815}# - #{tmp 3297 6814}#))) - #{e2* 6811}# - #{e1* 6810}# - #{args* 6809}#)))) - (lambda (#{meta 6817}# #{lcase 6818}#) + (#{expand-lambda-case 4455}# + #{e 7683}# + #{r 7684}# + #{w 7685}# + #{s 7686}# + #{mod 7687}# + #{lambda*-formals 4454}# + (cons (cons #{args 7693}# + (cons #{e1 7694}# #{e2 7695}#)) + (map (lambda (#{tmp 3417 7701}# + #{tmp 3416 7702}# + #{tmp 3415 7703}#) + (cons #{tmp 3415 7703}# + (cons #{tmp 3416 7702}# + #{tmp 3417 7701}#))) + #{e2* 7698}# + #{e1* 7697}# + #{args* 7696}#)))) + (lambda (#{meta 7704}# #{lcase 7705}#) (make-struct/no-tail - (vector-ref %expanded-vtables 13) - #{s 6799}# - #{meta 6817}# - #{lcase 6818}#)))) - #{tmp 6802}#) + (vector-ref %expanded-vtables 14) + #{s 7686}# + #{meta 7704}# + #{lcase 7705}#)))) + #{tmp 7689}#) (syntax-violation 'case-lambda "bad case-lambda*" - #{e 6796}#))))) - (#{global-extend 4299}# + #{e 7683}#))))) + (#{global-extend 4408}# 'core 'let (letrec* - ((#{expand-let 7010}# - (lambda (#{e 7159}# - #{r 7160}# - #{w 7161}# - #{s 7162}# - #{mod 7163}# - #{constructor 7164}# - #{ids 7165}# - #{vals 7166}# - #{exps 7167}#) - (if (not (#{valid-bound-ids? 4323}# #{ids 7165}#)) + ((#{expand-let 7914}# + (lambda (#{e 8124}# + #{r 8125}# + #{w 8126}# + #{s 8127}# + #{mod 8128}# + #{constructor 8129}# + #{ids 8130}# + #{vals 8131}# + #{exps 8132}#) + (if (not (#{valid-bound-ids? 4433}# #{ids 8130}#)) (syntax-violation 'let "duplicate bound variable" - #{e 7159}#) - (let ((#{labels 7245}# - (#{gen-labels 4304}# #{ids 7165}#)) - (#{new-vars 7246}# - (map #{gen-var 4347}# #{ids 7165}#))) - (let ((#{nw 7247}# - (#{make-binding-wrap 4315}# - #{ids 7165}# - #{labels 7245}# - #{w 7161}#)) - (#{nr 7248}# - (#{extend-var-env 4296}# - #{labels 7245}# - #{new-vars 7246}# - #{r 7160}#))) - (#{constructor 7164}# - #{s 7162}# - (map syntax->datum #{ids 7165}#) - #{new-vars 7246}# - (map (lambda (#{x 7265}#) - (#{expand 4333}# - #{x 7265}# - #{r 7160}# - #{w 7161}# - #{mod 7163}#)) - #{vals 7166}#) - (#{expand-body 4337}# - #{exps 7167}# - (#{source-wrap 4327}# - #{e 7159}# - #{nw 7247}# - #{s 7162}# - #{mod 7163}#) - #{nr 7248}# - #{nw 7247}# - #{mod 7163}#)))))))) - (lambda (#{e 7011}# - #{r 7012}# - #{w 7013}# - #{s 7014}# - #{mod 7015}#) - (let ((#{tmp 7017}# + #{e 8124}#) + (let ((#{labels 8217}# + (#{gen-labels 4413}# #{ids 8130}#)) + (#{new-vars 8218}# + (map #{gen-var 4457}# #{ids 8130}#))) + (let ((#{nw 8219}# + (#{make-binding-wrap 4424}# + #{ids 8130}# + #{labels 8217}# + #{w 8126}#)) + (#{nr 8220}# + (#{extend-var-env 4406}# + #{labels 8217}# + #{new-vars 8218}# + #{r 8125}#))) + (#{constructor 8129}# + #{s 8127}# + (map syntax->datum #{ids 8130}#) + #{new-vars 8218}# + (map (lambda (#{x 8237}#) + (#{expand 4443}# + #{x 8237}# + #{r 8125}# + #{w 8126}# + #{mod 8128}#)) + #{vals 8131}#) + (#{expand-body 4447}# + #{exps 8132}# + (#{source-wrap 4437}# + #{e 8124}# + #{nw 8219}# + #{s 8127}# + #{mod 8128}#) + #{nr 8220}# + #{nw 8219}# + #{mod 8128}#)))))))) + (lambda (#{e 7915}# + #{r 7916}# + #{w 7917}# + #{s 7918}# + #{mod 7919}#) + (let ((#{tmp 7921}# ($sc-dispatch - #{e 7011}# + #{e 7915}# '(_ #(each (any any)) any . each-any)))) - (if (if #{tmp 7017}# + (if (if #{tmp 7921}# (@apply - (lambda (#{id 7021}# - #{val 7022}# - #{e1 7023}# - #{e2 7024}#) - (and-map #{id? 4301}# #{id 7021}#)) - #{tmp 7017}#) + (lambda (#{id 7925}# + #{val 7926}# + #{e1 7927}# + #{e2 7928}#) + (and-map #{id? 4410}# #{id 7925}#)) + #{tmp 7921}#) #f) (@apply - (lambda (#{id 7040}# - #{val 7041}# - #{e1 7042}# - #{e2 7043}#) - (#{expand-let 7010}# - #{e 7011}# - #{r 7012}# - #{w 7013}# - #{s 7014}# - #{mod 7015}# - #{build-let 4283}# - #{id 7040}# - #{val 7041}# - (cons #{e1 7042}# #{e2 7043}#))) - #{tmp 7017}#) - (let ((#{tmp 7073}# + (lambda (#{id 7944}# + #{val 7945}# + #{e1 7946}# + #{e2 7947}#) + (#{expand-let 7914}# + #{e 7915}# + #{r 7916}# + #{w 7917}# + #{s 7918}# + #{mod 7919}# + (lambda (#{src 7951}# + #{ids 7952}# + #{vars 7953}# + #{val-exps 7954}# + #{body-exp 7955}#) + (begin + (for-each + #{maybe-name-value! 4375}# + #{ids 7952}# + #{val-exps 7954}#) + (if (null? #{vars 7953}#) + #{body-exp 7955}# + (make-struct/no-tail + (vector-ref %expanded-vtables 16) + #{src 7951}# + #{ids 7952}# + #{vars 7953}# + #{val-exps 7954}# + #{body-exp 7955}#)))) + #{id 7944}# + #{val 7945}# + (cons #{e1 7946}# #{e2 7947}#))) + #{tmp 7921}#) + (let ((#{tmp 7962}# ($sc-dispatch - #{e 7011}# + #{e 7915}# '(_ any #(each (any any)) any . each-any)))) - (if (if #{tmp 7073}# + (if (if #{tmp 7962}# (@apply - (lambda (#{f 7077}# - #{id 7078}# - #{val 7079}# - #{e1 7080}# - #{e2 7081}#) - (if (if (symbol? #{f 7077}#) + (lambda (#{f 7966}# + #{id 7967}# + #{val 7968}# + #{e1 7969}# + #{e2 7970}#) + (if (if (symbol? #{f 7966}#) #t - (if (if (vector? #{f 7077}#) - (if (= (vector-length #{f 7077}#) 4) - (eq? (vector-ref #{f 7077}# 0) + (if (if (vector? #{f 7966}#) + (if (= (vector-length #{f 7966}#) 4) + (eq? (vector-ref #{f 7966}# 0) 'syntax-object) #f) #f) - (symbol? (vector-ref #{f 7077}# 1)) + (symbol? (vector-ref #{f 7966}# 1)) #f)) - (and-map #{id? 4301}# #{id 7078}#) + (and-map #{id? 4410}# #{id 7967}#) #f)) - #{tmp 7073}#) + #{tmp 7962}#) #f) (@apply - (lambda (#{f 7123}# - #{id 7124}# - #{val 7125}# - #{e1 7126}# - #{e2 7127}#) - (#{expand-let 7010}# - #{e 7011}# - #{r 7012}# - #{w 7013}# - #{s 7014}# - #{mod 7015}# - #{build-named-let 4284}# - (cons #{f 7123}# #{id 7124}#) - #{val 7125}# - (cons #{e1 7126}# #{e2 7127}#))) - #{tmp 7073}#) + (lambda (#{f 8012}# + #{id 8013}# + #{val 8014}# + #{e1 8015}# + #{e2 8016}#) + (#{expand-let 7914}# + #{e 7915}# + #{r 7916}# + #{w 7917}# + #{s 7918}# + #{mod 7919}# + #{build-named-let 4394}# + (cons #{f 8012}# #{id 8013}#) + #{val 8014}# + (cons #{e1 8015}# #{e2 8016}#))) + #{tmp 7962}#) (syntax-violation 'let "bad let" - (#{wrap 4326}# - (begin - (if (if (pair? #{e 7011}#) #{s 7014}# #f) - (set-source-properties! #{e 7011}# #{s 7014}#)) - #{e 7011}#) - #{w 7013}# - #{mod 7015}#))))))))) - (#{global-extend 4299}# + (let ((#{x 8029}# + (begin + (if (if (pair? #{e 7915}#) #{s 7918}# #f) + (set-source-properties! #{e 7915}# #{s 7918}#)) + #{e 7915}#))) + (if (if (null? (car #{w 7917}#)) + (null? (cdr #{w 7917}#)) + #f) + #{x 8029}# + (if (if (vector? #{x 8029}#) + (if (= (vector-length #{x 8029}#) 4) + (eq? (vector-ref #{x 8029}# 0) 'syntax-object) + #f) + #f) + (let ((#{expression 8061}# (vector-ref #{x 8029}# 1)) + (#{wrap 8062}# + (let ((#{w2 8070}# + (vector-ref #{x 8029}# 2))) + (let ((#{m1 8071}# (car #{w 7917}#)) + (#{s1 8072}# (cdr #{w 7917}#))) + (if (null? #{m1 8071}#) + (if (null? #{s1 8072}#) + #{w2 8070}# + (cons (car #{w2 8070}#) + (let ((#{m2 8087}# + (cdr #{w2 8070}#))) + (if (null? #{m2 8087}#) + #{s1 8072}# + (append + #{s1 8072}# + #{m2 8087}#))))) + (cons (let ((#{m2 8095}# + (car #{w2 8070}#))) + (if (null? #{m2 8095}#) + #{m1 8071}# + (append + #{m1 8071}# + #{m2 8095}#))) + (let ((#{m2 8103}# + (cdr #{w2 8070}#))) + (if (null? #{m2 8103}#) + #{s1 8072}# + (append + #{s1 8072}# + #{m2 8103}#)))))))) + (#{module 8063}# (vector-ref #{x 8029}# 3))) + (vector + 'syntax-object + #{expression 8061}# + #{wrap 8062}# + #{module 8063}#)) + (if (null? #{x 8029}#) + #{x 8029}# + (vector + 'syntax-object + #{x 8029}# + #{w 7917}# + #{mod 7919}#))))))))))))) + (#{global-extend 4408}# 'core 'letrec - (lambda (#{e 7714}# - #{r 7715}# - #{w 7716}# - #{s 7717}# - #{mod 7718}#) - (let ((#{tmp 7720}# + (lambda (#{e 8714}# + #{r 8715}# + #{w 8716}# + #{s 8717}# + #{mod 8718}#) + (let ((#{tmp 8720}# ($sc-dispatch - #{e 7714}# + #{e 8714}# '(_ #(each (any any)) any . each-any)))) - (if (if #{tmp 7720}# + (if (if #{tmp 8720}# (@apply - (lambda (#{id 7724}# - #{val 7725}# - #{e1 7726}# - #{e2 7727}#) - (and-map #{id? 4301}# #{id 7724}#)) - #{tmp 7720}#) + (lambda (#{id 8724}# + #{val 8725}# + #{e1 8726}# + #{e2 8727}#) + (and-map #{id? 4410}# #{id 8724}#)) + #{tmp 8720}#) #f) (@apply - (lambda (#{id 7743}# - #{val 7744}# - #{e1 7745}# - #{e2 7746}#) - (if (not (#{valid-bound-ids? 4323}# #{id 7743}#)) + (lambda (#{id 8743}# + #{val 8744}# + #{e1 8745}# + #{e2 8746}#) + (if (not (#{valid-bound-ids? 4433}# #{id 8743}#)) (syntax-violation 'letrec "duplicate bound variable" - #{e 7714}#) - (let ((#{labels 7836}# - (#{gen-labels 4304}# #{id 7743}#)) - (#{new-vars 7837}# - (map #{gen-var 4347}# #{id 7743}#))) - (let ((#{w 7838}# - (#{make-binding-wrap 4315}# - #{id 7743}# - #{labels 7836}# - #{w 7716}#)) - (#{r 7839}# - (#{extend-var-env 4296}# - #{labels 7836}# - #{new-vars 7837}# - #{r 7715}#))) - (#{build-letrec 4285}# - #{s 7717}# + #{e 8714}#) + (let ((#{labels 8843}# + (#{gen-labels 4413}# #{id 8743}#)) + (#{new-vars 8844}# + (map #{gen-var 4457}# #{id 8743}#))) + (let ((#{w 8845}# + (#{make-binding-wrap 4424}# + #{id 8743}# + #{labels 8843}# + #{w 8716}#)) + (#{r 8846}# + (#{extend-var-env 4406}# + #{labels 8843}# + #{new-vars 8844}# + #{r 8715}#))) + (#{build-letrec 4395}# + #{s 8717}# #f - (map syntax->datum #{id 7743}#) - #{new-vars 7837}# - (map (lambda (#{x 7926}#) - (#{expand 4333}# - #{x 7926}# - #{r 7839}# - #{w 7838}# - #{mod 7718}#)) - #{val 7744}#) - (#{expand-body 4337}# - (cons #{e1 7745}# #{e2 7746}#) - (#{wrap 4326}# - (begin - (if (if (pair? #{e 7714}#) #{s 7717}# #f) - (set-source-properties! #{e 7714}# #{s 7717}#)) - #{e 7714}#) - #{w 7838}# - #{mod 7718}#) - #{r 7839}# - #{w 7838}# - #{mod 7718}#)))))) - #{tmp 7720}#) + (map syntax->datum #{id 8743}#) + #{new-vars 8844}# + (map (lambda (#{x 8925}#) + (#{expand 4443}# + #{x 8925}# + #{r 8846}# + #{w 8845}# + #{mod 8718}#)) + #{val 8744}#) + (#{expand-body 4447}# + (cons #{e1 8745}# #{e2 8746}#) + (let ((#{x 8987}# + (begin + (if (if (pair? #{e 8714}#) #{s 8717}# #f) + (set-source-properties! + #{e 8714}# + #{s 8717}#)) + #{e 8714}#))) + (if (if (null? (car #{w 8845}#)) + (null? (cdr #{w 8845}#)) + #f) + #{x 8987}# + (if (if (vector? #{x 8987}#) + (if (= (vector-length #{x 8987}#) 4) + (eq? (vector-ref #{x 8987}# 0) + 'syntax-object) + #f) + #f) + (let ((#{expression 9019}# + (vector-ref #{x 8987}# 1)) + (#{wrap 9020}# + (let ((#{w2 9028}# + (vector-ref #{x 8987}# 2))) + (let ((#{m1 9029}# (car #{w 8845}#)) + (#{s1 9030}# (cdr #{w 8845}#))) + (if (null? #{m1 9029}#) + (if (null? #{s1 9030}#) + #{w2 9028}# + (cons (car #{w2 9028}#) + (let ((#{m2 9045}# + (cdr #{w2 9028}#))) + (if (null? #{m2 9045}#) + #{s1 9030}# + (append + #{s1 9030}# + #{m2 9045}#))))) + (cons (let ((#{m2 9053}# + (car #{w2 9028}#))) + (if (null? #{m2 9053}#) + #{m1 9029}# + (append + #{m1 9029}# + #{m2 9053}#))) + (let ((#{m2 9061}# + (cdr #{w2 9028}#))) + (if (null? #{m2 9061}#) + #{s1 9030}# + (append + #{s1 9030}# + #{m2 9061}#)))))))) + (#{module 9021}# + (vector-ref #{x 8987}# 3))) + (vector + 'syntax-object + #{expression 9019}# + #{wrap 9020}# + #{module 9021}#)) + (if (null? #{x 8987}#) + #{x 8987}# + (vector + 'syntax-object + #{x 8987}# + #{w 8845}# + #{mod 8718}#))))) + #{r 8846}# + #{w 8845}# + #{mod 8718}#)))))) + #{tmp 8720}#) (syntax-violation 'letrec "bad letrec" - (#{wrap 4326}# - (begin - (if (if (pair? #{e 7714}#) #{s 7717}# #f) - (set-source-properties! #{e 7714}# #{s 7717}#)) - #{e 7714}#) - #{w 7716}# - #{mod 7718}#)))))) - (#{global-extend 4299}# + (let ((#{x 9301}# + (begin + (if (if (pair? #{e 8714}#) #{s 8717}# #f) + (set-source-properties! #{e 8714}# #{s 8717}#)) + #{e 8714}#))) + (if (if (null? (car #{w 8716}#)) + (null? (cdr #{w 8716}#)) + #f) + #{x 9301}# + (if (if (vector? #{x 9301}#) + (if (= (vector-length #{x 9301}#) 4) + (eq? (vector-ref #{x 9301}# 0) 'syntax-object) + #f) + #f) + (let ((#{expression 9333}# (vector-ref #{x 9301}# 1)) + (#{wrap 9334}# + (let ((#{w2 9342}# (vector-ref #{x 9301}# 2))) + (let ((#{m1 9343}# (car #{w 8716}#)) + (#{s1 9344}# (cdr #{w 8716}#))) + (if (null? #{m1 9343}#) + (if (null? #{s1 9344}#) + #{w2 9342}# + (cons (car #{w2 9342}#) + (let ((#{m2 9359}# + (cdr #{w2 9342}#))) + (if (null? #{m2 9359}#) + #{s1 9344}# + (append + #{s1 9344}# + #{m2 9359}#))))) + (cons (let ((#{m2 9367}# (car #{w2 9342}#))) + (if (null? #{m2 9367}#) + #{m1 9343}# + (append #{m1 9343}# #{m2 9367}#))) + (let ((#{m2 9375}# (cdr #{w2 9342}#))) + (if (null? #{m2 9375}#) + #{s1 9344}# + (append + #{s1 9344}# + #{m2 9375}#)))))))) + (#{module 9335}# (vector-ref #{x 9301}# 3))) + (vector + 'syntax-object + #{expression 9333}# + #{wrap 9334}# + #{module 9335}#)) + (if (null? #{x 9301}#) + #{x 9301}# + (vector + 'syntax-object + #{x 9301}# + #{w 8716}# + #{mod 8718}#)))))))))) + (#{global-extend 4408}# 'core 'letrec* - (lambda (#{e 8343}# - #{r 8344}# - #{w 8345}# - #{s 8346}# - #{mod 8347}#) - (let ((#{tmp 8349}# + (lambda (#{e 9526}# + #{r 9527}# + #{w 9528}# + #{s 9529}# + #{mod 9530}#) + (let ((#{tmp 9532}# ($sc-dispatch - #{e 8343}# + #{e 9526}# '(_ #(each (any any)) any . each-any)))) - (if (if #{tmp 8349}# + (if (if #{tmp 9532}# (@apply - (lambda (#{id 8353}# - #{val 8354}# - #{e1 8355}# - #{e2 8356}#) - (and-map #{id? 4301}# #{id 8353}#)) - #{tmp 8349}#) + (lambda (#{id 9536}# + #{val 9537}# + #{e1 9538}# + #{e2 9539}#) + (and-map #{id? 4410}# #{id 9536}#)) + #{tmp 9532}#) #f) (@apply - (lambda (#{id 8372}# - #{val 8373}# - #{e1 8374}# - #{e2 8375}#) - (if (not (#{valid-bound-ids? 4323}# #{id 8372}#)) + (lambda (#{id 9555}# + #{val 9556}# + #{e1 9557}# + #{e2 9558}#) + (if (not (#{valid-bound-ids? 4433}# #{id 9555}#)) (syntax-violation 'letrec* "duplicate bound variable" - #{e 8343}#) - (let ((#{labels 8465}# - (#{gen-labels 4304}# #{id 8372}#)) - (#{new-vars 8466}# - (map #{gen-var 4347}# #{id 8372}#))) - (let ((#{w 8467}# - (#{make-binding-wrap 4315}# - #{id 8372}# - #{labels 8465}# - #{w 8345}#)) - (#{r 8468}# - (#{extend-var-env 4296}# - #{labels 8465}# - #{new-vars 8466}# - #{r 8344}#))) - (#{build-letrec 4285}# - #{s 8346}# + #{e 9526}#) + (let ((#{labels 9655}# + (#{gen-labels 4413}# #{id 9555}#)) + (#{new-vars 9656}# + (map #{gen-var 4457}# #{id 9555}#))) + (let ((#{w 9657}# + (#{make-binding-wrap 4424}# + #{id 9555}# + #{labels 9655}# + #{w 9528}#)) + (#{r 9658}# + (#{extend-var-env 4406}# + #{labels 9655}# + #{new-vars 9656}# + #{r 9527}#))) + (#{build-letrec 4395}# + #{s 9529}# #t - (map syntax->datum #{id 8372}#) - #{new-vars 8466}# - (map (lambda (#{x 8555}#) - (#{expand 4333}# - #{x 8555}# - #{r 8468}# - #{w 8467}# - #{mod 8347}#)) - #{val 8373}#) - (#{expand-body 4337}# - (cons #{e1 8374}# #{e2 8375}#) - (#{wrap 4326}# - (begin - (if (if (pair? #{e 8343}#) #{s 8346}# #f) - (set-source-properties! #{e 8343}# #{s 8346}#)) - #{e 8343}#) - #{w 8467}# - #{mod 8347}#) - #{r 8468}# - #{w 8467}# - #{mod 8347}#)))))) - #{tmp 8349}#) + (map syntax->datum #{id 9555}#) + #{new-vars 9656}# + (map (lambda (#{x 9737}#) + (#{expand 4443}# + #{x 9737}# + #{r 9658}# + #{w 9657}# + #{mod 9530}#)) + #{val 9556}#) + (#{expand-body 4447}# + (cons #{e1 9557}# #{e2 9558}#) + (let ((#{x 9799}# + (begin + (if (if (pair? #{e 9526}#) #{s 9529}# #f) + (set-source-properties! + #{e 9526}# + #{s 9529}#)) + #{e 9526}#))) + (if (if (null? (car #{w 9657}#)) + (null? (cdr #{w 9657}#)) + #f) + #{x 9799}# + (if (if (vector? #{x 9799}#) + (if (= (vector-length #{x 9799}#) 4) + (eq? (vector-ref #{x 9799}# 0) + 'syntax-object) + #f) + #f) + (let ((#{expression 9831}# + (vector-ref #{x 9799}# 1)) + (#{wrap 9832}# + (let ((#{w2 9840}# + (vector-ref #{x 9799}# 2))) + (let ((#{m1 9841}# (car #{w 9657}#)) + (#{s1 9842}# (cdr #{w 9657}#))) + (if (null? #{m1 9841}#) + (if (null? #{s1 9842}#) + #{w2 9840}# + (cons (car #{w2 9840}#) + (let ((#{m2 9857}# + (cdr #{w2 9840}#))) + (if (null? #{m2 9857}#) + #{s1 9842}# + (append + #{s1 9842}# + #{m2 9857}#))))) + (cons (let ((#{m2 9865}# + (car #{w2 9840}#))) + (if (null? #{m2 9865}#) + #{m1 9841}# + (append + #{m1 9841}# + #{m2 9865}#))) + (let ((#{m2 9873}# + (cdr #{w2 9840}#))) + (if (null? #{m2 9873}#) + #{s1 9842}# + (append + #{s1 9842}# + #{m2 9873}#)))))))) + (#{module 9833}# + (vector-ref #{x 9799}# 3))) + (vector + 'syntax-object + #{expression 9831}# + #{wrap 9832}# + #{module 9833}#)) + (if (null? #{x 9799}#) + #{x 9799}# + (vector + 'syntax-object + #{x 9799}# + #{w 9657}# + #{mod 9530}#))))) + #{r 9658}# + #{w 9657}# + #{mod 9530}#)))))) + #{tmp 9532}#) (syntax-violation 'letrec* "bad letrec*" - (#{wrap 4326}# - (begin - (if (if (pair? #{e 8343}#) #{s 8346}# #f) - (set-source-properties! #{e 8343}# #{s 8346}#)) - #{e 8343}#) - #{w 8345}# - #{mod 8347}#)))))) - (#{global-extend 4299}# + (let ((#{x 10113}# + (begin + (if (if (pair? #{e 9526}#) #{s 9529}# #f) + (set-source-properties! #{e 9526}# #{s 9529}#)) + #{e 9526}#))) + (if (if (null? (car #{w 9528}#)) + (null? (cdr #{w 9528}#)) + #f) + #{x 10113}# + (if (if (vector? #{x 10113}#) + (if (= (vector-length #{x 10113}#) 4) + (eq? (vector-ref #{x 10113}# 0) 'syntax-object) + #f) + #f) + (let ((#{expression 10145}# (vector-ref #{x 10113}# 1)) + (#{wrap 10146}# + (let ((#{w2 10154}# (vector-ref #{x 10113}# 2))) + (let ((#{m1 10155}# (car #{w 9528}#)) + (#{s1 10156}# (cdr #{w 9528}#))) + (if (null? #{m1 10155}#) + (if (null? #{s1 10156}#) + #{w2 10154}# + (cons (car #{w2 10154}#) + (let ((#{m2 10171}# + (cdr #{w2 10154}#))) + (if (null? #{m2 10171}#) + #{s1 10156}# + (append + #{s1 10156}# + #{m2 10171}#))))) + (cons (let ((#{m2 10179}# + (car #{w2 10154}#))) + (if (null? #{m2 10179}#) + #{m1 10155}# + (append + #{m1 10155}# + #{m2 10179}#))) + (let ((#{m2 10187}# + (cdr #{w2 10154}#))) + (if (null? #{m2 10187}#) + #{s1 10156}# + (append + #{s1 10156}# + #{m2 10187}#)))))))) + (#{module 10147}# (vector-ref #{x 10113}# 3))) + (vector + 'syntax-object + #{expression 10145}# + #{wrap 10146}# + #{module 10147}#)) + (if (null? #{x 10113}#) + #{x 10113}# + (vector + 'syntax-object + #{x 10113}# + #{w 9528}# + #{mod 9530}#)))))))))) + (#{global-extend 4408}# 'core 'set! - (lambda (#{e 9026}# - #{r 9027}# - #{w 9028}# - #{s 9029}# - #{mod 9030}#) - (let ((#{tmp 9032}# - ($sc-dispatch #{e 9026}# '(_ any any)))) - (if (if #{tmp 9032}# + (lambda (#{e 10350}# + #{r 10351}# + #{w 10352}# + #{s 10353}# + #{mod 10354}#) + (let ((#{tmp 10356}# + ($sc-dispatch #{e 10350}# '(_ any any)))) + (if (if #{tmp 10356}# (@apply - (lambda (#{id 9036}# #{val 9037}#) - (if (symbol? #{id 9036}#) + (lambda (#{id 10360}# #{val 10361}#) + (if (symbol? #{id 10360}#) #t - (if (if (vector? #{id 9036}#) - (if (= (vector-length #{id 9036}#) 4) - (eq? (vector-ref #{id 9036}# 0) 'syntax-object) + (if (if (vector? #{id 10360}#) + (if (= (vector-length #{id 10360}#) 4) + (eq? (vector-ref #{id 10360}# 0) 'syntax-object) #f) #f) - (symbol? (vector-ref #{id 9036}# 1)) + (symbol? (vector-ref #{id 10360}# 1)) #f))) - #{tmp 9032}#) + #{tmp 10356}#) #f) (@apply - (lambda (#{id 9064}# #{val 9065}#) - (let ((#{n 9066}# - (#{id-var-name 4320}# #{id 9064}# #{w 9028}#)) - (#{id-mod 9067}# - (if (if (vector? #{id 9064}#) - (if (= (vector-length #{id 9064}#) 4) - (eq? (vector-ref #{id 9064}# 0) 'syntax-object) - #f) - #f) - (vector-ref #{id 9064}# 3) - #{mod 9030}#))) - (let ((#{b 9068}# - (let ((#{t 9755}# (assq #{n 9066}# #{r 9027}#))) - (if #{t 9755}# - (cdr #{t 9755}#) - (if (symbol? #{n 9066}#) - (let ((#{t 9760}# - (begin - (if (if (not #{id-mod 9067}#) - (current-module) - #f) - (warn "module system is booted, we should have a module" - #{n 9066}#)) - (let ((#{v 9797}# - (module-variable - (if #{id-mod 9067}# - (resolve-module - (cdr #{id-mod 9067}#)) - (current-module)) - #{n 9066}#))) - (if #{v 9797}# - (if (variable-bound? #{v 9797}#) - (let ((#{val 9806}# - (variable-ref - #{v 9797}#))) - (if (macro? #{val 9806}#) - (if (macro-type - #{val 9806}#) - (cons (macro-type - #{val 9806}#) - (macro-binding - #{val 9806}#)) - #f) - #f)) - #f) - #f))))) - (if #{t 9760}# #{t 9760}# '(global))) - '(displaced-lexical)))))) - (let ((#{atom-key 9069}# (car #{b 9068}#))) - (if (let ((#{t 9106}# #{atom-key 9069}#)) - (eqv? #{t 9106}# 'lexical)) - (#{build-lexical-assignment 4272}# - #{s 9029}# - (syntax->datum #{id 9064}#) - (cdr #{b 9068}#) - (#{expand 4333}# - #{val 9065}# - #{r 9027}# - #{w 9028}# - #{mod 9030}#)) - (if (let ((#{t 9391}# #{atom-key 9069}#)) - (eqv? #{t 9391}# 'global)) - (#{build-global-assignment 4275}# - #{s 9029}# - #{n 9066}# - (#{expand 4333}# - #{val 9065}# - #{r 9027}# - #{w 9028}# - #{mod 9030}#) - #{id-mod 9067}#) - (if (let ((#{t 9646}# #{atom-key 9069}#)) - (eqv? #{t 9646}# 'macro)) - (let ((#{p 9709}# (cdr #{b 9068}#))) - (if (procedure-property - #{p 9709}# - 'variable-transformer) - (#{expand 4333}# - (#{expand-macro 4336}# - #{p 9709}# - #{e 9026}# - #{r 9027}# - #{w 9028}# - #{s 9029}# - #f - #{mod 9030}#) - #{r 9027}# - '(()) - #{mod 9030}#) - (syntax-violation - 'set! - "not a variable transformer" - (#{wrap 4326}# - #{e 9026}# - #{w 9028}# - #{mod 9030}#) - (#{wrap 4326}# - #{id 9064}# - #{w 9028}# - #{id-mod 9067}#)))) - (if (eqv? #{atom-key 9069}# 'displaced-lexical) - (syntax-violation - 'set! - "identifier out of context" - (#{wrap 4326}# - #{id 9064}# - #{w 9028}# - #{mod 9030}#)) - (syntax-violation - 'set! - "bad set!" - (#{wrap 4326}# - (begin - (if (if (pair? #{e 9026}#) #{s 9029}# #f) - (set-source-properties! - #{e 9026}# - #{s 9029}#)) - #{e 9026}#) - #{w 9028}# - #{mod 9030}#)))))))))) - #{tmp 9032}#) - (let ((#{tmp 9907}# + (lambda (#{id 10388}# #{val 10389}#) + (call-with-values + (lambda () + (#{resolve-identifier 4430}# + #{id 10388}# + #{w 10352}# + #{r 10351}# + #{mod 10354}# + #t)) + (lambda (#{type 10392}# #{value 10393}# #{id-mod 10394}#) + (if (eqv? #{type 10392}# 'lexical) + (#{build-lexical-assignment 4381}# + #{s 10353}# + (syntax->datum #{id 10388}#) + #{value 10393}# + (#{expand 4443}# + #{val 10389}# + #{r 10351}# + #{w 10352}# + #{mod 10354}#)) + (if (eqv? #{type 10392}# 'global) + (#{build-global-assignment 4384}# + #{s 10353}# + #{value 10393}# + (#{expand 4443}# + #{val 10389}# + #{r 10351}# + #{w 10352}# + #{mod 10354}#) + #{id-mod 10394}#) + (if (eqv? #{type 10392}# 'macro) + (if (procedure-property + #{value 10393}# + 'variable-transformer) + (#{expand 4443}# + (#{expand-macro 4446}# + #{value 10393}# + #{e 10350}# + #{r 10351}# + #{w 10352}# + #{s 10353}# + #f + #{mod 10354}#) + #{r 10351}# + '(()) + #{mod 10354}#) + (syntax-violation + 'set! + "not a variable transformer" + (if (if (null? (car #{w 10352}#)) + (null? (cdr #{w 10352}#)) + #f) + #{e 10350}# + (if (if (vector? #{e 10350}#) + (if (= (vector-length #{e 10350}#) 4) + (eq? (vector-ref #{e 10350}# 0) + 'syntax-object) + #f) + #f) + (let ((#{expression 10854}# + (vector-ref #{e 10350}# 1)) + (#{wrap 10855}# + (let ((#{w2 10865}# + (vector-ref #{e 10350}# 2))) + (let ((#{m1 10866}# + (car #{w 10352}#)) + (#{s1 10867}# + (cdr #{w 10352}#))) + (if (null? #{m1 10866}#) + (if (null? #{s1 10867}#) + #{w2 10865}# + (cons (car #{w2 10865}#) + (let ((#{m2 10884}# + (cdr #{w2 10865}#))) + (if (null? #{m2 10884}#) + #{s1 10867}# + (append + #{s1 10867}# + #{m2 10884}#))))) + (cons (let ((#{m2 10892}# + (car #{w2 10865}#))) + (if (null? #{m2 10892}#) + #{m1 10866}# + (append + #{m1 10866}# + #{m2 10892}#))) + (let ((#{m2 10900}# + (cdr #{w2 10865}#))) + (if (null? #{m2 10900}#) + #{s1 10867}# + (append + #{s1 10867}# + #{m2 10900}#)))))))) + (#{module 10856}# + (vector-ref #{e 10350}# 3))) + (vector + 'syntax-object + #{expression 10854}# + #{wrap 10855}# + #{module 10856}#)) + (if (null? #{e 10350}#) + #{e 10350}# + (vector + 'syntax-object + #{e 10350}# + #{w 10352}# + #{mod 10354}#)))) + (if (if (null? (car #{w 10352}#)) + (null? (cdr #{w 10352}#)) + #f) + #{id 10388}# + (if (if (vector? #{id 10388}#) + (if (= (vector-length #{id 10388}#) 4) + (eq? (vector-ref #{id 10388}# 0) + 'syntax-object) + #f) + #f) + (let ((#{expression 10952}# + (vector-ref #{id 10388}# 1)) + (#{wrap 10953}# + (let ((#{w2 10963}# + (vector-ref #{id 10388}# 2))) + (let ((#{m1 10964}# + (car #{w 10352}#)) + (#{s1 10965}# + (cdr #{w 10352}#))) + (if (null? #{m1 10964}#) + (if (null? #{s1 10965}#) + #{w2 10963}# + (cons (car #{w2 10963}#) + (let ((#{m2 10982}# + (cdr #{w2 10963}#))) + (if (null? #{m2 10982}#) + #{s1 10965}# + (append + #{s1 10965}# + #{m2 10982}#))))) + (cons (let ((#{m2 10990}# + (car #{w2 10963}#))) + (if (null? #{m2 10990}#) + #{m1 10964}# + (append + #{m1 10964}# + #{m2 10990}#))) + (let ((#{m2 10998}# + (cdr #{w2 10963}#))) + (if (null? #{m2 10998}#) + #{s1 10965}# + (append + #{s1 10965}# + #{m2 10998}#)))))))) + (#{module 10954}# + (vector-ref #{id 10388}# 3))) + (vector + 'syntax-object + #{expression 10952}# + #{wrap 10953}# + #{module 10954}#)) + (if (null? #{id 10388}#) + #{id 10388}# + (vector + 'syntax-object + #{id 10388}# + #{w 10352}# + #{id-mod 10394}#)))))) + (if (eqv? #{type 10392}# 'displaced-lexical) + (syntax-violation + 'set! + "identifier out of context" + (if (if (null? (car #{w 10352}#)) + (null? (cdr #{w 10352}#)) + #f) + #{id 10388}# + (if (if (vector? #{id 10388}#) + (if (= (vector-length #{id 10388}#) 4) + (eq? (vector-ref #{id 10388}# 0) + 'syntax-object) + #f) + #f) + (let ((#{expression 11053}# + (vector-ref #{id 10388}# 1)) + (#{wrap 11054}# + (let ((#{w2 11064}# + (vector-ref #{id 10388}# 2))) + (let ((#{m1 11065}# + (car #{w 10352}#)) + (#{s1 11066}# + (cdr #{w 10352}#))) + (if (null? #{m1 11065}#) + (if (null? #{s1 11066}#) + #{w2 11064}# + (cons (car #{w2 11064}#) + (let ((#{m2 11083}# + (cdr #{w2 11064}#))) + (if (null? #{m2 11083}#) + #{s1 11066}# + (append + #{s1 11066}# + #{m2 11083}#))))) + (cons (let ((#{m2 11091}# + (car #{w2 11064}#))) + (if (null? #{m2 11091}#) + #{m1 11065}# + (append + #{m1 11065}# + #{m2 11091}#))) + (let ((#{m2 11099}# + (cdr #{w2 11064}#))) + (if (null? #{m2 11099}#) + #{s1 11066}# + (append + #{s1 11066}# + #{m2 11099}#)))))))) + (#{module 11055}# + (vector-ref #{id 10388}# 3))) + (vector + 'syntax-object + #{expression 11053}# + #{wrap 11054}# + #{module 11055}#)) + (if (null? #{id 10388}#) + #{id 10388}# + (vector + 'syntax-object + #{id 10388}# + #{w 10352}# + #{mod 10354}#))))) + (syntax-violation + 'set! + "bad set!" + (let ((#{x 11131}# + (begin + (if (if (pair? #{e 10350}#) + #{s 10353}# + #f) + (set-source-properties! + #{e 10350}# + #{s 10353}#)) + #{e 10350}#))) + (if (if (null? (car #{w 10352}#)) + (null? (cdr #{w 10352}#)) + #f) + #{x 11131}# + (if (if (vector? #{x 11131}#) + (if (= (vector-length #{x 11131}#) 4) + (eq? (vector-ref #{x 11131}# 0) + 'syntax-object) + #f) + #f) + (let ((#{expression 11163}# + (vector-ref #{x 11131}# 1)) + (#{wrap 11164}# + (let ((#{w2 11172}# + (vector-ref + #{x 11131}# + 2))) + (let ((#{m1 11173}# + (car #{w 10352}#)) + (#{s1 11174}# + (cdr #{w 10352}#))) + (if (null? #{m1 11173}#) + (if (null? #{s1 11174}#) + #{w2 11172}# + (cons (car #{w2 11172}#) + (let ((#{m2 11189}# + (cdr #{w2 11172}#))) + (if (null? #{m2 11189}#) + #{s1 11174}# + (append + #{s1 11174}# + #{m2 11189}#))))) + (cons (let ((#{m2 11197}# + (car #{w2 11172}#))) + (if (null? #{m2 11197}#) + #{m1 11173}# + (append + #{m1 11173}# + #{m2 11197}#))) + (let ((#{m2 11205}# + (cdr #{w2 11172}#))) + (if (null? #{m2 11205}#) + #{s1 11174}# + (append + #{s1 11174}# + #{m2 11205}#)))))))) + (#{module 11165}# + (vector-ref #{x 11131}# 3))) + (vector + 'syntax-object + #{expression 11163}# + #{wrap 11164}# + #{module 11165}#)) + (if (null? #{x 11131}#) + #{x 11131}# + (vector + 'syntax-object + #{x 11131}# + #{w 10352}# + #{mod 10354}#))))))))))))) + #{tmp 10356}#) + (let ((#{tmp 11220}# ($sc-dispatch - #{e 9026}# + #{e 10350}# '(_ (any . each-any) any)))) - (if #{tmp 9907}# + (if #{tmp 11220}# (@apply - (lambda (#{head 9911}# #{tail 9912}# #{val 9913}#) + (lambda (#{head 11224}# #{tail 11225}# #{val 11226}#) (call-with-values (lambda () - (#{syntax-type 4332}# - #{head 9911}# - #{r 9027}# + (#{syntax-type 4442}# + #{head 11224}# + #{r 10351}# '(()) #f #f - #{mod 9030}# + #{mod 10354}# #t)) - (lambda (#{type 9916}# - #{value 9917}# - #{ee 9918}# - #{ww 9919}# - #{ss 9920}# - #{modmod 9921}#) - (if (eqv? #{type 9916}# 'module-ref) - (let ((#{val 9925}# - (#{expand 4333}# - #{val 9913}# - #{r 9027}# - #{w 9028}# - #{mod 9030}#))) + (lambda (#{type 11229}# + #{value 11230}# + #{ee 11231}# + #{ww 11232}# + #{ss 11233}# + #{modmod 11234}#) + (if (eqv? #{type 11229}# 'module-ref) + (let ((#{val 11238}# + (#{expand 4443}# + #{val 11226}# + #{r 10351}# + #{w 10352}# + #{mod 10354}#))) (call-with-values (lambda () - (#{value 9917}# - (cons #{head 9911}# #{tail 9912}#) - #{r 9027}# - #{w 9028}#)) - (lambda (#{e 9926}# - #{r 9927}# - #{w 9928}# - #{s* 9929}# - #{mod 9930}#) - (let ((#{tmp 9932}# (list #{e 9926}#))) + (#{value 11230}# + (cons #{head 11224}# #{tail 11225}#) + #{r 10351}# + #{w 10352}#)) + (lambda (#{e 11239}# + #{r 11240}# + #{w 11241}# + #{s* 11242}# + #{mod 11243}#) + (let ((#{tmp 11245}# (list #{e 11239}#))) (if (@apply - (lambda (#{e 9934}#) - (if (symbol? #{e 9934}#) + (lambda (#{e 11247}#) + (if (symbol? #{e 11247}#) #t - (if (if (vector? #{e 9934}#) + (if (if (vector? #{e 11247}#) (if (= (vector-length - #{e 9934}#) + #{e 11247}#) 4) (eq? (vector-ref - #{e 9934}# + #{e 11247}# 0) 'syntax-object) #f) #f) (symbol? - (vector-ref #{e 9934}# 1)) + (vector-ref #{e 11247}# 1)) #f))) - #{tmp 9932}#) + #{tmp 11245}#) (@apply - (lambda (#{e 9964}#) - (#{build-global-assignment 4275}# - #{s 9029}# - (syntax->datum #{e 9964}#) - #{val 9925}# - #{mod 9930}#)) - #{tmp 9932}#) + (lambda (#{e 11277}#) + (#{build-global-assignment 4384}# + #{s 10353}# + (syntax->datum #{e 11277}#) + #{val 11238}# + #{mod 11243}#)) + #{tmp 11245}#) (syntax-violation #f "source expression failed to match any pattern" - #{e 9926}#)))))) - (#{build-application 4268}# - #{s 9029}# - (#{expand 4333}# + #{e 11239}#)))))) + (#{build-call 4377}# + #{s 10353}# + (#{expand 4443}# (list '#(syntax-object setter ((top) @@ -9305,25 +11104,25 @@ (top) (top) (top)) - #("i3543" - "i3544" - "i3545" - "i3546" - "i3547" - "i3548")) + #("i3655" + "i3656" + "i3657" + "i3658" + "i3659" + "i3660")) #(ribcage #(head tail val) #((top) (top) (top)) - #("i3529" "i3530" "i3531")) + #("i3641" "i3642" "i3643")) #(ribcage () () ()) #(ribcage #(e r w s mod) #((top) (top) (top) (top) (top)) - #("i3493" - "i3494" - "i3495" - "i3496" - "i3497")) + #("i3613" + "i3614" + "i3615" + "i3616" + "i3617")) #(ribcage (lambda-var-list gen-var @@ -9338,7 +11137,7 @@ expand-local-syntax expand-body expand-macro - expand-application + expand-call expand-expr expand syntax-type @@ -9353,6 +11152,7 @@ valid-bound-ids? bound-id=? free-id=? + resolve-identifier id-var-name same-marks? join-marks @@ -9390,7 +11190,6 @@ id? nonsymbol-id? global-extend - lookup macros-only-env extend-var-env extend-env @@ -9416,6 +11215,7 @@ build-sequence build-data build-primref + build-primcall build-lambda-case build-case-lambda build-simple-lambda @@ -9427,7 +11227,7 @@ build-lexical-reference build-dynlet build-conditional - build-application + build-call build-void maybe-name-value! decorate-source @@ -9448,8 +11248,9 @@ make-let make-lambda-case make-lambda - make-sequence - make-application + make-seq + make-primcall + make-call make-conditional make-toplevel-define make-toplevel-set @@ -9596,8 +11397,12 @@ (top) (top) (top) + (top) + (top) (top)) - ("i467" + ("i471" + "i469" + "i467" "i465" "i463" "i461" @@ -9631,13 +11436,13 @@ "i405" "i403" "i401" - "i399" + "i400" "i398" - "i396" + "i395" + "i394" "i393" - "i392" "i391" - "i389" + "i390" "i388" "i386" "i384" @@ -9646,32 +11451,32 @@ "i378" "i376" "i374" - "i372" + "i371" "i369" - "i367" + "i368" "i366" "i364" "i362" "i360" + "i359" "i358" "i357" - "i356" "i355" - "i353" - "i352" + "i354" + "i351" "i349" "i347" "i345" "i343" "i341" + "i340" "i339" "i337" - "i336" "i335" - "i333" + "i334" "i331" "i330" - "i327" + "i328" "i326" "i324" "i322" @@ -9680,8 +11485,8 @@ "i316" "i314" "i312" - "i310" - "i308" + "i309" + "i307" "i305" "i303" "i301" @@ -9704,17 +11509,17 @@ "i267" "i265" "i263" - "i261" - "i260" + "i262" + "i259" "i257" + "i256" "i255" "i254" "i253" - "i252" "i251" "i249" "i247" - "i245" + "i244" "i242" "i240" "i238" @@ -9738,64 +11543,116 @@ define-expansion-accessors define-expansion-constructors) ((top) (top) (top)) - ("i46" "i45" "i44"))) + ("i46" "i45" "i44")) + #(ribcage () () ())) (hygiene guile)) - #{head 9911}#) - #{r 9027}# - #{w 9028}# - #{mod 9030}#) - (map (lambda (#{e 10265}#) - (#{expand 4333}# - #{e 10265}# - #{r 9027}# - #{w 9028}# - #{mod 9030}#)) + #{head 11224}#) + #{r 10351}# + #{w 10352}# + #{mod 10354}#) + (map (lambda (#{e 11606}#) + (#{expand 4443}# + #{e 11606}# + #{r 10351}# + #{w 10352}# + #{mod 10354}#)) (append - #{tail 9912}# - (list #{val 9913}#)))))))) - #{tmp 9907}#) + #{tail 11225}# + (list #{val 11226}#)))))))) + #{tmp 11220}#) (syntax-violation 'set! "bad set!" - (#{wrap 4326}# - (begin - (if (if (pair? #{e 9026}#) #{s 9029}# #f) - (set-source-properties! #{e 9026}# #{s 9029}#)) - #{e 9026}#) - #{w 9028}# - #{mod 9030}#)))))))) + (let ((#{x 11698}# + (begin + (if (if (pair? #{e 10350}#) #{s 10353}# #f) + (set-source-properties! #{e 10350}# #{s 10353}#)) + #{e 10350}#))) + (if (if (null? (car #{w 10352}#)) + (null? (cdr #{w 10352}#)) + #f) + #{x 11698}# + (if (if (vector? #{x 11698}#) + (if (= (vector-length #{x 11698}#) 4) + (eq? (vector-ref #{x 11698}# 0) 'syntax-object) + #f) + #f) + (let ((#{expression 11730}# (vector-ref #{x 11698}# 1)) + (#{wrap 11731}# + (let ((#{w2 11739}# + (vector-ref #{x 11698}# 2))) + (let ((#{m1 11740}# (car #{w 10352}#)) + (#{s1 11741}# (cdr #{w 10352}#))) + (if (null? #{m1 11740}#) + (if (null? #{s1 11741}#) + #{w2 11739}# + (cons (car #{w2 11739}#) + (let ((#{m2 11756}# + (cdr #{w2 11739}#))) + (if (null? #{m2 11756}#) + #{s1 11741}# + (append + #{s1 11741}# + #{m2 11756}#))))) + (cons (let ((#{m2 11764}# + (car #{w2 11739}#))) + (if (null? #{m2 11764}#) + #{m1 11740}# + (append + #{m1 11740}# + #{m2 11764}#))) + (let ((#{m2 11772}# + (cdr #{w2 11739}#))) + (if (null? #{m2 11772}#) + #{s1 11741}# + (append + #{s1 11741}# + #{m2 11772}#)))))))) + (#{module 11732}# (vector-ref #{x 11698}# 3))) + (vector + 'syntax-object + #{expression 11730}# + #{wrap 11731}# + #{module 11732}#)) + (if (null? #{x 11698}#) + #{x 11698}# + (vector + 'syntax-object + #{x 11698}# + #{w 10352}# + #{mod 10354}#)))))))))))) (module-define! (current-module) '@ (make-syntax-transformer '@ 'module-ref - (lambda (#{e 10379}# #{r 10380}# #{w 10381}#) - (let ((#{tmp 10383}# - ($sc-dispatch #{e 10379}# '(_ each-any any)))) - (if (if #{tmp 10383}# + (lambda (#{e 11803}# #{r 11804}# #{w 11805}#) + (let ((#{tmp 11807}# + ($sc-dispatch #{e 11803}# '(_ each-any any)))) + (if (if #{tmp 11807}# (@apply - (lambda (#{mod 10386}# #{id 10387}#) - (if (and-map #{id? 4301}# #{mod 10386}#) - (if (symbol? #{id 10387}#) + (lambda (#{mod 11810}# #{id 11811}#) + (if (and-map #{id? 4410}# #{mod 11810}#) + (if (symbol? #{id 11811}#) #t - (if (if (vector? #{id 10387}#) - (if (= (vector-length #{id 10387}#) 4) - (eq? (vector-ref #{id 10387}# 0) + (if (if (vector? #{id 11811}#) + (if (= (vector-length #{id 11811}#) 4) + (eq? (vector-ref #{id 11811}# 0) 'syntax-object) #f) #f) - (symbol? (vector-ref #{id 10387}# 1)) + (symbol? (vector-ref #{id 11811}# 1)) #f)) #f)) - #{tmp 10383}#) + #{tmp 11807}#) #f) (@apply - (lambda (#{mod 10427}# #{id 10428}#) + (lambda (#{mod 11851}# #{id 11852}#) (values - (syntax->datum #{id 10428}#) - #{r 10380}# - #{w 10381}# + (syntax->datum #{id 11852}#) + #{r 11804}# + #{w 11805}# #f (syntax->datum (cons '#(syntax-object @@ -9804,12 +11661,12 @@ #(ribcage #(mod id) #((top) (top)) - #("i3590" "i3591")) + #("i3702" "i3703")) #(ribcage () () ()) #(ribcage #(e r w) #((top) (top) (top)) - #("i3578" "i3579" "i3580")) + #("i3690" "i3691" "i3692")) #(ribcage (lambda-var-list gen-var @@ -9824,7 +11681,7 @@ expand-local-syntax expand-body expand-macro - expand-application + expand-call expand-expr expand syntax-type @@ -9839,6 +11696,7 @@ valid-bound-ids? bound-id=? free-id=? + resolve-identifier id-var-name same-marks? join-marks @@ -9876,7 +11734,6 @@ id? nonsymbol-id? global-extend - lookup macros-only-env extend-var-env extend-env @@ -9902,6 +11759,7 @@ build-sequence build-data build-primref + build-primcall build-lambda-case build-case-lambda build-simple-lambda @@ -9913,7 +11771,7 @@ build-lexical-reference build-dynlet build-conditional - build-application + build-call build-void maybe-name-value! decorate-source @@ -9934,8 +11792,9 @@ make-let make-lambda-case make-lambda - make-sequence - make-application + make-seq + make-primcall + make-call make-conditional make-toplevel-define make-toplevel-set @@ -10082,8 +11941,12 @@ (top) (top) (top) + (top) + (top) (top)) - ("i467" + ("i471" + "i469" + "i467" "i465" "i463" "i461" @@ -10117,13 +11980,13 @@ "i405" "i403" "i401" - "i399" + "i400" "i398" - "i396" + "i395" + "i394" "i393" - "i392" "i391" - "i389" + "i390" "i388" "i386" "i384" @@ -10132,32 +11995,32 @@ "i378" "i376" "i374" - "i372" + "i371" "i369" - "i367" + "i368" "i366" "i364" "i362" "i360" + "i359" "i358" "i357" - "i356" "i355" - "i353" - "i352" + "i354" + "i351" "i349" "i347" "i345" "i343" "i341" + "i340" "i339" "i337" - "i336" "i335" - "i333" + "i334" "i331" "i330" - "i327" + "i328" "i326" "i324" "i322" @@ -10166,8 +12029,8 @@ "i316" "i314" "i312" - "i310" - "i308" + "i309" + "i307" "i305" "i303" "i301" @@ -10190,17 +12053,17 @@ "i267" "i265" "i263" - "i261" - "i260" + "i262" + "i259" "i257" + "i256" "i255" "i254" "i253" - "i252" "i251" "i249" "i247" - "i245" + "i244" "i242" "i240" "i238" @@ -10224,72 +12087,73 @@ define-expansion-accessors define-expansion-constructors) ((top) (top) (top)) - ("i46" "i45" "i44"))) + ("i46" "i45" "i44")) + #(ribcage () () ())) (hygiene guile)) - #{mod 10427}#)))) - #{tmp 10383}#) + #{mod 11851}#)))) + #{tmp 11807}#) (syntax-violation #f "source expression failed to match any pattern" - #{e 10379}#)))))) - (#{global-extend 4299}# + #{e 11803}#)))))) + (#{global-extend 4408}# 'module-ref '@@ - (lambda (#{e 10525}# #{r 10526}# #{w 10527}#) + (lambda (#{e 11956}# #{r 11957}# #{w 11958}#) (letrec* - ((#{remodulate 10528}# - (lambda (#{x 10734}# #{mod 10735}#) - (if (pair? #{x 10734}#) - (cons (#{remodulate 10528}# - (car #{x 10734}#) - #{mod 10735}#) - (#{remodulate 10528}# - (cdr #{x 10734}#) - #{mod 10735}#)) - (if (if (vector? #{x 10734}#) - (if (= (vector-length #{x 10734}#) 4) - (eq? (vector-ref #{x 10734}# 0) 'syntax-object) + ((#{remodulate 11959}# + (lambda (#{x 12195}# #{mod 12196}#) + (if (pair? #{x 12195}#) + (cons (#{remodulate 11959}# + (car #{x 12195}#) + #{mod 12196}#) + (#{remodulate 11959}# + (cdr #{x 12195}#) + #{mod 12196}#)) + (if (if (vector? #{x 12195}#) + (if (= (vector-length #{x 12195}#) 4) + (eq? (vector-ref #{x 12195}# 0) 'syntax-object) #f) #f) - (let ((#{expression 10749}# - (#{remodulate 10528}# - (vector-ref #{x 10734}# 1) - #{mod 10735}#)) - (#{wrap 10750}# (vector-ref #{x 10734}# 2))) + (let ((#{expression 12210}# + (#{remodulate 11959}# + (vector-ref #{x 12195}# 1) + #{mod 12196}#)) + (#{wrap 12211}# (vector-ref #{x 12195}# 2))) (vector 'syntax-object - #{expression 10749}# - #{wrap 10750}# - #{mod 10735}#)) - (if (vector? #{x 10734}#) - (let ((#{n 10758}# (vector-length #{x 10734}#))) - (let ((#{v 10759}# (make-vector #{n 10758}#))) + #{expression 12210}# + #{wrap 12211}# + #{mod 12196}#)) + (if (vector? #{x 12195}#) + (let ((#{n 12219}# (vector-length #{x 12195}#))) + (let ((#{v 12220}# (make-vector #{n 12219}#))) (letrec* - ((#{loop 10760}# - (lambda (#{i 10807}#) - (if (= #{i 10807}# #{n 10758}#) - #{v 10759}# + ((#{loop 12221}# + (lambda (#{i 12276}#) + (if (= #{i 12276}# #{n 12219}#) + #{v 12220}# (begin (vector-set! - #{v 10759}# - #{i 10807}# - (#{remodulate 10528}# - (vector-ref #{x 10734}# #{i 10807}#) - #{mod 10735}#)) - (#{loop 10760}# (#{1+}# #{i 10807}#))))))) - (#{loop 10760}# 0)))) - #{x 10734}#)))))) - (let ((#{tmp 10530}# - ($sc-dispatch #{e 10525}# '(_ each-any any)))) - (if (if #{tmp 10530}# + #{v 12220}# + #{i 12276}# + (#{remodulate 11959}# + (vector-ref #{x 12195}# #{i 12276}#) + #{mod 12196}#)) + (#{loop 12221}# (#{1+}# #{i 12276}#))))))) + (#{loop 12221}# 0)))) + #{x 12195}#)))))) + (let ((#{tmp 11961}# + ($sc-dispatch #{e 11956}# '(_ each-any any)))) + (if (if #{tmp 11961}# (@apply - (lambda (#{mod 10534}# #{exp 10535}#) - (and-map #{id? 4301}# #{mod 10534}#)) - #{tmp 10530}#) + (lambda (#{mod 11965}# #{exp 11966}#) + (and-map #{id? 4410}# #{mod 11965}#)) + #{tmp 11961}#) #f) (@apply - (lambda (#{mod 10551}# #{exp 10552}#) - (let ((#{mod 10553}# + (lambda (#{mod 11982}# #{exp 11983}#) + (let ((#{mod 11984}# (syntax->datum (cons '#(syntax-object private @@ -10297,12 +12161,12 @@ #(ribcage #(mod exp) #((top) (top)) - #("i3634" "i3635")) - #(ribcage (remodulate) ((top)) ("i3601")) + #("i3746" "i3747")) + #(ribcage (remodulate) ((top)) ("i3713")) #(ribcage #(e r w) #((top) (top) (top)) - #("i3598" "i3599" "i3600")) + #("i3710" "i3711" "i3712")) #(ribcage (lambda-var-list gen-var @@ -10317,7 +12181,7 @@ expand-local-syntax expand-body expand-macro - expand-application + expand-call expand-expr expand syntax-type @@ -10332,6 +12196,7 @@ valid-bound-ids? bound-id=? free-id=? + resolve-identifier id-var-name same-marks? join-marks @@ -10369,7 +12234,6 @@ id? nonsymbol-id? global-extend - lookup macros-only-env extend-var-env extend-env @@ -10395,6 +12259,7 @@ build-sequence build-data build-primref + build-primcall build-lambda-case build-case-lambda build-simple-lambda @@ -10406,7 +12271,7 @@ build-lexical-reference build-dynlet build-conditional - build-application + build-call build-void maybe-name-value! decorate-source @@ -10427,8 +12292,9 @@ make-let make-lambda-case make-lambda - make-sequence - make-application + make-seq + make-primcall + make-call make-conditional make-toplevel-define make-toplevel-set @@ -10575,8 +12441,12 @@ (top) (top) (top) + (top) + (top) (top)) - ("i467" + ("i471" + "i469" + "i467" "i465" "i463" "i461" @@ -10610,13 +12480,13 @@ "i405" "i403" "i401" - "i399" + "i400" "i398" - "i396" + "i395" + "i394" "i393" - "i392" "i391" - "i389" + "i390" "i388" "i386" "i384" @@ -10625,32 +12495,32 @@ "i378" "i376" "i374" - "i372" + "i371" "i369" - "i367" + "i368" "i366" "i364" "i362" "i360" + "i359" "i358" "i357" - "i356" "i355" - "i353" - "i352" + "i354" + "i351" "i349" "i347" "i345" "i343" "i341" + "i340" "i339" "i337" - "i336" "i335" - "i333" + "i334" "i331" "i330" - "i327" + "i328" "i326" "i324" "i322" @@ -10659,8 +12529,8 @@ "i316" "i314" "i312" - "i310" - "i308" + "i309" + "i307" "i305" "i303" "i301" @@ -10683,17 +12553,17 @@ "i267" "i265" "i263" - "i261" - "i260" + "i262" + "i259" "i257" + "i256" "i255" "i254" "i253" - "i252" "i251" "i249" "i247" - "i245" + "i244" "i242" "i240" "i238" @@ -10717,129 +12587,184 @@ define-expansion-accessors define-expansion-constructors) ((top) (top) (top)) - ("i46" "i45" "i44"))) + ("i46" "i45" "i44")) + #(ribcage () () ())) (hygiene guile)) - #{mod 10551}#)))) + #{mod 11982}#)))) (values - (#{remodulate 10528}# - #{exp 10552}# - #{mod 10553}#) - #{r 10526}# - #{w 10527}# - (#{source-annotation 4294}# #{exp 10552}#) - #{mod 10553}#))) - #{tmp 10530}#) + (#{remodulate 11959}# + #{exp 11983}# + #{mod 11984}#) + #{r 11957}# + #{w 11958}# + (#{source-annotation 4404}# #{exp 11983}#) + #{mod 11984}#))) + #{tmp 11961}#) (syntax-violation #f "source expression failed to match any pattern" - #{e 10525}#)))))) - (#{global-extend 4299}# + #{e 11956}#)))))) + (#{global-extend 4408}# 'core 'if - (lambda (#{e 10913}# - #{r 10914}# - #{w 10915}# - #{s 10916}# - #{mod 10917}#) - (let ((#{tmp 10919}# - ($sc-dispatch #{e 10913}# '(_ any any)))) - (if #{tmp 10919}# + (lambda (#{e 12389}# + #{r 12390}# + #{w 12391}# + #{s 12392}# + #{mod 12393}#) + (let ((#{tmp 12395}# + ($sc-dispatch #{e 12389}# '(_ any any)))) + (if #{tmp 12395}# (@apply - (lambda (#{test 10923}# #{then 10924}#) - (#{build-conditional 4269}# - #{s 10916}# - (#{expand 4333}# - #{test 10923}# - #{r 10914}# - #{w 10915}# - #{mod 10917}#) - (#{expand 4333}# - #{then 10924}# - #{r 10914}# - #{w 10915}# - #{mod 10917}#) + (lambda (#{test 12399}# #{then 12400}#) + (#{build-conditional 4378}# + #{s 12392}# + (#{expand 4443}# + #{test 12399}# + #{r 12390}# + #{w 12391}# + #{mod 12393}#) + (#{expand 4443}# + #{then 12400}# + #{r 12390}# + #{w 12391}# + #{mod 12393}#) (make-struct/no-tail (vector-ref %expanded-vtables 0) #f))) - #{tmp 10919}#) - (let ((#{tmp 11164}# - ($sc-dispatch #{e 10913}# '(_ any any any)))) - (if #{tmp 11164}# + #{tmp 12395}#) + (let ((#{tmp 12661}# + ($sc-dispatch #{e 12389}# '(_ any any any)))) + (if #{tmp 12661}# (@apply - (lambda (#{test 11168}# #{then 11169}# #{else 11170}#) - (#{build-conditional 4269}# - #{s 10916}# - (#{expand 4333}# - #{test 11168}# - #{r 10914}# - #{w 10915}# - #{mod 10917}#) - (#{expand 4333}# - #{then 11169}# - #{r 10914}# - #{w 10915}# - #{mod 10917}#) - (#{expand 4333}# - #{else 11170}# - #{r 10914}# - #{w 10915}# - #{mod 10917}#))) - #{tmp 11164}#) + (lambda (#{test 12665}# #{then 12666}# #{else 12667}#) + (#{build-conditional 4378}# + #{s 12392}# + (#{expand 4443}# + #{test 12665}# + #{r 12390}# + #{w 12391}# + #{mod 12393}#) + (#{expand 4443}# + #{then 12666}# + #{r 12390}# + #{w 12391}# + #{mod 12393}#) + (#{expand 4443}# + #{else 12667}# + #{r 12390}# + #{w 12391}# + #{mod 12393}#))) + #{tmp 12661}#) (syntax-violation #f "source expression failed to match any pattern" - #{e 10913}#))))))) - (#{global-extend 4299}# + #{e 12389}#))))))) + (#{global-extend 4408}# 'core 'with-fluids - (lambda (#{e 11594}# - #{r 11595}# - #{w 11596}# - #{s 11597}# - #{mod 11598}#) - (let ((#{tmp 11600}# + (lambda (#{e 13126}# + #{r 13127}# + #{w 13128}# + #{s 13129}# + #{mod 13130}#) + (let ((#{tmp 13132}# ($sc-dispatch - #{e 11594}# + #{e 13126}# '(_ #(each (any any)) any . each-any)))) - (if #{tmp 11600}# + (if #{tmp 13132}# (@apply - (lambda (#{fluid 11604}# - #{val 11605}# - #{b 11606}# - #{b* 11607}#) - (#{build-dynlet 4270}# - #{s 11597}# - (map (lambda (#{x 11693}#) - (#{expand 4333}# - #{x 11693}# - #{r 11595}# - #{w 11596}# - #{mod 11598}#)) - #{fluid 11604}#) - (map (lambda (#{x 11768}#) - (#{expand 4333}# - #{x 11768}# - #{r 11595}# - #{w 11596}# - #{mod 11598}#)) - #{val 11605}#) - (#{expand-body 4337}# - (cons #{b 11606}# #{b* 11607}#) - (#{wrap 4326}# - (begin - (if (if (pair? #{e 11594}#) #{s 11597}# #f) - (set-source-properties! #{e 11594}# #{s 11597}#)) - #{e 11594}#) - #{w 11596}# - #{mod 11598}#) - #{r 11595}# - #{w 11596}# - #{mod 11598}#))) - #{tmp 11600}#) + (lambda (#{fluid 13136}# + #{val 13137}# + #{b 13138}# + #{b* 13139}#) + (#{build-dynlet 4379}# + #{s 13129}# + (map (lambda (#{x 13232}#) + (#{expand 4443}# + #{x 13232}# + #{r 13127}# + #{w 13128}# + #{mod 13130}#)) + #{fluid 13136}#) + (map (lambda (#{x 13314}#) + (#{expand 4443}# + #{x 13314}# + #{r 13127}# + #{w 13128}# + #{mod 13130}#)) + #{val 13137}#) + (#{expand-body 4447}# + (cons #{b 13138}# #{b* 13139}#) + (let ((#{x 13407}# + (begin + (if (if (pair? #{e 13126}#) #{s 13129}# #f) + (set-source-properties! + #{e 13126}# + #{s 13129}#)) + #{e 13126}#))) + (if (if (null? (car #{w 13128}#)) + (null? (cdr #{w 13128}#)) + #f) + #{x 13407}# + (if (if (vector? #{x 13407}#) + (if (= (vector-length #{x 13407}#) 4) + (eq? (vector-ref #{x 13407}# 0) 'syntax-object) + #f) + #f) + (let ((#{expression 13439}# + (vector-ref #{x 13407}# 1)) + (#{wrap 13440}# + (let ((#{w2 13448}# + (vector-ref #{x 13407}# 2))) + (let ((#{m1 13449}# (car #{w 13128}#)) + (#{s1 13450}# (cdr #{w 13128}#))) + (if (null? #{m1 13449}#) + (if (null? #{s1 13450}#) + #{w2 13448}# + (cons (car #{w2 13448}#) + (let ((#{m2 13465}# + (cdr #{w2 13448}#))) + (if (null? #{m2 13465}#) + #{s1 13450}# + (append + #{s1 13450}# + #{m2 13465}#))))) + (cons (let ((#{m2 13473}# + (car #{w2 13448}#))) + (if (null? #{m2 13473}#) + #{m1 13449}# + (append + #{m1 13449}# + #{m2 13473}#))) + (let ((#{m2 13481}# + (cdr #{w2 13448}#))) + (if (null? #{m2 13481}#) + #{s1 13450}# + (append + #{s1 13450}# + #{m2 13481}#)))))))) + (#{module 13441}# (vector-ref #{x 13407}# 3))) + (vector + 'syntax-object + #{expression 13439}# + #{wrap 13440}# + #{module 13441}#)) + (if (null? #{x 13407}#) + #{x 13407}# + (vector + 'syntax-object + #{x 13407}# + #{w 13128}# + #{mod 13130}#))))) + #{r 13127}# + #{w 13128}# + #{mod 13130}#))) + #{tmp 13132}#) (syntax-violation #f "source expression failed to match any pattern" - #{e 11594}#))))) + #{e 13126}#))))) (module-define! (current-module) 'begin @@ -10857,5739 +12782,2177 @@ '())) (module-define! (current-module) + 'define-syntax-parameter + (make-syntax-transformer + 'define-syntax-parameter + 'define-syntax-parameter + '())) + (module-define! + (current-module) 'eval-when (make-syntax-transformer 'eval-when 'eval-when '())) - (#{global-extend 4299}# + (#{global-extend 4408}# 'core 'syntax-case (letrec* - ((#{convert-pattern 12142}# - (lambda (#{pattern 13765}# #{keys 13766}#) + ((#{convert-pattern 13785}# + (lambda (#{pattern 15441}# #{keys 15442}#) (letrec* - ((#{cvt* 13767}# - (lambda (#{p* 14393}# #{n 14394}# #{ids 14395}#) - (if (not (pair? #{p* 14393}#)) - (#{cvt 13769}# - #{p* 14393}# - #{n 14394}# - #{ids 14395}#) + ((#{cvt* 15443}# + (lambda (#{p* 16242}# #{n 16243}# #{ids 16244}#) + (if (not (pair? #{p* 16242}#)) + (#{cvt 15445}# + #{p* 16242}# + #{n 16243}# + #{ids 16244}#) (call-with-values (lambda () - (#{cvt* 13767}# - (cdr #{p* 14393}#) - #{n 14394}# - #{ids 14395}#)) - (lambda (#{y 14398}# #{ids 14399}#) + (#{cvt* 15443}# + (cdr #{p* 16242}#) + #{n 16243}# + #{ids 16244}#)) + (lambda (#{y 16247}# #{ids 16248}#) (call-with-values (lambda () - (#{cvt 13769}# - (car #{p* 14393}#) - #{n 14394}# - #{ids 14399}#)) - (lambda (#{x 14402}# #{ids 14403}#) + (#{cvt 15445}# + (car #{p* 16242}#) + #{n 16243}# + #{ids 16248}#)) + (lambda (#{x 16251}# #{ids 16252}#) (values - (cons #{x 14402}# #{y 14398}#) - #{ids 14403}#)))))))) - (#{v-reverse 13768}# - (lambda (#{x 14404}#) + (cons #{x 16251}# #{y 16247}#) + #{ids 16252}#)))))))) + (#{v-reverse 15444}# + (lambda (#{x 16253}#) (letrec* - ((#{loop 14405}# - (lambda (#{r 14482}# #{x 14483}#) - (if (not (pair? #{x 14483}#)) - (values #{r 14482}# #{x 14483}#) - (#{loop 14405}# - (cons (car #{x 14483}#) #{r 14482}#) - (cdr #{x 14483}#)))))) - (#{loop 14405}# '() #{x 14404}#)))) - (#{cvt 13769}# - (lambda (#{p 13772}# #{n 13773}# #{ids 13774}#) - (if (if (symbol? #{p 13772}#) + ((#{loop 16254}# + (lambda (#{r 16355}# #{x 16356}#) + (if (not (pair? #{x 16356}#)) + (values #{r 16355}# #{x 16356}#) + (#{loop 16254}# + (cons (car #{x 16356}#) #{r 16355}#) + (cdr #{x 16356}#)))))) + (#{loop 16254}# '() #{x 16253}#)))) + (#{cvt 15445}# + (lambda (#{p 15448}# #{n 15449}# #{ids 15450}#) + (if (if (symbol? #{p 15448}#) #t - (if (if (vector? #{p 13772}#) - (if (= (vector-length #{p 13772}#) 4) - (eq? (vector-ref #{p 13772}# 0) + (if (if (vector? #{p 15448}#) + (if (= (vector-length #{p 15448}#) 4) + (eq? (vector-ref #{p 15448}# 0) 'syntax-object) #f) #f) - (symbol? (vector-ref #{p 13772}# 1)) + (symbol? (vector-ref #{p 15448}# 1)) #f)) - (if (#{bound-id-member? 4325}# - #{p 13772}# - #{keys 13766}#) + (if (#{bound-id-member? 4435}# + #{p 15448}# + #{keys 15442}#) (values - (vector 'free-id #{p 13772}#) - #{ids 13774}#) - (if (if (eq? (if (if (vector? #{p 13772}#) - (if (= (vector-length #{p 13772}#) - 4) - (eq? (vector-ref #{p 13772}# 0) - 'syntax-object) - #f) - #f) - (vector-ref #{p 13772}# 1) - #{p 13772}#) - (if (if (= (vector-length - '#(syntax-object - _ - ((top) - #(ribcage () () ()) - #(ribcage - #(p n ids) - #((top) (top) (top)) - #("i3735" - "i3736" - "i3737")) - #(ribcage - (cvt v-reverse cvt*) - ((top) (top) (top)) - ("i3708" - "i3706" - "i3704")) - #(ribcage - #(pattern keys) - #((top) (top)) - #("i3702" "i3703")) - #(ribcage - (gen-syntax-case - gen-clause - build-dispatch-call - convert-pattern) - ((top) - (top) - (top) - (top)) - ("i3698" - "i3696" - "i3694" - "i3692")) - #(ribcage - (lambda-var-list - gen-var - strip - expand-lambda-case - lambda*-formals - expand-simple-lambda - lambda-formals - ellipsis? - expand-void - eval-local-transformer - expand-local-syntax - expand-body - expand-macro - expand-application - expand-expr - expand - syntax-type - parse-when-list - expand-install-global - expand-top-sequence - expand-sequence - source-wrap - wrap - bound-id-member? - distinct-bound-ids? - valid-bound-ids? - bound-id=? - free-id=? - id-var-name - same-marks? - join-marks - join-wraps - smart-append - make-binding-wrap - extend-ribcage! - make-empty-ribcage - new-mark - anti-mark - the-anti-mark - top-marked? - top-wrap - empty-wrap - set-ribcage-labels! - set-ribcage-marks! - set-ribcage-symnames! - ribcage-labels - ribcage-marks - ribcage-symnames - ribcage? - make-ribcage - gen-labels - gen-label - make-rename - rename-marks - rename-new - rename-old - subst-rename? - wrap-subst - wrap-marks - make-wrap - id-sym-name&marks - id-sym-name - id? - nonsymbol-id? - global-extend - lookup - macros-only-env - extend-var-env - extend-env - null-env - binding-value - binding-type - make-binding - arg-check - source-annotation - no-source - set-syntax-object-module! - set-syntax-object-wrap! - set-syntax-object-expression! - syntax-object-module - syntax-object-wrap - syntax-object-expression - syntax-object? - make-syntax-object - build-lexical-var - build-letrec - build-named-let - build-let - build-sequence - build-data - build-primref - build-lambda-case - build-case-lambda - build-simple-lambda - build-global-definition - build-global-assignment - build-global-reference - analyze-variable - build-lexical-assignment - build-lexical-reference - build-dynlet - build-conditional - build-application - build-void - maybe-name-value! - decorate-source - get-global-definition-hook - put-global-definition-hook - gensym-hook - local-eval-hook - top-level-eval-hook - fx< - fx= - fx- - fx+ - set-lambda-meta! - lambda-meta - lambda? - make-dynlet - make-letrec - make-let - make-lambda-case - make-lambda - make-sequence - make-application - make-conditional - make-toplevel-define - make-toplevel-set - make-toplevel-ref - make-module-set - make-module-ref - make-lexical-set - make-lexical-ref - make-primitive-ref - make-const - make-void) - ((top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top)) - ("i467" - "i465" - "i463" - "i461" - "i459" - "i457" - "i455" - "i453" - "i451" - "i449" - "i447" - "i445" - "i443" - "i441" - "i439" - "i437" - "i435" - "i433" - "i431" - "i429" - "i427" - "i425" - "i423" - "i421" - "i419" - "i417" - "i415" - "i413" - "i411" - "i409" - "i407" - "i405" - "i403" - "i401" - "i399" - "i398" - "i396" - "i393" - "i392" - "i391" - "i389" - "i388" - "i386" - "i384" - "i382" - "i380" - "i378" - "i376" - "i374" - "i372" - "i369" - "i367" - "i366" - "i364" - "i362" - "i360" - "i358" - "i357" - "i356" - "i355" - "i353" - "i352" - "i349" - "i347" - "i345" - "i343" - "i341" - "i339" - "i337" - "i336" - "i335" - "i333" - "i331" - "i330" - "i327" - "i326" - "i324" - "i322" - "i320" - "i318" - "i316" - "i314" - "i312" - "i310" - "i308" - "i305" - "i303" - "i301" - "i299" - "i297" - "i295" - "i293" - "i291" - "i289" - "i287" - "i285" - "i283" - "i281" - "i279" - "i277" - "i275" - "i273" - "i271" - "i269" - "i267" - "i265" - "i263" - "i261" - "i260" - "i257" - "i255" - "i254" - "i253" - "i252" - "i251" - "i249" - "i247" - "i245" - "i242" - "i240" - "i238" - "i236" - "i234" - "i232" - "i230" - "i228" - "i226" - "i224" - "i222" - "i220" - "i218" - "i216" - "i214" - "i212" - "i210" - "i208")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("i46" "i45" "i44"))) - (hygiene guile))) - 4) - #t - #f) - '_ - '#(syntax-object - _ - ((top) - #(ribcage () () ()) - #(ribcage - #(p n ids) - #((top) (top) (top)) - #("i3735" "i3736" "i3737")) - #(ribcage - (cvt v-reverse cvt*) - ((top) (top) (top)) - ("i3708" "i3706" "i3704")) - #(ribcage - #(pattern keys) - #((top) (top)) - #("i3702" "i3703")) - #(ribcage - (gen-syntax-case - gen-clause - build-dispatch-call - convert-pattern) - ((top) (top) (top) (top)) - ("i3698" "i3696" "i3694" "i3692")) - #(ribcage - (lambda-var-list - gen-var - strip - expand-lambda-case - lambda*-formals - expand-simple-lambda - lambda-formals - ellipsis? - expand-void - eval-local-transformer - expand-local-syntax - expand-body - expand-macro - expand-application - expand-expr - expand - syntax-type - parse-when-list - expand-install-global - expand-top-sequence - expand-sequence - source-wrap - wrap - bound-id-member? - distinct-bound-ids? - valid-bound-ids? - bound-id=? - free-id=? - id-var-name - same-marks? - join-marks - join-wraps - smart-append - make-binding-wrap - extend-ribcage! - make-empty-ribcage - new-mark - anti-mark - the-anti-mark - top-marked? - top-wrap - empty-wrap - set-ribcage-labels! - set-ribcage-marks! - set-ribcage-symnames! - ribcage-labels - ribcage-marks - ribcage-symnames - ribcage? - make-ribcage - gen-labels - gen-label - make-rename - rename-marks - rename-new - rename-old - subst-rename? - wrap-subst - wrap-marks - make-wrap - id-sym-name&marks - id-sym-name - id? - nonsymbol-id? - global-extend - lookup - macros-only-env - extend-var-env - extend-env - null-env - binding-value - binding-type - make-binding - arg-check - source-annotation - no-source - set-syntax-object-module! - set-syntax-object-wrap! - set-syntax-object-expression! - syntax-object-module - syntax-object-wrap - syntax-object-expression - syntax-object? - make-syntax-object - build-lexical-var - build-letrec - build-named-let - build-let - build-sequence - build-data - build-primref - build-lambda-case - build-case-lambda - build-simple-lambda - build-global-definition - build-global-assignment - build-global-reference - analyze-variable - build-lexical-assignment - build-lexical-reference - build-dynlet - build-conditional - build-application - build-void - maybe-name-value! - decorate-source - get-global-definition-hook - put-global-definition-hook - gensym-hook - local-eval-hook - top-level-eval-hook - fx< - fx= - fx- - fx+ - set-lambda-meta! - lambda-meta - lambda? - make-dynlet - make-letrec - make-let - make-lambda-case - make-lambda - make-sequence - make-application - make-conditional - make-toplevel-define - make-toplevel-set - make-toplevel-ref - make-module-set - make-module-ref - make-lexical-set - make-lexical-ref - make-primitive-ref - make-const - make-void) - ((top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top)) - ("i467" - "i465" - "i463" - "i461" - "i459" - "i457" - "i455" - "i453" - "i451" - "i449" - "i447" - "i445" - "i443" - "i441" - "i439" - "i437" - "i435" - "i433" - "i431" - "i429" - "i427" - "i425" - "i423" - "i421" - "i419" - "i417" - "i415" - "i413" - "i411" - "i409" - "i407" - "i405" - "i403" - "i401" - "i399" - "i398" - "i396" - "i393" - "i392" - "i391" - "i389" - "i388" - "i386" - "i384" - "i382" - "i380" - "i378" - "i376" - "i374" - "i372" - "i369" - "i367" - "i366" - "i364" - "i362" - "i360" - "i358" - "i357" - "i356" - "i355" - "i353" - "i352" - "i349" - "i347" - "i345" - "i343" - "i341" - "i339" - "i337" - "i336" - "i335" - "i333" - "i331" - "i330" - "i327" - "i326" - "i324" - "i322" - "i320" - "i318" - "i316" - "i314" - "i312" - "i310" - "i308" - "i305" - "i303" - "i301" - "i299" - "i297" - "i295" - "i293" - "i291" - "i289" - "i287" - "i285" - "i283" - "i281" - "i279" - "i277" - "i275" - "i273" - "i271" - "i269" - "i267" - "i265" - "i263" - "i261" - "i260" - "i257" - "i255" - "i254" - "i253" - "i252" - "i251" - "i249" - "i247" - "i245" - "i242" - "i240" - "i238" - "i236" - "i234" - "i232" - "i230" - "i228" - "i226" - "i224" - "i222" - "i220" - "i218" - "i216" - "i214" - "i212" - "i210" - "i208")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("i46" "i45" "i44"))) - (hygiene guile)))) - (eq? (#{id-var-name 4320}# #{p 13772}# '(())) - (#{id-var-name 4320}# - '#(syntax-object - _ - ((top) - #(ribcage () () ()) - #(ribcage - #(p n ids) - #((top) (top) (top)) - #("i3735" "i3736" "i3737")) - #(ribcage - (cvt v-reverse cvt*) - ((top) (top) (top)) - ("i3708" "i3706" "i3704")) - #(ribcage - #(pattern keys) - #((top) (top)) - #("i3702" "i3703")) - #(ribcage - (gen-syntax-case - gen-clause - build-dispatch-call - convert-pattern) - ((top) (top) (top) (top)) - ("i3698" "i3696" "i3694" "i3692")) - #(ribcage - (lambda-var-list - gen-var - strip - expand-lambda-case - lambda*-formals - expand-simple-lambda - lambda-formals - ellipsis? - expand-void - eval-local-transformer - expand-local-syntax - expand-body - expand-macro - expand-application - expand-expr - expand - syntax-type - parse-when-list - expand-install-global - expand-top-sequence - expand-sequence - source-wrap - wrap - bound-id-member? - distinct-bound-ids? - valid-bound-ids? - bound-id=? - free-id=? - id-var-name - same-marks? - join-marks - join-wraps - smart-append - make-binding-wrap - extend-ribcage! - make-empty-ribcage - new-mark - anti-mark - the-anti-mark - top-marked? - top-wrap - empty-wrap - set-ribcage-labels! - set-ribcage-marks! - set-ribcage-symnames! - ribcage-labels - ribcage-marks - ribcage-symnames - ribcage? - make-ribcage - gen-labels - gen-label - make-rename - rename-marks - rename-new - rename-old - subst-rename? - wrap-subst - wrap-marks - make-wrap - id-sym-name&marks - id-sym-name - id? - nonsymbol-id? - global-extend - lookup - macros-only-env - extend-var-env - extend-env - null-env - binding-value - binding-type - make-binding - arg-check - source-annotation - no-source - set-syntax-object-module! - set-syntax-object-wrap! - set-syntax-object-expression! - syntax-object-module - syntax-object-wrap - syntax-object-expression - syntax-object? - make-syntax-object - build-lexical-var - build-letrec - build-named-let - build-let - build-sequence - build-data - build-primref - build-lambda-case - build-case-lambda - build-simple-lambda - build-global-definition - build-global-assignment - build-global-reference - analyze-variable - build-lexical-assignment - build-lexical-reference - build-dynlet - build-conditional - build-application - build-void - maybe-name-value! - decorate-source - get-global-definition-hook - put-global-definition-hook - gensym-hook - local-eval-hook - top-level-eval-hook - fx< - fx= - fx- - fx+ - set-lambda-meta! - lambda-meta - lambda? - make-dynlet - make-letrec - make-let - make-lambda-case - make-lambda - make-sequence - make-application - make-conditional - make-toplevel-define - make-toplevel-set - make-toplevel-ref - make-module-set - make-module-ref - make-lexical-set - make-lexical-ref - make-primitive-ref - make-const - make-void) - ((top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top)) - ("i467" - "i465" - "i463" - "i461" - "i459" - "i457" - "i455" - "i453" - "i451" - "i449" - "i447" - "i445" - "i443" - "i441" - "i439" - "i437" - "i435" - "i433" - "i431" - "i429" - "i427" - "i425" - "i423" - "i421" - "i419" - "i417" - "i415" - "i413" - "i411" - "i409" - "i407" - "i405" - "i403" - "i401" - "i399" - "i398" - "i396" - "i393" - "i392" - "i391" - "i389" - "i388" - "i386" - "i384" - "i382" - "i380" - "i378" - "i376" - "i374" - "i372" - "i369" - "i367" - "i366" - "i364" - "i362" - "i360" - "i358" - "i357" - "i356" - "i355" - "i353" - "i352" - "i349" - "i347" - "i345" - "i343" - "i341" - "i339" - "i337" - "i336" - "i335" - "i333" - "i331" - "i330" - "i327" - "i326" - "i324" - "i322" - "i320" - "i318" - "i316" - "i314" - "i312" - "i310" - "i308" - "i305" - "i303" - "i301" - "i299" - "i297" - "i295" - "i293" - "i291" - "i289" - "i287" - "i285" - "i283" - "i281" - "i279" - "i277" - "i275" - "i273" - "i271" - "i269" - "i267" - "i265" - "i263" - "i261" - "i260" - "i257" - "i255" - "i254" - "i253" - "i252" - "i251" - "i249" - "i247" - "i245" - "i242" - "i240" - "i238" - "i236" - "i234" - "i232" - "i230" - "i228" - "i226" - "i224" - "i222" - "i220" - "i218" - "i216" - "i214" - "i212" - "i210" - "i208")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("i46" "i45" "i44"))) - (hygiene guile)) - '(()))) - #f) - (values '_ #{ids 13774}#) + (vector 'free-id #{p 15448}#) + #{ids 15450}#) + (if (#{free-id=? 4431}# + #{p 15448}# + '#(syntax-object + _ + ((top) + #(ribcage () () ()) + #(ribcage + #(p n ids) + #((top) (top) (top)) + #("i3847" "i3848" "i3849")) + #(ribcage + (cvt v-reverse cvt*) + ((top) (top) (top)) + ("i3820" "i3818" "i3816")) + #(ribcage + #(pattern keys) + #((top) (top)) + #("i3814" "i3815")) + #(ribcage + (gen-syntax-case + gen-clause + build-dispatch-call + convert-pattern) + ((top) (top) (top) (top)) + ("i3810" "i3808" "i3806" "i3804")) + #(ribcage + (lambda-var-list + gen-var + strip + expand-lambda-case + lambda*-formals + expand-simple-lambda + lambda-formals + ellipsis? + expand-void + eval-local-transformer + expand-local-syntax + expand-body + expand-macro + expand-call + expand-expr + expand + syntax-type + parse-when-list + expand-install-global + expand-top-sequence + expand-sequence + source-wrap + wrap + bound-id-member? + distinct-bound-ids? + valid-bound-ids? + bound-id=? + free-id=? + resolve-identifier + id-var-name + same-marks? + join-marks + join-wraps + smart-append + make-binding-wrap + extend-ribcage! + make-empty-ribcage + new-mark + anti-mark + the-anti-mark + top-marked? + top-wrap + empty-wrap + set-ribcage-labels! + set-ribcage-marks! + set-ribcage-symnames! + ribcage-labels + ribcage-marks + ribcage-symnames + ribcage? + make-ribcage + gen-labels + gen-label + make-rename + rename-marks + rename-new + rename-old + subst-rename? + wrap-subst + wrap-marks + make-wrap + id-sym-name&marks + id-sym-name + id? + nonsymbol-id? + global-extend + macros-only-env + extend-var-env + extend-env + null-env + binding-value + binding-type + make-binding + arg-check + source-annotation + no-source + set-syntax-object-module! + set-syntax-object-wrap! + set-syntax-object-expression! + syntax-object-module + syntax-object-wrap + syntax-object-expression + syntax-object? + make-syntax-object + build-lexical-var + build-letrec + build-named-let + build-let + build-sequence + build-data + build-primref + build-primcall + build-lambda-case + build-case-lambda + build-simple-lambda + build-global-definition + build-global-assignment + build-global-reference + analyze-variable + build-lexical-assignment + build-lexical-reference + build-dynlet + build-conditional + build-call + build-void + maybe-name-value! + decorate-source + get-global-definition-hook + put-global-definition-hook + gensym-hook + local-eval-hook + top-level-eval-hook + fx< + fx= + fx- + fx+ + set-lambda-meta! + lambda-meta + lambda? + make-dynlet + make-letrec + make-let + make-lambda-case + make-lambda + make-seq + make-primcall + make-call + make-conditional + make-toplevel-define + make-toplevel-set + make-toplevel-ref + make-module-set + make-module-ref + make-lexical-set + make-lexical-ref + make-primitive-ref + make-const + make-void) + ((top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top)) + ("i471" + "i469" + "i467" + "i465" + "i463" + "i461" + "i459" + "i457" + "i455" + "i453" + "i451" + "i449" + "i447" + "i445" + "i443" + "i441" + "i439" + "i437" + "i435" + "i433" + "i431" + "i429" + "i427" + "i425" + "i423" + "i421" + "i419" + "i417" + "i415" + "i413" + "i411" + "i409" + "i407" + "i405" + "i403" + "i401" + "i400" + "i398" + "i395" + "i394" + "i393" + "i391" + "i390" + "i388" + "i386" + "i384" + "i382" + "i380" + "i378" + "i376" + "i374" + "i371" + "i369" + "i368" + "i366" + "i364" + "i362" + "i360" + "i359" + "i358" + "i357" + "i355" + "i354" + "i351" + "i349" + "i347" + "i345" + "i343" + "i341" + "i340" + "i339" + "i337" + "i335" + "i334" + "i331" + "i330" + "i328" + "i326" + "i324" + "i322" + "i320" + "i318" + "i316" + "i314" + "i312" + "i309" + "i307" + "i305" + "i303" + "i301" + "i299" + "i297" + "i295" + "i293" + "i291" + "i289" + "i287" + "i285" + "i283" + "i281" + "i279" + "i277" + "i275" + "i273" + "i271" + "i269" + "i267" + "i265" + "i263" + "i262" + "i259" + "i257" + "i256" + "i255" + "i254" + "i253" + "i251" + "i249" + "i247" + "i244" + "i242" + "i240" + "i238" + "i236" + "i234" + "i232" + "i230" + "i228" + "i226" + "i224" + "i222" + "i220" + "i218" + "i216" + "i214" + "i212" + "i210" + "i208")) + #(ribcage + (define-structure + define-expansion-accessors + define-expansion-constructors) + ((top) (top) (top)) + ("i46" "i45" "i44")) + #(ribcage () () ())) + (hygiene guile))) + (values '_ #{ids 15450}#) (values 'any - (cons (cons #{p 13772}# #{n 13773}#) - #{ids 13774}#)))) - (let ((#{tmp 14096}# - ($sc-dispatch #{p 13772}# '(any any)))) - (if (if #{tmp 14096}# + (cons (cons #{p 15448}# #{n 15449}#) + #{ids 15450}#)))) + (let ((#{tmp 15582}# + ($sc-dispatch #{p 15448}# '(any any)))) + (if (if #{tmp 15582}# (@apply - (lambda (#{x 14100}# #{dots 14101}#) - (if (if (if (vector? #{dots 14101}#) + (lambda (#{x 15586}# #{dots 15587}#) + (if (if (if (vector? #{dots 15587}#) (if (= (vector-length - #{dots 14101}#) + #{dots 15587}#) 4) (eq? (vector-ref - #{dots 14101}# + #{dots 15587}# 0) 'syntax-object) #f) #f) - (symbol? (vector-ref #{dots 14101}# 1)) + (symbol? (vector-ref #{dots 15587}# 1)) #f) - (if (eq? (if (if (vector? #{dots 14101}#) - (if (= (vector-length - #{dots 14101}#) - 4) - (eq? (vector-ref - #{dots 14101}# - 0) - 'syntax-object) - #f) - #f) - (vector-ref #{dots 14101}# 1) - #{dots 14101}#) - (if (if (= (vector-length - '#(syntax-object - ... - ((top) - #(ribcage - () - () - ()) - #(ribcage - () - () - ()) - #(ribcage - #(x) - #((top)) - #("i2218")) - #(ribcage - (lambda-var-list - gen-var - strip - expand-lambda-case - lambda*-formals - expand-simple-lambda - lambda-formals - ellipsis? - expand-void - eval-local-transformer - expand-local-syntax - expand-body - expand-macro - expand-application - expand-expr - expand - syntax-type - parse-when-list - expand-install-global - expand-top-sequence - expand-sequence - source-wrap - wrap - bound-id-member? - distinct-bound-ids? - valid-bound-ids? - bound-id=? - free-id=? - id-var-name - same-marks? - join-marks - join-wraps - smart-append - make-binding-wrap - extend-ribcage! - make-empty-ribcage - new-mark - anti-mark - the-anti-mark - top-marked? - top-wrap - empty-wrap - set-ribcage-labels! - set-ribcage-marks! - set-ribcage-symnames! - ribcage-labels - ribcage-marks - ribcage-symnames - ribcage? - make-ribcage - gen-labels - gen-label - make-rename - rename-marks - rename-new - rename-old - subst-rename? - wrap-subst - wrap-marks - make-wrap - id-sym-name&marks - id-sym-name - id? - nonsymbol-id? - global-extend - lookup - macros-only-env - extend-var-env - extend-env - null-env - binding-value - binding-type - make-binding - arg-check - source-annotation - no-source - set-syntax-object-module! - set-syntax-object-wrap! - set-syntax-object-expression! - syntax-object-module - syntax-object-wrap - syntax-object-expression - syntax-object? - make-syntax-object - build-lexical-var - build-letrec - build-named-let - build-let - build-sequence - build-data - build-primref - build-lambda-case - build-case-lambda - build-simple-lambda - build-global-definition - build-global-assignment - build-global-reference - analyze-variable - build-lexical-assignment - build-lexical-reference - build-dynlet - build-conditional - build-application - build-void - maybe-name-value! - decorate-source - get-global-definition-hook - put-global-definition-hook - gensym-hook - local-eval-hook - top-level-eval-hook - fx< - fx= - fx- - fx+ - set-lambda-meta! - lambda-meta - lambda? - make-dynlet - make-letrec - make-let - make-lambda-case - make-lambda - make-sequence - make-application - make-conditional - make-toplevel-define - make-toplevel-set - make-toplevel-ref - make-module-set - make-module-ref - make-lexical-set - make-lexical-ref - make-primitive-ref - make-const - make-void) - ((top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top)) - ("i467" - "i465" - "i463" - "i461" - "i459" - "i457" - "i455" - "i453" - "i451" - "i449" - "i447" - "i445" - "i443" - "i441" - "i439" - "i437" - "i435" - "i433" - "i431" - "i429" - "i427" - "i425" - "i423" - "i421" - "i419" - "i417" - "i415" - "i413" - "i411" - "i409" - "i407" - "i405" - "i403" - "i401" - "i399" - "i398" - "i396" - "i393" - "i392" - "i391" - "i389" - "i388" - "i386" - "i384" - "i382" - "i380" - "i378" - "i376" - "i374" - "i372" - "i369" - "i367" - "i366" - "i364" - "i362" - "i360" - "i358" - "i357" - "i356" - "i355" - "i353" - "i352" - "i349" - "i347" - "i345" - "i343" - "i341" - "i339" - "i337" - "i336" - "i335" - "i333" - "i331" - "i330" - "i327" - "i326" - "i324" - "i322" - "i320" - "i318" - "i316" - "i314" - "i312" - "i310" - "i308" - "i305" - "i303" - "i301" - "i299" - "i297" - "i295" - "i293" - "i291" - "i289" - "i287" - "i285" - "i283" - "i281" - "i279" - "i277" - "i275" - "i273" - "i271" - "i269" - "i267" - "i265" - "i263" - "i261" - "i260" - "i257" - "i255" - "i254" - "i253" - "i252" - "i251" - "i249" - "i247" - "i245" - "i242" - "i240" - "i238" - "i236" - "i234" - "i232" - "i230" - "i228" - "i226" - "i224" - "i222" - "i220" - "i218" - "i216" - "i214" - "i212" - "i210" - "i208")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) - (top) - (top)) - ("i46" - "i45" - "i44"))) - (hygiene guile))) - 4) - #t - #f) - '... - '#(syntax-object - ... - ((top) - #(ribcage () () ()) - #(ribcage () () ()) - #(ribcage - #(x) - #((top)) - #("i2218")) - #(ribcage - (lambda-var-list - gen-var - strip - expand-lambda-case - lambda*-formals - expand-simple-lambda - lambda-formals - ellipsis? - expand-void - eval-local-transformer - expand-local-syntax - expand-body - expand-macro - expand-application - expand-expr - expand - syntax-type - parse-when-list - expand-install-global - expand-top-sequence - expand-sequence - source-wrap - wrap - bound-id-member? - distinct-bound-ids? - valid-bound-ids? - bound-id=? - free-id=? - id-var-name - same-marks? - join-marks - join-wraps - smart-append - make-binding-wrap - extend-ribcage! - make-empty-ribcage - new-mark - anti-mark - the-anti-mark - top-marked? - top-wrap - empty-wrap - set-ribcage-labels! - set-ribcage-marks! - set-ribcage-symnames! - ribcage-labels - ribcage-marks - ribcage-symnames - ribcage? - make-ribcage - gen-labels - gen-label - make-rename - rename-marks - rename-new - rename-old - subst-rename? - wrap-subst - wrap-marks - make-wrap - id-sym-name&marks - id-sym-name - id? - nonsymbol-id? - global-extend - lookup - macros-only-env - extend-var-env - extend-env - null-env - binding-value - binding-type - make-binding - arg-check - source-annotation - no-source - set-syntax-object-module! - set-syntax-object-wrap! - set-syntax-object-expression! - syntax-object-module - syntax-object-wrap - syntax-object-expression - syntax-object? - make-syntax-object - build-lexical-var - build-letrec - build-named-let - build-let - build-sequence - build-data - build-primref - build-lambda-case - build-case-lambda - build-simple-lambda - build-global-definition - build-global-assignment - build-global-reference - analyze-variable - build-lexical-assignment - build-lexical-reference - build-dynlet - build-conditional - build-application - build-void - maybe-name-value! - decorate-source - get-global-definition-hook - put-global-definition-hook - gensym-hook - local-eval-hook - top-level-eval-hook - fx< - fx= - fx- - fx+ - set-lambda-meta! - lambda-meta - lambda? - make-dynlet - make-letrec - make-let - make-lambda-case - make-lambda - make-sequence - make-application - make-conditional - make-toplevel-define - make-toplevel-set - make-toplevel-ref - make-module-set - make-module-ref - make-lexical-set - make-lexical-ref - make-primitive-ref - make-const - make-void) - ((top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top)) - ("i467" - "i465" - "i463" - "i461" - "i459" - "i457" - "i455" - "i453" - "i451" - "i449" - "i447" - "i445" - "i443" - "i441" - "i439" - "i437" - "i435" - "i433" - "i431" - "i429" - "i427" - "i425" - "i423" - "i421" - "i419" - "i417" - "i415" - "i413" - "i411" - "i409" - "i407" - "i405" - "i403" - "i401" - "i399" - "i398" - "i396" - "i393" - "i392" - "i391" - "i389" - "i388" - "i386" - "i384" - "i382" - "i380" - "i378" - "i376" - "i374" - "i372" - "i369" - "i367" - "i366" - "i364" - "i362" - "i360" - "i358" - "i357" - "i356" - "i355" - "i353" - "i352" - "i349" - "i347" - "i345" - "i343" - "i341" - "i339" - "i337" - "i336" - "i335" - "i333" - "i331" - "i330" - "i327" - "i326" - "i324" - "i322" - "i320" - "i318" - "i316" - "i314" - "i312" - "i310" - "i308" - "i305" - "i303" - "i301" - "i299" - "i297" - "i295" - "i293" - "i291" - "i289" - "i287" - "i285" - "i283" - "i281" - "i279" - "i277" - "i275" - "i273" - "i271" - "i269" - "i267" - "i265" - "i263" - "i261" - "i260" - "i257" - "i255" - "i254" - "i253" - "i252" - "i251" - "i249" - "i247" - "i245" - "i242" - "i240" - "i238" - "i236" - "i234" - "i232" - "i230" - "i228" - "i226" - "i224" - "i222" - "i220" - "i218" - "i216" - "i214" - "i212" - "i210" - "i208")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("i46" "i45" "i44"))) - (hygiene guile)))) - (eq? (#{id-var-name 4320}# - #{dots 14101}# - '(())) - (#{id-var-name 4320}# - '#(syntax-object - ... - ((top) - #(ribcage () () ()) - #(ribcage () () ()) - #(ribcage - #(x) - #((top)) - #("i2218")) - #(ribcage - (lambda-var-list - gen-var - strip - expand-lambda-case - lambda*-formals - expand-simple-lambda - lambda-formals - ellipsis? - expand-void - eval-local-transformer - expand-local-syntax - expand-body - expand-macro - expand-application - expand-expr - expand - syntax-type - parse-when-list - expand-install-global - expand-top-sequence - expand-sequence - source-wrap - wrap - bound-id-member? - distinct-bound-ids? - valid-bound-ids? - bound-id=? - free-id=? - id-var-name - same-marks? - join-marks - join-wraps - smart-append - make-binding-wrap - extend-ribcage! - make-empty-ribcage - new-mark - anti-mark - the-anti-mark - top-marked? - top-wrap - empty-wrap - set-ribcage-labels! - set-ribcage-marks! - set-ribcage-symnames! - ribcage-labels - ribcage-marks - ribcage-symnames - ribcage? - make-ribcage - gen-labels - gen-label - make-rename - rename-marks - rename-new - rename-old - subst-rename? - wrap-subst - wrap-marks - make-wrap - id-sym-name&marks - id-sym-name - id? - nonsymbol-id? - global-extend - lookup - macros-only-env - extend-var-env - extend-env - null-env - binding-value - binding-type - make-binding - arg-check - source-annotation - no-source - set-syntax-object-module! - set-syntax-object-wrap! - set-syntax-object-expression! - syntax-object-module - syntax-object-wrap - syntax-object-expression - syntax-object? - make-syntax-object - build-lexical-var - build-letrec - build-named-let - build-let - build-sequence - build-data - build-primref - build-lambda-case - build-case-lambda - build-simple-lambda - build-global-definition - build-global-assignment - build-global-reference - analyze-variable - build-lexical-assignment - build-lexical-reference - build-dynlet - build-conditional - build-application - build-void - maybe-name-value! - decorate-source - get-global-definition-hook - put-global-definition-hook - gensym-hook - local-eval-hook - top-level-eval-hook - fx< - fx= - fx- - fx+ - set-lambda-meta! - lambda-meta - lambda? - make-dynlet - make-letrec - make-let - make-lambda-case - make-lambda - make-sequence - make-application - make-conditional - make-toplevel-define - make-toplevel-set - make-toplevel-ref - make-module-set - make-module-ref - make-lexical-set - make-lexical-ref - make-primitive-ref - make-const - make-void) - ((top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top)) - ("i467" - "i465" - "i463" - "i461" - "i459" - "i457" - "i455" - "i453" - "i451" - "i449" - "i447" - "i445" - "i443" - "i441" - "i439" - "i437" - "i435" - "i433" - "i431" - "i429" - "i427" - "i425" - "i423" - "i421" - "i419" - "i417" - "i415" - "i413" - "i411" - "i409" - "i407" - "i405" - "i403" - "i401" - "i399" - "i398" - "i396" - "i393" - "i392" - "i391" - "i389" - "i388" - "i386" - "i384" - "i382" - "i380" - "i378" - "i376" - "i374" - "i372" - "i369" - "i367" - "i366" - "i364" - "i362" - "i360" - "i358" - "i357" - "i356" - "i355" - "i353" - "i352" - "i349" - "i347" - "i345" - "i343" - "i341" - "i339" - "i337" - "i336" - "i335" - "i333" - "i331" - "i330" - "i327" - "i326" - "i324" - "i322" - "i320" - "i318" - "i316" - "i314" - "i312" - "i310" - "i308" - "i305" - "i303" - "i301" - "i299" - "i297" - "i295" - "i293" - "i291" - "i289" - "i287" - "i285" - "i283" - "i281" - "i279" - "i277" - "i275" - "i273" - "i271" - "i269" - "i267" - "i265" - "i263" - "i261" - "i260" - "i257" - "i255" - "i254" - "i253" - "i252" - "i251" - "i249" - "i247" - "i245" - "i242" - "i240" - "i238" - "i236" - "i234" - "i232" - "i230" - "i228" - "i226" - "i224" - "i222" - "i220" - "i218" - "i216" - "i214" - "i212" - "i210" - "i208")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("i46" "i45" "i44"))) - (hygiene guile)) - '(()))) - #f) + (#{free-id=? 4431}# + #{dots 15587}# + '#(syntax-object + ... + ((top) + #(ribcage () () ()) + #(ribcage () () ()) + #(ribcage #(x) #((top)) #("i2338")) + #(ribcage + (lambda-var-list + gen-var + strip + expand-lambda-case + lambda*-formals + expand-simple-lambda + lambda-formals + ellipsis? + expand-void + eval-local-transformer + expand-local-syntax + expand-body + expand-macro + expand-call + expand-expr + expand + syntax-type + parse-when-list + expand-install-global + expand-top-sequence + expand-sequence + source-wrap + wrap + bound-id-member? + distinct-bound-ids? + valid-bound-ids? + bound-id=? + free-id=? + resolve-identifier + id-var-name + same-marks? + join-marks + join-wraps + smart-append + make-binding-wrap + extend-ribcage! + make-empty-ribcage + new-mark + anti-mark + the-anti-mark + top-marked? + top-wrap + empty-wrap + set-ribcage-labels! + set-ribcage-marks! + set-ribcage-symnames! + ribcage-labels + ribcage-marks + ribcage-symnames + ribcage? + make-ribcage + gen-labels + gen-label + make-rename + rename-marks + rename-new + rename-old + subst-rename? + wrap-subst + wrap-marks + make-wrap + id-sym-name&marks + id-sym-name + id? + nonsymbol-id? + global-extend + macros-only-env + extend-var-env + extend-env + null-env + binding-value + binding-type + make-binding + arg-check + source-annotation + no-source + set-syntax-object-module! + set-syntax-object-wrap! + set-syntax-object-expression! + syntax-object-module + syntax-object-wrap + syntax-object-expression + syntax-object? + make-syntax-object + build-lexical-var + build-letrec + build-named-let + build-let + build-sequence + build-data + build-primref + build-primcall + build-lambda-case + build-case-lambda + build-simple-lambda + build-global-definition + build-global-assignment + build-global-reference + analyze-variable + build-lexical-assignment + build-lexical-reference + build-dynlet + build-conditional + build-call + build-void + maybe-name-value! + decorate-source + get-global-definition-hook + put-global-definition-hook + gensym-hook + local-eval-hook + top-level-eval-hook + fx< + fx= + fx- + fx+ + set-lambda-meta! + lambda-meta + lambda? + make-dynlet + make-letrec + make-let + make-lambda-case + make-lambda + make-seq + make-primcall + make-call + make-conditional + make-toplevel-define + make-toplevel-set + make-toplevel-ref + make-module-set + make-module-ref + make-lexical-set + make-lexical-ref + make-primitive-ref + make-const + make-void) + ((top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top)) + ("i471" + "i469" + "i467" + "i465" + "i463" + "i461" + "i459" + "i457" + "i455" + "i453" + "i451" + "i449" + "i447" + "i445" + "i443" + "i441" + "i439" + "i437" + "i435" + "i433" + "i431" + "i429" + "i427" + "i425" + "i423" + "i421" + "i419" + "i417" + "i415" + "i413" + "i411" + "i409" + "i407" + "i405" + "i403" + "i401" + "i400" + "i398" + "i395" + "i394" + "i393" + "i391" + "i390" + "i388" + "i386" + "i384" + "i382" + "i380" + "i378" + "i376" + "i374" + "i371" + "i369" + "i368" + "i366" + "i364" + "i362" + "i360" + "i359" + "i358" + "i357" + "i355" + "i354" + "i351" + "i349" + "i347" + "i345" + "i343" + "i341" + "i340" + "i339" + "i337" + "i335" + "i334" + "i331" + "i330" + "i328" + "i326" + "i324" + "i322" + "i320" + "i318" + "i316" + "i314" + "i312" + "i309" + "i307" + "i305" + "i303" + "i301" + "i299" + "i297" + "i295" + "i293" + "i291" + "i289" + "i287" + "i285" + "i283" + "i281" + "i279" + "i277" + "i275" + "i273" + "i271" + "i269" + "i267" + "i265" + "i263" + "i262" + "i259" + "i257" + "i256" + "i255" + "i254" + "i253" + "i251" + "i249" + "i247" + "i244" + "i242" + "i240" + "i238" + "i236" + "i234" + "i232" + "i230" + "i228" + "i226" + "i224" + "i222" + "i220" + "i218" + "i216" + "i214" + "i212" + "i210" + "i208")) + #(ribcage + (define-structure + define-expansion-accessors + define-expansion-constructors) + ((top) (top) (top)) + ("i46" "i45" "i44")) + #(ribcage () () ())) + (hygiene guile))) #f)) - #{tmp 14096}#) + #{tmp 15582}#) #f) (@apply - (lambda (#{x 14201}# #{dots 14202}#) + (lambda (#{x 15626}# #{dots 15627}#) (call-with-values (lambda () - (#{cvt 13769}# - #{x 14201}# - (#{1+}# #{n 13773}#) - #{ids 13774}#)) - (lambda (#{p 14203}# #{ids 14204}#) + (#{cvt 15445}# + #{x 15626}# + (#{1+}# #{n 15449}#) + #{ids 15450}#)) + (lambda (#{p 15628}# #{ids 15629}#) (values - (if (eq? #{p 14203}# 'any) + (if (eq? #{p 15628}# 'any) 'each-any - (vector 'each #{p 14203}#)) - #{ids 14204}#)))) - #{tmp 14096}#) - (let ((#{tmp 14205}# - ($sc-dispatch #{p 13772}# '(any any . any)))) - (if (if #{tmp 14205}# + (vector 'each #{p 15628}#)) + #{ids 15629}#)))) + #{tmp 15582}#) + (let ((#{tmp 15630}# + ($sc-dispatch #{p 15448}# '(any any . any)))) + (if (if #{tmp 15630}# (@apply - (lambda (#{x 14209}# - #{dots 14210}# - #{ys 14211}#) - (if (if (if (vector? #{dots 14210}#) + (lambda (#{x 15634}# + #{dots 15635}# + #{ys 15636}#) + (if (if (if (vector? #{dots 15635}#) (if (= (vector-length - #{dots 14210}#) + #{dots 15635}#) 4) (eq? (vector-ref - #{dots 14210}# + #{dots 15635}# 0) 'syntax-object) #f) #f) (symbol? - (vector-ref #{dots 14210}# 1)) + (vector-ref #{dots 15635}# 1)) #f) - (if (eq? (if (if (vector? - #{dots 14210}#) - (if (= (vector-length - #{dots 14210}#) - 4) - (eq? (vector-ref - #{dots 14210}# - 0) - 'syntax-object) - #f) - #f) - (vector-ref - #{dots 14210}# - 1) - #{dots 14210}#) - (if (if (= (vector-length - '#(syntax-object - ... - ((top) - #(ribcage - () - () - ()) - #(ribcage - () - () - ()) - #(ribcage - #(x) - #((top)) - #("i2218")) - #(ribcage - (lambda-var-list - gen-var - strip - expand-lambda-case - lambda*-formals - expand-simple-lambda - lambda-formals - ellipsis? - expand-void - eval-local-transformer - expand-local-syntax - expand-body - expand-macro - expand-application - expand-expr - expand - syntax-type - parse-when-list - expand-install-global - expand-top-sequence - expand-sequence - source-wrap - wrap - bound-id-member? - distinct-bound-ids? - valid-bound-ids? - bound-id=? - free-id=? - id-var-name - same-marks? - join-marks - join-wraps - smart-append - make-binding-wrap - extend-ribcage! - make-empty-ribcage - new-mark - anti-mark - the-anti-mark - top-marked? - top-wrap - empty-wrap - set-ribcage-labels! - set-ribcage-marks! - set-ribcage-symnames! - ribcage-labels - ribcage-marks - ribcage-symnames - ribcage? - make-ribcage - gen-labels - gen-label - make-rename - rename-marks - rename-new - rename-old - subst-rename? - wrap-subst - wrap-marks - make-wrap - id-sym-name&marks - id-sym-name - id? - nonsymbol-id? - global-extend - lookup - macros-only-env - extend-var-env - extend-env - null-env - binding-value - binding-type - make-binding - arg-check - source-annotation - no-source - set-syntax-object-module! - set-syntax-object-wrap! - set-syntax-object-expression! - syntax-object-module - syntax-object-wrap - syntax-object-expression - syntax-object? - make-syntax-object - build-lexical-var - build-letrec - build-named-let - build-let - build-sequence - build-data - build-primref - build-lambda-case - build-case-lambda - build-simple-lambda - build-global-definition - build-global-assignment - build-global-reference - analyze-variable - build-lexical-assignment - build-lexical-reference - build-dynlet - build-conditional - build-application - build-void - maybe-name-value! - decorate-source - get-global-definition-hook - put-global-definition-hook - gensym-hook - local-eval-hook - top-level-eval-hook - fx< - fx= - fx- - fx+ - set-lambda-meta! - lambda-meta - lambda? - make-dynlet - make-letrec - make-let - make-lambda-case - make-lambda - make-sequence - make-application - make-conditional - make-toplevel-define - make-toplevel-set - make-toplevel-ref - make-module-set - make-module-ref - make-lexical-set - make-lexical-ref - make-primitive-ref - make-const - make-void) - ((top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top)) - ("i467" - "i465" - "i463" - "i461" - "i459" - "i457" - "i455" - "i453" - "i451" - "i449" - "i447" - "i445" - "i443" - "i441" - "i439" - "i437" - "i435" - "i433" - "i431" - "i429" - "i427" - "i425" - "i423" - "i421" - "i419" - "i417" - "i415" - "i413" - "i411" - "i409" - "i407" - "i405" - "i403" - "i401" - "i399" - "i398" - "i396" - "i393" - "i392" - "i391" - "i389" - "i388" - "i386" - "i384" - "i382" - "i380" - "i378" - "i376" - "i374" - "i372" - "i369" - "i367" - "i366" - "i364" - "i362" - "i360" - "i358" - "i357" - "i356" - "i355" - "i353" - "i352" - "i349" - "i347" - "i345" - "i343" - "i341" - "i339" - "i337" - "i336" - "i335" - "i333" - "i331" - "i330" - "i327" - "i326" - "i324" - "i322" - "i320" - "i318" - "i316" - "i314" - "i312" - "i310" - "i308" - "i305" - "i303" - "i301" - "i299" - "i297" - "i295" - "i293" - "i291" - "i289" - "i287" - "i285" - "i283" - "i281" - "i279" - "i277" - "i275" - "i273" - "i271" - "i269" - "i267" - "i265" - "i263" - "i261" - "i260" - "i257" - "i255" - "i254" - "i253" - "i252" - "i251" - "i249" - "i247" - "i245" - "i242" - "i240" - "i238" - "i236" - "i234" - "i232" - "i230" - "i228" - "i226" - "i224" - "i222" - "i220" - "i218" - "i216" - "i214" - "i212" - "i210" - "i208")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) - (top) - (top)) - ("i46" - "i45" - "i44"))) - (hygiene - guile))) - 4) - #t - #f) - '... - '#(syntax-object - ... - ((top) - #(ribcage () () ()) - #(ribcage () () ()) - #(ribcage - #(x) - #((top)) - #("i2218")) - #(ribcage - (lambda-var-list - gen-var - strip - expand-lambda-case - lambda*-formals - expand-simple-lambda - lambda-formals - ellipsis? - expand-void - eval-local-transformer - expand-local-syntax - expand-body - expand-macro - expand-application - expand-expr - expand - syntax-type - parse-when-list - expand-install-global - expand-top-sequence - expand-sequence - source-wrap - wrap - bound-id-member? - distinct-bound-ids? - valid-bound-ids? - bound-id=? - free-id=? - id-var-name - same-marks? - join-marks - join-wraps - smart-append - make-binding-wrap - extend-ribcage! - make-empty-ribcage - new-mark - anti-mark - the-anti-mark - top-marked? - top-wrap - empty-wrap - set-ribcage-labels! - set-ribcage-marks! - set-ribcage-symnames! - ribcage-labels - ribcage-marks - ribcage-symnames - ribcage? - make-ribcage - gen-labels - gen-label - make-rename - rename-marks - rename-new - rename-old - subst-rename? - wrap-subst - wrap-marks - make-wrap - id-sym-name&marks - id-sym-name - id? - nonsymbol-id? - global-extend - lookup - macros-only-env - extend-var-env - extend-env - null-env - binding-value - binding-type - make-binding - arg-check - source-annotation - no-source - set-syntax-object-module! - set-syntax-object-wrap! - set-syntax-object-expression! - syntax-object-module - syntax-object-wrap - syntax-object-expression - syntax-object? - make-syntax-object - build-lexical-var - build-letrec - build-named-let - build-let - build-sequence - build-data - build-primref - build-lambda-case - build-case-lambda - build-simple-lambda - build-global-definition - build-global-assignment - build-global-reference - analyze-variable - build-lexical-assignment - build-lexical-reference - build-dynlet - build-conditional - build-application - build-void - maybe-name-value! - decorate-source - get-global-definition-hook - put-global-definition-hook - gensym-hook - local-eval-hook - top-level-eval-hook - fx< - fx= - fx- - fx+ - set-lambda-meta! - lambda-meta - lambda? - make-dynlet - make-letrec - make-let - make-lambda-case - make-lambda - make-sequence - make-application - make-conditional - make-toplevel-define - make-toplevel-set - make-toplevel-ref - make-module-set - make-module-ref - make-lexical-set - make-lexical-ref - make-primitive-ref - make-const - make-void) - ((top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top)) - ("i467" - "i465" - "i463" - "i461" - "i459" - "i457" - "i455" - "i453" - "i451" - "i449" - "i447" - "i445" - "i443" - "i441" - "i439" - "i437" - "i435" - "i433" - "i431" - "i429" - "i427" - "i425" - "i423" - "i421" - "i419" - "i417" - "i415" - "i413" - "i411" - "i409" - "i407" - "i405" - "i403" - "i401" - "i399" - "i398" - "i396" - "i393" - "i392" - "i391" - "i389" - "i388" - "i386" - "i384" - "i382" - "i380" - "i378" - "i376" - "i374" - "i372" - "i369" - "i367" - "i366" - "i364" - "i362" - "i360" - "i358" - "i357" - "i356" - "i355" - "i353" - "i352" - "i349" - "i347" - "i345" - "i343" - "i341" - "i339" - "i337" - "i336" - "i335" - "i333" - "i331" - "i330" - "i327" - "i326" - "i324" - "i322" - "i320" - "i318" - "i316" - "i314" - "i312" - "i310" - "i308" - "i305" - "i303" - "i301" - "i299" - "i297" - "i295" - "i293" - "i291" - "i289" - "i287" - "i285" - "i283" - "i281" - "i279" - "i277" - "i275" - "i273" - "i271" - "i269" - "i267" - "i265" - "i263" - "i261" - "i260" - "i257" - "i255" - "i254" - "i253" - "i252" - "i251" - "i249" - "i247" - "i245" - "i242" - "i240" - "i238" - "i236" - "i234" - "i232" - "i230" - "i228" - "i226" - "i224" - "i222" - "i220" - "i218" - "i216" - "i214" - "i212" - "i210" - "i208")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("i46" "i45" "i44"))) - (hygiene guile)))) - (eq? (#{id-var-name 4320}# - #{dots 14210}# - '(())) - (#{id-var-name 4320}# - '#(syntax-object - ... - ((top) - #(ribcage () () ()) - #(ribcage () () ()) - #(ribcage - #(x) - #((top)) - #("i2218")) - #(ribcage - (lambda-var-list - gen-var - strip - expand-lambda-case - lambda*-formals - expand-simple-lambda - lambda-formals - ellipsis? - expand-void - eval-local-transformer - expand-local-syntax - expand-body - expand-macro - expand-application - expand-expr - expand - syntax-type - parse-when-list - expand-install-global - expand-top-sequence - expand-sequence - source-wrap - wrap - bound-id-member? - distinct-bound-ids? - valid-bound-ids? - bound-id=? - free-id=? - id-var-name - same-marks? - join-marks - join-wraps - smart-append - make-binding-wrap - extend-ribcage! - make-empty-ribcage - new-mark - anti-mark - the-anti-mark - top-marked? - top-wrap - empty-wrap - set-ribcage-labels! - set-ribcage-marks! - set-ribcage-symnames! - ribcage-labels - ribcage-marks - ribcage-symnames - ribcage? - make-ribcage - gen-labels - gen-label - make-rename - rename-marks - rename-new - rename-old - subst-rename? - wrap-subst - wrap-marks - make-wrap - id-sym-name&marks - id-sym-name - id? - nonsymbol-id? - global-extend - lookup - macros-only-env - extend-var-env - extend-env - null-env - binding-value - binding-type - make-binding - arg-check - source-annotation - no-source - set-syntax-object-module! - set-syntax-object-wrap! - set-syntax-object-expression! - syntax-object-module - syntax-object-wrap - syntax-object-expression - syntax-object? - make-syntax-object - build-lexical-var - build-letrec - build-named-let - build-let - build-sequence - build-data - build-primref - build-lambda-case - build-case-lambda - build-simple-lambda - build-global-definition - build-global-assignment - build-global-reference - analyze-variable - build-lexical-assignment - build-lexical-reference - build-dynlet - build-conditional - build-application - build-void - maybe-name-value! - decorate-source - get-global-definition-hook - put-global-definition-hook - gensym-hook - local-eval-hook - top-level-eval-hook - fx< - fx= - fx- - fx+ - set-lambda-meta! - lambda-meta - lambda? - make-dynlet - make-letrec - make-let - make-lambda-case - make-lambda - make-sequence - make-application - make-conditional - make-toplevel-define - make-toplevel-set - make-toplevel-ref - make-module-set - make-module-ref - make-lexical-set - make-lexical-ref - make-primitive-ref - make-const - make-void) - ((top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top)) - ("i467" - "i465" - "i463" - "i461" - "i459" - "i457" - "i455" - "i453" - "i451" - "i449" - "i447" - "i445" - "i443" - "i441" - "i439" - "i437" - "i435" - "i433" - "i431" - "i429" - "i427" - "i425" - "i423" - "i421" - "i419" - "i417" - "i415" - "i413" - "i411" - "i409" - "i407" - "i405" - "i403" - "i401" - "i399" - "i398" - "i396" - "i393" - "i392" - "i391" - "i389" - "i388" - "i386" - "i384" - "i382" - "i380" - "i378" - "i376" - "i374" - "i372" - "i369" - "i367" - "i366" - "i364" - "i362" - "i360" - "i358" - "i357" - "i356" - "i355" - "i353" - "i352" - "i349" - "i347" - "i345" - "i343" - "i341" - "i339" - "i337" - "i336" - "i335" - "i333" - "i331" - "i330" - "i327" - "i326" - "i324" - "i322" - "i320" - "i318" - "i316" - "i314" - "i312" - "i310" - "i308" - "i305" - "i303" - "i301" - "i299" - "i297" - "i295" - "i293" - "i291" - "i289" - "i287" - "i285" - "i283" - "i281" - "i279" - "i277" - "i275" - "i273" - "i271" - "i269" - "i267" - "i265" - "i263" - "i261" - "i260" - "i257" - "i255" - "i254" - "i253" - "i252" - "i251" - "i249" - "i247" - "i245" - "i242" - "i240" - "i238" - "i236" - "i234" - "i232" - "i230" - "i228" - "i226" - "i224" - "i222" - "i220" - "i218" - "i216" - "i214" - "i212" - "i210" - "i208")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("i46" "i45" "i44"))) - (hygiene guile)) - '(()))) - #f) + (#{free-id=? 4431}# + #{dots 15635}# + '#(syntax-object + ... + ((top) + #(ribcage () () ()) + #(ribcage () () ()) + #(ribcage + #(x) + #((top)) + #("i2338")) + #(ribcage + (lambda-var-list + gen-var + strip + expand-lambda-case + lambda*-formals + expand-simple-lambda + lambda-formals + ellipsis? + expand-void + eval-local-transformer + expand-local-syntax + expand-body + expand-macro + expand-call + expand-expr + expand + syntax-type + parse-when-list + expand-install-global + expand-top-sequence + expand-sequence + source-wrap + wrap + bound-id-member? + distinct-bound-ids? + valid-bound-ids? + bound-id=? + free-id=? + resolve-identifier + id-var-name + same-marks? + join-marks + join-wraps + smart-append + make-binding-wrap + extend-ribcage! + make-empty-ribcage + new-mark + anti-mark + the-anti-mark + top-marked? + top-wrap + empty-wrap + set-ribcage-labels! + set-ribcage-marks! + set-ribcage-symnames! + ribcage-labels + ribcage-marks + ribcage-symnames + ribcage? + make-ribcage + gen-labels + gen-label + make-rename + rename-marks + rename-new + rename-old + subst-rename? + wrap-subst + wrap-marks + make-wrap + id-sym-name&marks + id-sym-name + id? + nonsymbol-id? + global-extend + macros-only-env + extend-var-env + extend-env + null-env + binding-value + binding-type + make-binding + arg-check + source-annotation + no-source + set-syntax-object-module! + set-syntax-object-wrap! + set-syntax-object-expression! + syntax-object-module + syntax-object-wrap + syntax-object-expression + syntax-object? + make-syntax-object + build-lexical-var + build-letrec + build-named-let + build-let + build-sequence + build-data + build-primref + build-primcall + build-lambda-case + build-case-lambda + build-simple-lambda + build-global-definition + build-global-assignment + build-global-reference + analyze-variable + build-lexical-assignment + build-lexical-reference + build-dynlet + build-conditional + build-call + build-void + maybe-name-value! + decorate-source + get-global-definition-hook + put-global-definition-hook + gensym-hook + local-eval-hook + top-level-eval-hook + fx< + fx= + fx- + fx+ + set-lambda-meta! + lambda-meta + lambda? + make-dynlet + make-letrec + make-let + make-lambda-case + make-lambda + make-seq + make-primcall + make-call + make-conditional + make-toplevel-define + make-toplevel-set + make-toplevel-ref + make-module-set + make-module-ref + make-lexical-set + make-lexical-ref + make-primitive-ref + make-const + make-void) + ((top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top)) + ("i471" + "i469" + "i467" + "i465" + "i463" + "i461" + "i459" + "i457" + "i455" + "i453" + "i451" + "i449" + "i447" + "i445" + "i443" + "i441" + "i439" + "i437" + "i435" + "i433" + "i431" + "i429" + "i427" + "i425" + "i423" + "i421" + "i419" + "i417" + "i415" + "i413" + "i411" + "i409" + "i407" + "i405" + "i403" + "i401" + "i400" + "i398" + "i395" + "i394" + "i393" + "i391" + "i390" + "i388" + "i386" + "i384" + "i382" + "i380" + "i378" + "i376" + "i374" + "i371" + "i369" + "i368" + "i366" + "i364" + "i362" + "i360" + "i359" + "i358" + "i357" + "i355" + "i354" + "i351" + "i349" + "i347" + "i345" + "i343" + "i341" + "i340" + "i339" + "i337" + "i335" + "i334" + "i331" + "i330" + "i328" + "i326" + "i324" + "i322" + "i320" + "i318" + "i316" + "i314" + "i312" + "i309" + "i307" + "i305" + "i303" + "i301" + "i299" + "i297" + "i295" + "i293" + "i291" + "i289" + "i287" + "i285" + "i283" + "i281" + "i279" + "i277" + "i275" + "i273" + "i271" + "i269" + "i267" + "i265" + "i263" + "i262" + "i259" + "i257" + "i256" + "i255" + "i254" + "i253" + "i251" + "i249" + "i247" + "i244" + "i242" + "i240" + "i238" + "i236" + "i234" + "i232" + "i230" + "i228" + "i226" + "i224" + "i222" + "i220" + "i218" + "i216" + "i214" + "i212" + "i210" + "i208")) + #(ribcage + (define-structure + define-expansion-accessors + define-expansion-constructors) + ((top) (top) (top)) + ("i46" "i45" "i44")) + #(ribcage () () ())) + (hygiene guile))) #f)) - #{tmp 14205}#) + #{tmp 15630}#) #f) (@apply - (lambda (#{x 14311}# - #{dots 14312}# - #{ys 14313}#) + (lambda (#{x 15675}# + #{dots 15676}# + #{ys 15677}#) (call-with-values (lambda () - (#{cvt* 13767}# - #{ys 14313}# - #{n 13773}# - #{ids 13774}#)) - (lambda (#{ys 14316}# #{ids 14317}#) + (#{cvt* 15443}# + #{ys 15677}# + #{n 15449}# + #{ids 15450}#)) + (lambda (#{ys 16162}# #{ids 16163}#) (call-with-values (lambda () - (#{cvt 13769}# - #{x 14311}# - (#{1+}# #{n 13773}#) - #{ids 14317}#)) - (lambda (#{x 14318}# #{ids 14319}#) + (#{cvt 15445}# + #{x 15675}# + (#{1+}# #{n 15449}#) + #{ids 16163}#)) + (lambda (#{x 16164}# #{ids 16165}#) (call-with-values (lambda () - (#{v-reverse 13768}# - #{ys 14316}#)) - (lambda (#{ys 14352}# #{e 14353}#) + (#{v-reverse 15444}# + #{ys 16162}#)) + (lambda (#{ys 16201}# #{e 16202}#) (values (vector 'each+ - #{x 14318}# - #{ys 14352}# - #{e 14353}#) - #{ids 14319}#)))))))) - #{tmp 14205}#) - (let ((#{tmp 14354}# - ($sc-dispatch #{p 13772}# '(any . any)))) - (if #{tmp 14354}# + #{x 16164}# + #{ys 16201}# + #{e 16202}#) + #{ids 16165}#)))))))) + #{tmp 15630}#) + (let ((#{tmp 16203}# + ($sc-dispatch #{p 15448}# '(any . any)))) + (if #{tmp 16203}# (@apply - (lambda (#{x 14358}# #{y 14359}#) + (lambda (#{x 16207}# #{y 16208}#) (call-with-values (lambda () - (#{cvt 13769}# - #{y 14359}# - #{n 13773}# - #{ids 13774}#)) - (lambda (#{y 14360}# #{ids 14361}#) + (#{cvt 15445}# + #{y 16208}# + #{n 15449}# + #{ids 15450}#)) + (lambda (#{y 16209}# #{ids 16210}#) (call-with-values (lambda () - (#{cvt 13769}# - #{x 14358}# - #{n 13773}# - #{ids 14361}#)) - (lambda (#{x 14362}# #{ids 14363}#) + (#{cvt 15445}# + #{x 16207}# + #{n 15449}# + #{ids 16210}#)) + (lambda (#{x 16211}# #{ids 16212}#) (values - (cons #{x 14362}# #{y 14360}#) - #{ids 14363}#)))))) - #{tmp 14354}#) - (let ((#{tmp 14364}# - ($sc-dispatch #{p 13772}# '()))) - (if #{tmp 14364}# + (cons #{x 16211}# #{y 16209}#) + #{ids 16212}#)))))) + #{tmp 16203}#) + (let ((#{tmp 16213}# + ($sc-dispatch #{p 15448}# '()))) + (if #{tmp 16213}# (@apply - (lambda () (values '() #{ids 13774}#)) - #{tmp 14364}#) - (let ((#{tmp 14368}# + (lambda () (values '() #{ids 15450}#)) + #{tmp 16213}#) + (let ((#{tmp 16217}# ($sc-dispatch - #{p 13772}# + #{p 15448}# '#(vector each-any)))) - (if #{tmp 14368}# + (if #{tmp 16217}# (@apply - (lambda (#{x 14372}#) + (lambda (#{x 16221}#) (call-with-values (lambda () - (#{cvt 13769}# - #{x 14372}# - #{n 13773}# - #{ids 13774}#)) - (lambda (#{p 14373}# - #{ids 14374}#) + (#{cvt 15445}# + #{x 16221}# + #{n 15449}# + #{ids 15450}#)) + (lambda (#{p 16222}# + #{ids 16223}#) (values (vector 'vector - #{p 14373}#) - #{ids 14374}#)))) - #{tmp 14368}#) + #{p 16222}#) + #{ids 16223}#)))) + #{tmp 16217}#) (values (vector 'atom - (#{strip 4346}# - #{p 13772}# + (#{strip 4456}# + #{p 15448}# '(()))) - #{ids 13774}#))))))))))))))) - (#{cvt 13769}# #{pattern 13765}# 0 '())))) - (#{build-dispatch-call 12143}# - (lambda (#{pvars 14484}# - #{exp 14485}# - #{y 14486}# - #{r 14487}# - #{mod 14488}#) - (let ((#{ids 14489}# (map car #{pvars 14484}#))) + #{ids 15450}#))))))))))))))) + (#{cvt 15445}# #{pattern 15441}# 0 '())))) + (#{build-dispatch-call 13786}# + (lambda (#{pvars 16357}# + #{exp 16358}# + #{y 16359}# + #{r 16360}# + #{mod 16361}#) + (let ((#{ids 16362}# (map car #{pvars 16357}#))) (begin - (map cdr #{pvars 14484}#) - (let ((#{labels 14491}# - (#{gen-labels 4304}# #{ids 14489}#)) - (#{new-vars 14492}# - (map #{gen-var 4347}# #{ids 14489}#))) - (#{build-application 4268}# + (map cdr #{pvars 16357}#) + (let ((#{labels 16364}# + (#{gen-labels 4413}# #{ids 16362}#)) + (#{new-vars 16365}# + (map #{gen-var 4457}# #{ids 16362}#))) + (#{build-primcall 4389}# #f - (if (equal? (module-name (current-module)) '(guile)) - (make-struct/no-tail - (vector-ref %expanded-vtables 7) - #f - 'apply) - (make-struct/no-tail - (vector-ref %expanded-vtables 5) - #f - '(guile) - 'apply - #f)) - (list (#{build-simple-lambda 4277}# + 'apply + (list (#{build-simple-lambda 4386}# #f - (map syntax->datum #{ids 14489}#) + (map syntax->datum #{ids 16362}#) #f - #{new-vars 14492}# + #{new-vars 16365}# '() - (#{expand 4333}# - #{exp 14485}# - (#{extend-env 4295}# - #{labels 14491}# - (map (lambda (#{var 14817}# #{level 14818}#) + (#{expand 4443}# + #{exp 16358}# + (#{extend-env 4405}# + #{labels 16364}# + (map (lambda (#{var 16697}# #{level 16698}#) (cons 'syntax - (cons #{var 14817}# - #{level 14818}#))) - #{new-vars 14492}# - (map cdr #{pvars 14484}#)) - #{r 14487}#) - (#{make-binding-wrap 4315}# - #{ids 14489}# - #{labels 14491}# + (cons #{var 16697}# + #{level 16698}#))) + #{new-vars 16365}# + (map cdr #{pvars 16357}#)) + #{r 16360}#) + (#{make-binding-wrap 4424}# + #{ids 16362}# + #{labels 16364}# '(())) - #{mod 14488}#)) - #{y 14486}#))))))) - (#{gen-clause 12144}# - (lambda (#{x 13126}# - #{keys 13127}# - #{clauses 13128}# - #{r 13129}# - #{pat 13130}# - #{fender 13131}# - #{exp 13132}# - #{mod 13133}#) + #{mod 16361}#)) + #{y 16359}#))))))) + (#{gen-clause 13787}# + (lambda (#{x 15035}# + #{keys 15036}# + #{clauses 15037}# + #{r 15038}# + #{pat 15039}# + #{fender 15040}# + #{exp 15041}# + #{mod 15042}#) (call-with-values (lambda () - (#{convert-pattern 12142}# - #{pat 13130}# - #{keys 13127}#)) - (lambda (#{p 13288}# #{pvars 13289}#) - (if (not (#{distinct-bound-ids? 4324}# - (map car #{pvars 13289}#))) + (#{convert-pattern 13785}# + #{pat 15039}# + #{keys 15036}#)) + (lambda (#{p 15180}# #{pvars 15181}#) + (if (not (#{distinct-bound-ids? 4434}# + (map car #{pvars 15181}#))) (syntax-violation 'syntax-case "duplicate pattern variable" - #{pat 13130}#) + #{pat 15039}#) (if (not (and-map - (lambda (#{x 13409}#) - (not (let ((#{x 13413}# (car #{x 13409}#))) - (if (if (if (vector? #{x 13413}#) + (lambda (#{x 15290}#) + (not (let ((#{x 15294}# (car #{x 15290}#))) + (if (if (if (vector? #{x 15294}#) (if (= (vector-length - #{x 13413}#) + #{x 15294}#) 4) (eq? (vector-ref - #{x 13413}# + #{x 15294}# 0) 'syntax-object) #f) #f) (symbol? - (vector-ref #{x 13413}# 1)) + (vector-ref #{x 15294}# 1)) #f) - (if (eq? (if (if (vector? #{x 13413}#) - (if (= (vector-length - #{x 13413}#) - 4) - (eq? (vector-ref - #{x 13413}# - 0) - 'syntax-object) - #f) - #f) - (vector-ref #{x 13413}# 1) - #{x 13413}#) - (if (if (= (vector-length - '#(syntax-object - ... - ((top) - #(ribcage - () - () - ()) - #(ribcage - () - () - ()) - #(ribcage - #(x) - #((top)) - #("i2218")) - #(ribcage - (lambda-var-list - gen-var - strip - expand-lambda-case - lambda*-formals - expand-simple-lambda - lambda-formals - ellipsis? - expand-void - eval-local-transformer - expand-local-syntax - expand-body - expand-macro - expand-application - expand-expr - expand - syntax-type - parse-when-list - expand-install-global - expand-top-sequence - expand-sequence - source-wrap - wrap - bound-id-member? - distinct-bound-ids? - valid-bound-ids? - bound-id=? - free-id=? - id-var-name - same-marks? - join-marks - join-wraps - smart-append - make-binding-wrap - extend-ribcage! - make-empty-ribcage - new-mark - anti-mark - the-anti-mark - top-marked? - top-wrap - empty-wrap - set-ribcage-labels! - set-ribcage-marks! - set-ribcage-symnames! - ribcage-labels - ribcage-marks - ribcage-symnames - ribcage? - make-ribcage - gen-labels - gen-label - make-rename - rename-marks - rename-new - rename-old - subst-rename? - wrap-subst - wrap-marks - make-wrap - id-sym-name&marks - id-sym-name - id? - nonsymbol-id? - global-extend - lookup - macros-only-env - extend-var-env - extend-env - null-env - binding-value - binding-type - make-binding - arg-check - source-annotation - no-source - set-syntax-object-module! - set-syntax-object-wrap! - set-syntax-object-expression! - syntax-object-module - syntax-object-wrap - syntax-object-expression - syntax-object? - make-syntax-object - build-lexical-var - build-letrec - build-named-let - build-let - build-sequence - build-data - build-primref - build-lambda-case - build-case-lambda - build-simple-lambda - build-global-definition - build-global-assignment - build-global-reference - analyze-variable - build-lexical-assignment - build-lexical-reference - build-dynlet - build-conditional - build-application - build-void - maybe-name-value! - decorate-source - get-global-definition-hook - put-global-definition-hook - gensym-hook - local-eval-hook - top-level-eval-hook - fx< - fx= - fx- - fx+ - set-lambda-meta! - lambda-meta - lambda? - make-dynlet - make-letrec - make-let - make-lambda-case - make-lambda - make-sequence - make-application - make-conditional - make-toplevel-define - make-toplevel-set - make-toplevel-ref - make-module-set - make-module-ref - make-lexical-set - make-lexical-ref - make-primitive-ref - make-const - make-void) - ((top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top)) - ("i467" - "i465" - "i463" - "i461" - "i459" - "i457" - "i455" - "i453" - "i451" - "i449" - "i447" - "i445" - "i443" - "i441" - "i439" - "i437" - "i435" - "i433" - "i431" - "i429" - "i427" - "i425" - "i423" - "i421" - "i419" - "i417" - "i415" - "i413" - "i411" - "i409" - "i407" - "i405" - "i403" - "i401" - "i399" - "i398" - "i396" - "i393" - "i392" - "i391" - "i389" - "i388" - "i386" - "i384" - "i382" - "i380" - "i378" - "i376" - "i374" - "i372" - "i369" - "i367" - "i366" - "i364" - "i362" - "i360" - "i358" - "i357" - "i356" - "i355" - "i353" - "i352" - "i349" - "i347" - "i345" - "i343" - "i341" - "i339" - "i337" - "i336" - "i335" - "i333" - "i331" - "i330" - "i327" - "i326" - "i324" - "i322" - "i320" - "i318" - "i316" - "i314" - "i312" - "i310" - "i308" - "i305" - "i303" - "i301" - "i299" - "i297" - "i295" - "i293" - "i291" - "i289" - "i287" - "i285" - "i283" - "i281" - "i279" - "i277" - "i275" - "i273" - "i271" - "i269" - "i267" - "i265" - "i263" - "i261" - "i260" - "i257" - "i255" - "i254" - "i253" - "i252" - "i251" - "i249" - "i247" - "i245" - "i242" - "i240" - "i238" - "i236" - "i234" - "i232" - "i230" - "i228" - "i226" - "i224" - "i222" - "i220" - "i218" - "i216" - "i214" - "i212" - "i210" - "i208")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) - (top) - (top)) - ("i46" - "i45" - "i44"))) - (hygiene - guile))) - 4) - #t - #f) - '... - '#(syntax-object - ... - ((top) - #(ribcage () () ()) - #(ribcage () () ()) - #(ribcage - #(x) - #((top)) - #("i2218")) - #(ribcage - (lambda-var-list - gen-var - strip - expand-lambda-case - lambda*-formals - expand-simple-lambda - lambda-formals - ellipsis? - expand-void - eval-local-transformer - expand-local-syntax - expand-body - expand-macro - expand-application - expand-expr - expand - syntax-type - parse-when-list - expand-install-global - expand-top-sequence - expand-sequence - source-wrap - wrap - bound-id-member? - distinct-bound-ids? - valid-bound-ids? - bound-id=? - free-id=? - id-var-name - same-marks? - join-marks - join-wraps - smart-append - make-binding-wrap - extend-ribcage! - make-empty-ribcage - new-mark - anti-mark - the-anti-mark - top-marked? - top-wrap - empty-wrap - set-ribcage-labels! - set-ribcage-marks! - set-ribcage-symnames! - ribcage-labels - ribcage-marks - ribcage-symnames - ribcage? - make-ribcage - gen-labels - gen-label - make-rename - rename-marks - rename-new - rename-old - subst-rename? - wrap-subst - wrap-marks - make-wrap - id-sym-name&marks - id-sym-name - id? - nonsymbol-id? - global-extend - lookup - macros-only-env - extend-var-env - extend-env - null-env - binding-value - binding-type - make-binding - arg-check - source-annotation - no-source - set-syntax-object-module! - set-syntax-object-wrap! - set-syntax-object-expression! - syntax-object-module - syntax-object-wrap - syntax-object-expression - syntax-object? - make-syntax-object - build-lexical-var - build-letrec - build-named-let - build-let - build-sequence - build-data - build-primref - build-lambda-case - build-case-lambda - build-simple-lambda - build-global-definition - build-global-assignment - build-global-reference - analyze-variable - build-lexical-assignment - build-lexical-reference - build-dynlet - build-conditional - build-application - build-void - maybe-name-value! - decorate-source - get-global-definition-hook - put-global-definition-hook - gensym-hook - local-eval-hook - top-level-eval-hook - fx< - fx= - fx- - fx+ - set-lambda-meta! - lambda-meta - lambda? - make-dynlet - make-letrec - make-let - make-lambda-case - make-lambda - make-sequence - make-application - make-conditional - make-toplevel-define - make-toplevel-set - make-toplevel-ref - make-module-set - make-module-ref - make-lexical-set - make-lexical-ref - make-primitive-ref - make-const - make-void) - ((top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top)) - ("i467" - "i465" - "i463" - "i461" - "i459" - "i457" - "i455" - "i453" - "i451" - "i449" - "i447" - "i445" - "i443" - "i441" - "i439" - "i437" - "i435" - "i433" - "i431" - "i429" - "i427" - "i425" - "i423" - "i421" - "i419" - "i417" - "i415" - "i413" - "i411" - "i409" - "i407" - "i405" - "i403" - "i401" - "i399" - "i398" - "i396" - "i393" - "i392" - "i391" - "i389" - "i388" - "i386" - "i384" - "i382" - "i380" - "i378" - "i376" - "i374" - "i372" - "i369" - "i367" - "i366" - "i364" - "i362" - "i360" - "i358" - "i357" - "i356" - "i355" - "i353" - "i352" - "i349" - "i347" - "i345" - "i343" - "i341" - "i339" - "i337" - "i336" - "i335" - "i333" - "i331" - "i330" - "i327" - "i326" - "i324" - "i322" - "i320" - "i318" - "i316" - "i314" - "i312" - "i310" - "i308" - "i305" - "i303" - "i301" - "i299" - "i297" - "i295" - "i293" - "i291" - "i289" - "i287" - "i285" - "i283" - "i281" - "i279" - "i277" - "i275" - "i273" - "i271" - "i269" - "i267" - "i265" - "i263" - "i261" - "i260" - "i257" - "i255" - "i254" - "i253" - "i252" - "i251" - "i249" - "i247" - "i245" - "i242" - "i240" - "i238" - "i236" - "i234" - "i232" - "i230" - "i228" - "i226" - "i224" - "i222" - "i220" - "i218" - "i216" - "i214" - "i212" - "i210" - "i208")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("i46" "i45" "i44"))) - (hygiene guile)))) - (eq? (#{id-var-name 4320}# - #{x 13413}# - '(())) - (#{id-var-name 4320}# - '#(syntax-object - ... - ((top) - #(ribcage () () ()) - #(ribcage () () ()) - #(ribcage - #(x) - #((top)) - #("i2218")) - #(ribcage - (lambda-var-list - gen-var - strip - expand-lambda-case - lambda*-formals - expand-simple-lambda - lambda-formals - ellipsis? - expand-void - eval-local-transformer - expand-local-syntax - expand-body - expand-macro - expand-application - expand-expr - expand - syntax-type - parse-when-list - expand-install-global - expand-top-sequence - expand-sequence - source-wrap - wrap - bound-id-member? - distinct-bound-ids? - valid-bound-ids? - bound-id=? - free-id=? - id-var-name - same-marks? - join-marks - join-wraps - smart-append - make-binding-wrap - extend-ribcage! - make-empty-ribcage - new-mark - anti-mark - the-anti-mark - top-marked? - top-wrap - empty-wrap - set-ribcage-labels! - set-ribcage-marks! - set-ribcage-symnames! - ribcage-labels - ribcage-marks - ribcage-symnames - ribcage? - make-ribcage - gen-labels - gen-label - make-rename - rename-marks - rename-new - rename-old - subst-rename? - wrap-subst - wrap-marks - make-wrap - id-sym-name&marks - id-sym-name - id? - nonsymbol-id? - global-extend - lookup - macros-only-env - extend-var-env - extend-env - null-env - binding-value - binding-type - make-binding - arg-check - source-annotation - no-source - set-syntax-object-module! - set-syntax-object-wrap! - set-syntax-object-expression! - syntax-object-module - syntax-object-wrap - syntax-object-expression - syntax-object? - make-syntax-object - build-lexical-var - build-letrec - build-named-let - build-let - build-sequence - build-data - build-primref - build-lambda-case - build-case-lambda - build-simple-lambda - build-global-definition - build-global-assignment - build-global-reference - analyze-variable - build-lexical-assignment - build-lexical-reference - build-dynlet - build-conditional - build-application - build-void - maybe-name-value! - decorate-source - get-global-definition-hook - put-global-definition-hook - gensym-hook - local-eval-hook - top-level-eval-hook - fx< - fx= - fx- - fx+ - set-lambda-meta! - lambda-meta - lambda? - make-dynlet - make-letrec - make-let - make-lambda-case - make-lambda - make-sequence - make-application - make-conditional - make-toplevel-define - make-toplevel-set - make-toplevel-ref - make-module-set - make-module-ref - make-lexical-set - make-lexical-ref - make-primitive-ref - make-const - make-void) - ((top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top)) - ("i467" - "i465" - "i463" - "i461" - "i459" - "i457" - "i455" - "i453" - "i451" - "i449" - "i447" - "i445" - "i443" - "i441" - "i439" - "i437" - "i435" - "i433" - "i431" - "i429" - "i427" - "i425" - "i423" - "i421" - "i419" - "i417" - "i415" - "i413" - "i411" - "i409" - "i407" - "i405" - "i403" - "i401" - "i399" - "i398" - "i396" - "i393" - "i392" - "i391" - "i389" - "i388" - "i386" - "i384" - "i382" - "i380" - "i378" - "i376" - "i374" - "i372" - "i369" - "i367" - "i366" - "i364" - "i362" - "i360" - "i358" - "i357" - "i356" - "i355" - "i353" - "i352" - "i349" - "i347" - "i345" - "i343" - "i341" - "i339" - "i337" - "i336" - "i335" - "i333" - "i331" - "i330" - "i327" - "i326" - "i324" - "i322" - "i320" - "i318" - "i316" - "i314" - "i312" - "i310" - "i308" - "i305" - "i303" - "i301" - "i299" - "i297" - "i295" - "i293" - "i291" - "i289" - "i287" - "i285" - "i283" - "i281" - "i279" - "i277" - "i275" - "i273" - "i271" - "i269" - "i267" - "i265" - "i263" - "i261" - "i260" - "i257" - "i255" - "i254" - "i253" - "i252" - "i251" - "i249" - "i247" - "i245" - "i242" - "i240" - "i238" - "i236" - "i234" - "i232" - "i230" - "i228" - "i226" - "i224" - "i222" - "i220" - "i218" - "i216" - "i214" - "i212" - "i210" - "i208")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("i46" "i45" "i44"))) - (hygiene guile)) - '(()))) - #f) + (#{free-id=? 4431}# + #{x 15294}# + '#(syntax-object + ... + ((top) + #(ribcage () () ()) + #(ribcage () () ()) + #(ribcage + #(x) + #((top)) + #("i2338")) + #(ribcage + (lambda-var-list + gen-var + strip + expand-lambda-case + lambda*-formals + expand-simple-lambda + lambda-formals + ellipsis? + expand-void + eval-local-transformer + expand-local-syntax + expand-body + expand-macro + expand-call + expand-expr + expand + syntax-type + parse-when-list + expand-install-global + expand-top-sequence + expand-sequence + source-wrap + wrap + bound-id-member? + distinct-bound-ids? + valid-bound-ids? + bound-id=? + free-id=? + resolve-identifier + id-var-name + same-marks? + join-marks + join-wraps + smart-append + make-binding-wrap + extend-ribcage! + make-empty-ribcage + new-mark + anti-mark + the-anti-mark + top-marked? + top-wrap + empty-wrap + set-ribcage-labels! + set-ribcage-marks! + set-ribcage-symnames! + ribcage-labels + ribcage-marks + ribcage-symnames + ribcage? + make-ribcage + gen-labels + gen-label + make-rename + rename-marks + rename-new + rename-old + subst-rename? + wrap-subst + wrap-marks + make-wrap + id-sym-name&marks + id-sym-name + id? + nonsymbol-id? + global-extend + macros-only-env + extend-var-env + extend-env + null-env + binding-value + binding-type + make-binding + arg-check + source-annotation + no-source + set-syntax-object-module! + set-syntax-object-wrap! + set-syntax-object-expression! + syntax-object-module + syntax-object-wrap + syntax-object-expression + syntax-object? + make-syntax-object + build-lexical-var + build-letrec + build-named-let + build-let + build-sequence + build-data + build-primref + build-primcall + build-lambda-case + build-case-lambda + build-simple-lambda + build-global-definition + build-global-assignment + build-global-reference + analyze-variable + build-lexical-assignment + build-lexical-reference + build-dynlet + build-conditional + build-call + build-void + maybe-name-value! + decorate-source + get-global-definition-hook + put-global-definition-hook + gensym-hook + local-eval-hook + top-level-eval-hook + fx< + fx= + fx- + fx+ + set-lambda-meta! + lambda-meta + lambda? + make-dynlet + make-letrec + make-let + make-lambda-case + make-lambda + make-seq + make-primcall + make-call + make-conditional + make-toplevel-define + make-toplevel-set + make-toplevel-ref + make-module-set + make-module-ref + make-lexical-set + make-lexical-ref + make-primitive-ref + make-const + make-void) + ((top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top)) + ("i471" + "i469" + "i467" + "i465" + "i463" + "i461" + "i459" + "i457" + "i455" + "i453" + "i451" + "i449" + "i447" + "i445" + "i443" + "i441" + "i439" + "i437" + "i435" + "i433" + "i431" + "i429" + "i427" + "i425" + "i423" + "i421" + "i419" + "i417" + "i415" + "i413" + "i411" + "i409" + "i407" + "i405" + "i403" + "i401" + "i400" + "i398" + "i395" + "i394" + "i393" + "i391" + "i390" + "i388" + "i386" + "i384" + "i382" + "i380" + "i378" + "i376" + "i374" + "i371" + "i369" + "i368" + "i366" + "i364" + "i362" + "i360" + "i359" + "i358" + "i357" + "i355" + "i354" + "i351" + "i349" + "i347" + "i345" + "i343" + "i341" + "i340" + "i339" + "i337" + "i335" + "i334" + "i331" + "i330" + "i328" + "i326" + "i324" + "i322" + "i320" + "i318" + "i316" + "i314" + "i312" + "i309" + "i307" + "i305" + "i303" + "i301" + "i299" + "i297" + "i295" + "i293" + "i291" + "i289" + "i287" + "i285" + "i283" + "i281" + "i279" + "i277" + "i275" + "i273" + "i271" + "i269" + "i267" + "i265" + "i263" + "i262" + "i259" + "i257" + "i256" + "i255" + "i254" + "i253" + "i251" + "i249" + "i247" + "i244" + "i242" + "i240" + "i238" + "i236" + "i234" + "i232" + "i230" + "i228" + "i226" + "i224" + "i222" + "i220" + "i218" + "i216" + "i214" + "i212" + "i210" + "i208")) + #(ribcage + (define-structure + define-expansion-accessors + define-expansion-constructors) + ((top) (top) (top)) + ("i46" "i45" "i44")) + #(ribcage () () ())) + (hygiene guile))) #f)))) - #{pvars 13289}#)) + #{pvars 15181}#)) (syntax-violation 'syntax-case "misplaced ellipsis" - #{pat 13130}#) - (let ((#{y 13489}# + #{pat 15039}#) + (let ((#{y 15319}# (gensym (string-append (symbol->string 'tmp) " ")))) - (#{build-application 4268}# - #f - (let ((#{req 13639}# (list 'tmp)) - (#{vars 13641}# (list #{y 13489}#)) - (#{exp 13643}# - (let ((#{y 13660}# - (make-struct/no-tail - (vector-ref %expanded-vtables 3) - #f - 'tmp - #{y 13489}#))) - (let ((#{test-exp 13664}# - (let ((#{tmp 13673}# - ($sc-dispatch - #{fender 13131}# - '#(atom #t)))) - (if #{tmp 13673}# - (@apply - (lambda () #{y 13660}#) - #{tmp 13673}#) - (let ((#{then-exp 13691}# - (#{build-dispatch-call 12143}# - #{pvars 13289}# - #{fender 13131}# - #{y 13660}# - #{r 13129}# - #{mod 13133}#)) - (#{else-exp 13692}# + (let ((#{fun-exp 15324}# + (let ((#{req 15333}# (list 'tmp)) + (#{vars 15335}# (list #{y 15319}#)) + (#{exp 15337}# + (let ((#{y 15366}# + (make-struct/no-tail + (vector-ref + %expanded-vtables + 3) + #f + 'tmp + #{y 15319}#))) + (let ((#{test-exp 15370}# + (let ((#{tmp 15379}# + ($sc-dispatch + #{fender 15040}# + '#(atom #t)))) + (if #{tmp 15379}# + (@apply + (lambda () #{y 15366}#) + #{tmp 15379}#) + (let ((#{then-exp 15397}# + (#{build-dispatch-call 13786}# + #{pvars 15181}# + #{fender 15040}# + #{y 15366}# + #{r 15038}# + #{mod 15042}#)) + (#{else-exp 15398}# + (make-struct/no-tail + (vector-ref + %expanded-vtables + 1) + #f + #f))) (make-struct/no-tail (vector-ref %expanded-vtables - 1) + 10) #f - #f))) - (make-struct/no-tail - (vector-ref - %expanded-vtables - 10) - #f - #{y 13660}# - #{then-exp 13691}# - #{else-exp 13692}#))))) - (#{then-exp 13665}# - (#{build-dispatch-call 12143}# - #{pvars 13289}# - #{exp 13132}# - #{y 13660}# - #{r 13129}# - #{mod 13133}#)) - (#{else-exp 13666}# - (#{gen-syntax-case 12145}# - #{x 13126}# - #{keys 13127}# - #{clauses 13128}# - #{r 13129}# - #{mod 13133}#))) - (make-struct/no-tail - (vector-ref %expanded-vtables 10) - #f - #{test-exp 13664}# - #{then-exp 13665}# - #{else-exp 13666}#))))) - (let ((#{body 13648}# - (make-struct/no-tail - (vector-ref %expanded-vtables 14) - #f - #{req 13639}# - #f - #f - #f - '() - #{vars 13641}# - #{exp 13643}# - #f))) - (make-struct/no-tail - (vector-ref %expanded-vtables 13) - #f - '() - #{body 13648}#))) - (list (if (eq? #{p 13288}# 'any) - (let ((#{fun-exp 13714}# - (if (equal? - (module-name (current-module)) - '(guile)) - (make-struct/no-tail - (vector-ref %expanded-vtables 7) - #f - 'list) + #{y 15366}# + #{then-exp 15397}# + #{else-exp 15398}#))))) + (#{then-exp 15371}# + (#{build-dispatch-call 13786}# + #{pvars 15181}# + #{exp 15041}# + #{y 15366}# + #{r 15038}# + #{mod 15042}#)) + (#{else-exp 15372}# + (#{gen-syntax-case 13788}# + #{x 15035}# + #{keys 15036}# + #{clauses 15037}# + #{r 15038}# + #{mod 15042}#))) (make-struct/no-tail - (vector-ref %expanded-vtables 5) + (vector-ref %expanded-vtables 10) #f - '(guile) - 'list - #f))) - (#{arg-exps 13715}# (list #{x 13126}#))) - (make-struct/no-tail - (vector-ref %expanded-vtables 11) - #f - #{fun-exp 13714}# - #{arg-exps 13715}#)) - (let ((#{fun-exp 13738}# - (if (equal? - (module-name (current-module)) - '(guile)) - (make-struct/no-tail - (vector-ref %expanded-vtables 7) - #f - '$sc-dispatch) - (make-struct/no-tail - (vector-ref %expanded-vtables 5) - #f - '(guile) - '$sc-dispatch - #f))) - (#{arg-exps 13739}# - (list #{x 13126}# - (make-struct/no-tail - (vector-ref - %expanded-vtables - 1) - #f - #{p 13288}#)))) + #{test-exp 15370}# + #{then-exp 15371}# + #{else-exp 15372}#))))) + (let ((#{body 15342}# + (make-struct/no-tail + (vector-ref %expanded-vtables 15) + #f + #{req 15333}# + #f + #f + #f + '() + #{vars 15335}# + #{exp 15337}# + #f))) (make-struct/no-tail - (vector-ref %expanded-vtables 11) + (vector-ref %expanded-vtables 14) #f - #{fun-exp 13738}# - #{arg-exps 13739}#)))))))))))) - (#{gen-syntax-case 12145}# - (lambda (#{x 12554}# - #{keys 12555}# - #{clauses 12556}# - #{r 12557}# - #{mod 12558}#) - (if (null? #{clauses 12556}#) - (let ((#{fun-exp 12563}# - (if (equal? (module-name (current-module)) '(guile)) - (make-struct/no-tail - (vector-ref %expanded-vtables 7) - #f - 'syntax-violation) + '() + #{body 15342}#)))) + (#{arg-exps 15325}# + (list (if (eq? #{p 15180}# 'any) + (let ((#{args 15420}# + (list #{x 15035}#))) + (make-struct/no-tail + (vector-ref %expanded-vtables 12) + #f + 'list + #{args 15420}#)) + (let ((#{args 15429}# + (list #{x 15035}# + (make-struct/no-tail + (vector-ref + %expanded-vtables + 1) + #f + #{p 15180}#)))) + (make-struct/no-tail + (vector-ref %expanded-vtables 12) + #f + '$sc-dispatch + #{args 15429}#)))))) (make-struct/no-tail - (vector-ref %expanded-vtables 5) + (vector-ref %expanded-vtables 11) #f - '(guile) - 'syntax-violation - #f))) - (#{arg-exps 12564}# + #{fun-exp 15324}# + #{arg-exps 15325}#))))))))) + (#{gen-syntax-case 13788}# + (lambda (#{x 14532}# + #{keys 14533}# + #{clauses 14534}# + #{r 14535}# + #{mod 14536}#) + (if (null? #{clauses 14534}#) + (let ((#{args 14542}# (list (make-struct/no-tail (vector-ref %expanded-vtables 1) #f @@ -16598,86 +14961,57 @@ (vector-ref %expanded-vtables 1) #f "source expression failed to match any pattern") - #{x 12554}#))) + #{x 14532}#))) (make-struct/no-tail - (vector-ref %expanded-vtables 11) + (vector-ref %expanded-vtables 12) #f - #{fun-exp 12563}# - #{arg-exps 12564}#)) - (let ((#{tmp 12597}# (car #{clauses 12556}#))) - (let ((#{tmp 12598}# - ($sc-dispatch #{tmp 12597}# '(any any)))) - (if #{tmp 12598}# + 'syntax-violation + #{args 14542}#)) + (let ((#{tmp 14561}# (car #{clauses 14534}#))) + (let ((#{tmp 14562}# + ($sc-dispatch #{tmp 14561}# '(any any)))) + (if #{tmp 14562}# (@apply - (lambda (#{pat 12600}# #{exp 12601}#) - (if (if (if (symbol? #{pat 12600}#) + (lambda (#{pat 14564}# #{exp 14565}#) + (if (if (if (symbol? #{pat 14564}#) #t - (if (if (vector? #{pat 12600}#) - (if (= (vector-length #{pat 12600}#) + (if (if (vector? #{pat 14564}#) + (if (= (vector-length #{pat 14564}#) 4) - (eq? (vector-ref #{pat 12600}# 0) + (eq? (vector-ref #{pat 14564}# 0) 'syntax-object) #f) #f) - (symbol? (vector-ref #{pat 12600}# 1)) + (symbol? (vector-ref #{pat 14564}# 1)) #f)) (and-map - (lambda (#{x 12628}#) - (not (if (eq? (if (if (vector? - #{pat 12600}#) - (if (= (vector-length - #{pat 12600}#) - 4) - (eq? (vector-ref - #{pat 12600}# - 0) - 'syntax-object) - #f) - #f) - (vector-ref #{pat 12600}# 1) - #{pat 12600}#) - (if (if (vector? #{x 12628}#) - (if (= (vector-length - #{x 12628}#) - 4) - (eq? (vector-ref - #{x 12628}# - 0) - 'syntax-object) - #f) - #f) - (vector-ref #{x 12628}# 1) - #{x 12628}#)) - (eq? (#{id-var-name 4320}# - #{pat 12600}# - '(())) - (#{id-var-name 4320}# - #{x 12628}# - '(()))) - #f))) + (lambda (#{x 14592}#) + (not (#{free-id=? 4431}# + #{pat 14564}# + #{x 14592}#))) (cons '#(syntax-object ... ((top) #(ribcage #(pat exp) #((top) (top)) - #("i3899" "i3900")) + #("i4007" "i4008")) #(ribcage () () ()) #(ribcage #(x keys clauses r mod) #((top) (top) (top) (top) (top)) - #("i3888" - "i3889" - "i3890" - "i3891" - "i3892")) + #("i3997" + "i3998" + "i3999" + "i4000" + "i4001")) #(ribcage (gen-syntax-case gen-clause build-dispatch-call convert-pattern) ((top) (top) (top) (top)) - ("i3698" "i3696" "i3694" "i3692")) + ("i3810" "i3808" "i3806" "i3804")) #(ribcage (lambda-var-list gen-var @@ -16692,7 +15026,7 @@ expand-local-syntax expand-body expand-macro - expand-application + expand-call expand-expr expand syntax-type @@ -16707,6 +15041,7 @@ valid-bound-ids? bound-id=? free-id=? + resolve-identifier id-var-name same-marks? join-marks @@ -16744,7 +15079,6 @@ id? nonsymbol-id? global-extend - lookup macros-only-env extend-var-env extend-env @@ -16770,6 +15104,7 @@ build-sequence build-data build-primref + build-primcall build-lambda-case build-case-lambda build-simple-lambda @@ -16781,7 +15116,7 @@ build-lexical-reference build-dynlet build-conditional - build-application + build-call build-void maybe-name-value! decorate-source @@ -16802,8 +15137,9 @@ make-let make-lambda-case make-lambda - make-sequence - make-application + make-seq + make-primcall + make-call make-conditional make-toplevel-define make-toplevel-set @@ -16950,8 +15286,12 @@ (top) (top) (top) + (top) + (top) (top)) - ("i467" + ("i471" + "i469" + "i467" "i465" "i463" "i461" @@ -16985,13 +15325,13 @@ "i405" "i403" "i401" - "i399" + "i400" "i398" - "i396" + "i395" + "i394" "i393" - "i392" "i391" - "i389" + "i390" "i388" "i386" "i384" @@ -17000,32 +15340,32 @@ "i378" "i376" "i374" - "i372" + "i371" "i369" - "i367" + "i368" "i366" "i364" "i362" "i360" + "i359" "i358" "i357" - "i356" "i355" - "i353" - "i352" + "i354" + "i351" "i349" "i347" "i345" "i343" "i341" + "i340" "i339" "i337" - "i336" "i335" - "i333" + "i334" "i331" "i330" - "i327" + "i328" "i326" "i324" "i322" @@ -17034,8 +15374,8 @@ "i316" "i314" "i312" - "i310" - "i308" + "i309" + "i307" "i305" "i303" "i301" @@ -17058,17 +15398,17 @@ "i267" "i265" "i263" - "i261" - "i260" + "i262" + "i259" "i257" + "i256" "i255" "i254" "i253" - "i252" "i251" "i249" "i247" - "i245" + "i244" "i242" "i240" "i238" @@ -17092,4724 +15432,2297 @@ define-expansion-accessors define-expansion-constructors) ((top) (top) (top)) - ("i46" "i45" "i44"))) + ("i46" "i45" "i44")) + #(ribcage () () ())) (hygiene guile)) - #{keys 12555}#)) + #{keys 14533}#)) #f) - (if (if (eq? (if (if (= (vector-length - '#(syntax-object - pad - ((top) - #(ribcage - #(pat exp) - #((top) (top)) - #("i3899" "i3900")) - #(ribcage () () ()) - #(ribcage - #(x - keys - clauses - r - mod) - #((top) - (top) - (top) - (top) - (top)) - #("i3888" - "i3889" - "i3890" - "i3891" - "i3892")) - #(ribcage - (gen-syntax-case - gen-clause - build-dispatch-call - convert-pattern) - ((top) - (top) - (top) - (top)) - ("i3698" - "i3696" - "i3694" - "i3692")) - #(ribcage - (lambda-var-list - gen-var - strip - expand-lambda-case - lambda*-formals - expand-simple-lambda - lambda-formals - ellipsis? - expand-void - eval-local-transformer - expand-local-syntax - expand-body - expand-macro - expand-application - expand-expr - expand - syntax-type - parse-when-list - expand-install-global - expand-top-sequence - expand-sequence - source-wrap - wrap - bound-id-member? - distinct-bound-ids? - valid-bound-ids? - bound-id=? - free-id=? - id-var-name - same-marks? - join-marks - join-wraps - smart-append - make-binding-wrap - extend-ribcage! - make-empty-ribcage - new-mark - anti-mark - the-anti-mark - top-marked? - top-wrap - empty-wrap - set-ribcage-labels! - set-ribcage-marks! - set-ribcage-symnames! - ribcage-labels - ribcage-marks - ribcage-symnames - ribcage? - make-ribcage - gen-labels - gen-label - make-rename - rename-marks - rename-new - rename-old - subst-rename? - wrap-subst - wrap-marks - make-wrap - id-sym-name&marks - id-sym-name - id? - nonsymbol-id? - global-extend - lookup - macros-only-env - extend-var-env - extend-env - null-env - binding-value - binding-type - make-binding - arg-check - source-annotation - no-source - set-syntax-object-module! - set-syntax-object-wrap! - set-syntax-object-expression! - syntax-object-module - syntax-object-wrap - syntax-object-expression - syntax-object? - make-syntax-object - build-lexical-var - build-letrec - build-named-let - build-let - build-sequence - build-data - build-primref - build-lambda-case - build-case-lambda - build-simple-lambda - build-global-definition - build-global-assignment - build-global-reference - analyze-variable - build-lexical-assignment - build-lexical-reference - build-dynlet - build-conditional - build-application - build-void - maybe-name-value! - decorate-source - get-global-definition-hook - put-global-definition-hook - gensym-hook - local-eval-hook - top-level-eval-hook - fx< - fx= - fx- - fx+ - set-lambda-meta! - lambda-meta - lambda? - make-dynlet - make-letrec - make-let - make-lambda-case - make-lambda - make-sequence - make-application - make-conditional - make-toplevel-define - make-toplevel-set - make-toplevel-ref - make-module-set - make-module-ref - make-lexical-set - make-lexical-ref - make-primitive-ref - make-const - make-void) - ((top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top)) - ("i467" - "i465" - "i463" - "i461" - "i459" - "i457" - "i455" - "i453" - "i451" - "i449" - "i447" - "i445" - "i443" - "i441" - "i439" - "i437" - "i435" - "i433" - "i431" - "i429" - "i427" - "i425" - "i423" - "i421" - "i419" - "i417" - "i415" - "i413" - "i411" - "i409" - "i407" - "i405" - "i403" - "i401" - "i399" - "i398" - "i396" - "i393" - "i392" - "i391" - "i389" - "i388" - "i386" - "i384" - "i382" - "i380" - "i378" - "i376" - "i374" - "i372" - "i369" - "i367" - "i366" - "i364" - "i362" - "i360" - "i358" - "i357" - "i356" - "i355" - "i353" - "i352" - "i349" - "i347" - "i345" - "i343" - "i341" - "i339" - "i337" - "i336" - "i335" - "i333" - "i331" - "i330" - "i327" - "i326" - "i324" - "i322" - "i320" - "i318" - "i316" - "i314" - "i312" - "i310" - "i308" - "i305" - "i303" - "i301" - "i299" - "i297" - "i295" - "i293" - "i291" - "i289" - "i287" - "i285" - "i283" - "i281" - "i279" - "i277" - "i275" - "i273" - "i271" - "i269" - "i267" - "i265" - "i263" - "i261" - "i260" - "i257" - "i255" - "i254" - "i253" - "i252" - "i251" - "i249" - "i247" - "i245" - "i242" - "i240" - "i238" - "i236" - "i234" - "i232" - "i230" - "i228" - "i226" - "i224" - "i222" - "i220" - "i218" - "i216" - "i214" - "i212" - "i210" - "i208")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("i46" - "i45" - "i44"))) - (hygiene guile))) - 4) - #t - #f) - 'pad - '#(syntax-object - pad - ((top) - #(ribcage - #(pat exp) - #((top) (top)) - #("i3899" "i3900")) - #(ribcage () () ()) - #(ribcage - #(x keys clauses r mod) - #((top) - (top) - (top) - (top) - (top)) - #("i3888" - "i3889" - "i3890" - "i3891" - "i3892")) - #(ribcage - (gen-syntax-case - gen-clause - build-dispatch-call - convert-pattern) - ((top) (top) (top) (top)) - ("i3698" - "i3696" - "i3694" - "i3692")) - #(ribcage - (lambda-var-list - gen-var - strip - expand-lambda-case - lambda*-formals - expand-simple-lambda - lambda-formals - ellipsis? - expand-void - eval-local-transformer - expand-local-syntax - expand-body - expand-macro - expand-application - expand-expr - expand - syntax-type - parse-when-list - expand-install-global - expand-top-sequence - expand-sequence - source-wrap - wrap - bound-id-member? - distinct-bound-ids? - valid-bound-ids? - bound-id=? - free-id=? - id-var-name - same-marks? - join-marks - join-wraps - smart-append - make-binding-wrap - extend-ribcage! - make-empty-ribcage - new-mark - anti-mark - the-anti-mark - top-marked? - top-wrap - empty-wrap - set-ribcage-labels! - set-ribcage-marks! - set-ribcage-symnames! - ribcage-labels - ribcage-marks - ribcage-symnames - ribcage? - make-ribcage - gen-labels - gen-label - make-rename - rename-marks - rename-new - rename-old - subst-rename? - wrap-subst - wrap-marks - make-wrap - id-sym-name&marks - id-sym-name - id? - nonsymbol-id? - global-extend - lookup - macros-only-env - extend-var-env - extend-env - null-env - binding-value - binding-type - make-binding - arg-check - source-annotation - no-source - set-syntax-object-module! - set-syntax-object-wrap! - set-syntax-object-expression! - syntax-object-module - syntax-object-wrap - syntax-object-expression - syntax-object? - make-syntax-object - build-lexical-var - build-letrec - build-named-let - build-let - build-sequence - build-data - build-primref - build-lambda-case - build-case-lambda - build-simple-lambda - build-global-definition - build-global-assignment - build-global-reference - analyze-variable - build-lexical-assignment - build-lexical-reference - build-dynlet - build-conditional - build-application - build-void - maybe-name-value! - decorate-source - get-global-definition-hook - put-global-definition-hook - gensym-hook - local-eval-hook - top-level-eval-hook - fx< - fx= - fx- - fx+ - set-lambda-meta! - lambda-meta - lambda? - make-dynlet - make-letrec - make-let - make-lambda-case - make-lambda - make-sequence - make-application - make-conditional - make-toplevel-define - make-toplevel-set - make-toplevel-ref - make-module-set - make-module-ref - make-lexical-set - make-lexical-ref - make-primitive-ref - make-const - make-void) - ((top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top)) - ("i467" - "i465" - "i463" - "i461" - "i459" - "i457" - "i455" - "i453" - "i451" - "i449" - "i447" - "i445" - "i443" - "i441" - "i439" - "i437" - "i435" - "i433" - "i431" - "i429" - "i427" - "i425" - "i423" - "i421" - "i419" - "i417" - "i415" - "i413" - "i411" - "i409" - "i407" - "i405" - "i403" - "i401" - "i399" - "i398" - "i396" - "i393" - "i392" - "i391" - "i389" - "i388" - "i386" - "i384" - "i382" - "i380" - "i378" - "i376" - "i374" - "i372" - "i369" - "i367" - "i366" - "i364" - "i362" - "i360" - "i358" - "i357" - "i356" - "i355" - "i353" - "i352" - "i349" - "i347" - "i345" - "i343" - "i341" - "i339" - "i337" - "i336" - "i335" - "i333" - "i331" - "i330" - "i327" - "i326" - "i324" - "i322" - "i320" - "i318" - "i316" - "i314" - "i312" - "i310" - "i308" - "i305" - "i303" - "i301" - "i299" - "i297" - "i295" - "i293" - "i291" - "i289" - "i287" - "i285" - "i283" - "i281" - "i279" - "i277" - "i275" - "i273" - "i271" - "i269" - "i267" - "i265" - "i263" - "i261" - "i260" - "i257" - "i255" - "i254" - "i253" - "i252" - "i251" - "i249" - "i247" - "i245" - "i242" - "i240" - "i238" - "i236" - "i234" - "i232" - "i230" - "i228" - "i226" - "i224" - "i222" - "i220" - "i218" - "i216" - "i214" - "i212" - "i210" - "i208")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("i46" "i45" "i44"))) - (hygiene guile))) - (if (if (= (vector-length - '#(syntax-object - _ - ((top) - #(ribcage - #(pat exp) - #((top) (top)) - #("i3899" "i3900")) - #(ribcage () () ()) - #(ribcage - #(x - keys - clauses - r - mod) - #((top) - (top) - (top) - (top) - (top)) - #("i3888" - "i3889" - "i3890" - "i3891" - "i3892")) - #(ribcage - (gen-syntax-case - gen-clause - build-dispatch-call - convert-pattern) - ((top) - (top) - (top) - (top)) - ("i3698" - "i3696" - "i3694" - "i3692")) - #(ribcage - (lambda-var-list - gen-var - strip - expand-lambda-case - lambda*-formals - expand-simple-lambda - lambda-formals - ellipsis? - expand-void - eval-local-transformer - expand-local-syntax - expand-body - expand-macro - expand-application - expand-expr - expand - syntax-type - parse-when-list - expand-install-global - expand-top-sequence - expand-sequence - source-wrap - wrap - bound-id-member? - distinct-bound-ids? - valid-bound-ids? - bound-id=? - free-id=? - id-var-name - same-marks? - join-marks - join-wraps - smart-append - make-binding-wrap - extend-ribcage! - make-empty-ribcage - new-mark - anti-mark - the-anti-mark - top-marked? - top-wrap - empty-wrap - set-ribcage-labels! - set-ribcage-marks! - set-ribcage-symnames! - ribcage-labels - ribcage-marks - ribcage-symnames - ribcage? - make-ribcage - gen-labels - gen-label - make-rename - rename-marks - rename-new - rename-old - subst-rename? - wrap-subst - wrap-marks - make-wrap - id-sym-name&marks - id-sym-name - id? - nonsymbol-id? - global-extend - lookup - macros-only-env - extend-var-env - extend-env - null-env - binding-value - binding-type - make-binding - arg-check - source-annotation - no-source - set-syntax-object-module! - set-syntax-object-wrap! - set-syntax-object-expression! - syntax-object-module - syntax-object-wrap - syntax-object-expression - syntax-object? - make-syntax-object - build-lexical-var - build-letrec - build-named-let - build-let - build-sequence - build-data - build-primref - build-lambda-case - build-case-lambda - build-simple-lambda - build-global-definition - build-global-assignment - build-global-reference - analyze-variable - build-lexical-assignment - build-lexical-reference - build-dynlet - build-conditional - build-application - build-void - maybe-name-value! - decorate-source - get-global-definition-hook - put-global-definition-hook - gensym-hook - local-eval-hook - top-level-eval-hook - fx< - fx= - fx- - fx+ - set-lambda-meta! - lambda-meta - lambda? - make-dynlet - make-letrec - make-let - make-lambda-case - make-lambda - make-sequence - make-application - make-conditional - make-toplevel-define - make-toplevel-set - make-toplevel-ref - make-module-set - make-module-ref - make-lexical-set - make-lexical-ref - make-primitive-ref - make-const - make-void) - ((top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top)) - ("i467" - "i465" - "i463" - "i461" - "i459" - "i457" - "i455" - "i453" - "i451" - "i449" - "i447" - "i445" - "i443" - "i441" - "i439" - "i437" - "i435" - "i433" - "i431" - "i429" - "i427" - "i425" - "i423" - "i421" - "i419" - "i417" - "i415" - "i413" - "i411" - "i409" - "i407" - "i405" - "i403" - "i401" - "i399" - "i398" - "i396" - "i393" - "i392" - "i391" - "i389" - "i388" - "i386" - "i384" - "i382" - "i380" - "i378" - "i376" - "i374" - "i372" - "i369" - "i367" - "i366" - "i364" - "i362" - "i360" - "i358" - "i357" - "i356" - "i355" - "i353" - "i352" - "i349" - "i347" - "i345" - "i343" - "i341" - "i339" - "i337" - "i336" - "i335" - "i333" - "i331" - "i330" - "i327" - "i326" - "i324" - "i322" - "i320" - "i318" - "i316" - "i314" - "i312" - "i310" - "i308" - "i305" - "i303" - "i301" - "i299" - "i297" - "i295" - "i293" - "i291" - "i289" - "i287" - "i285" - "i283" - "i281" - "i279" - "i277" - "i275" - "i273" - "i271" - "i269" - "i267" - "i265" - "i263" - "i261" - "i260" - "i257" - "i255" - "i254" - "i253" - "i252" - "i251" - "i249" - "i247" - "i245" - "i242" - "i240" - "i238" - "i236" - "i234" - "i232" - "i230" - "i228" - "i226" - "i224" - "i222" - "i220" - "i218" - "i216" - "i214" - "i212" - "i210" - "i208")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("i46" - "i45" - "i44"))) - (hygiene guile))) - 4) - #t - #f) - '_ - '#(syntax-object - _ - ((top) - #(ribcage - #(pat exp) - #((top) (top)) - #("i3899" "i3900")) - #(ribcage () () ()) - #(ribcage - #(x keys clauses r mod) - #((top) - (top) - (top) - (top) - (top)) - #("i3888" - "i3889" - "i3890" - "i3891" - "i3892")) - #(ribcage - (gen-syntax-case - gen-clause - build-dispatch-call - convert-pattern) - ((top) (top) (top) (top)) - ("i3698" - "i3696" - "i3694" - "i3692")) - #(ribcage - (lambda-var-list - gen-var - strip - expand-lambda-case - lambda*-formals - expand-simple-lambda - lambda-formals - ellipsis? - expand-void - eval-local-transformer - expand-local-syntax - expand-body - expand-macro - expand-application - expand-expr - expand - syntax-type - parse-when-list - expand-install-global - expand-top-sequence - expand-sequence - source-wrap - wrap - bound-id-member? - distinct-bound-ids? - valid-bound-ids? - bound-id=? - free-id=? - id-var-name - same-marks? - join-marks - join-wraps - smart-append - make-binding-wrap - extend-ribcage! - make-empty-ribcage - new-mark - anti-mark - the-anti-mark - top-marked? - top-wrap - empty-wrap - set-ribcage-labels! - set-ribcage-marks! - set-ribcage-symnames! - ribcage-labels - ribcage-marks - ribcage-symnames - ribcage? - make-ribcage - gen-labels - gen-label - make-rename - rename-marks - rename-new - rename-old - subst-rename? - wrap-subst - wrap-marks - make-wrap - id-sym-name&marks - id-sym-name - id? - nonsymbol-id? - global-extend - lookup - macros-only-env - extend-var-env - extend-env - null-env - binding-value - binding-type - make-binding - arg-check - source-annotation - no-source - set-syntax-object-module! - set-syntax-object-wrap! - set-syntax-object-expression! - syntax-object-module - syntax-object-wrap - syntax-object-expression - syntax-object? - make-syntax-object - build-lexical-var - build-letrec - build-named-let - build-let - build-sequence - build-data - build-primref - build-lambda-case - build-case-lambda - build-simple-lambda - build-global-definition - build-global-assignment - build-global-reference - analyze-variable - build-lexical-assignment - build-lexical-reference - build-dynlet - build-conditional - build-application - build-void - maybe-name-value! - decorate-source - get-global-definition-hook - put-global-definition-hook - gensym-hook - local-eval-hook - top-level-eval-hook - fx< - fx= - fx- - fx+ - set-lambda-meta! - lambda-meta - lambda? - make-dynlet - make-letrec - make-let - make-lambda-case - make-lambda - make-sequence - make-application - make-conditional - make-toplevel-define - make-toplevel-set - make-toplevel-ref - make-module-set - make-module-ref - make-lexical-set - make-lexical-ref - make-primitive-ref - make-const - make-void) - ((top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top)) - ("i467" - "i465" - "i463" - "i461" - "i459" - "i457" - "i455" - "i453" - "i451" - "i449" - "i447" - "i445" - "i443" - "i441" - "i439" - "i437" - "i435" - "i433" - "i431" - "i429" - "i427" - "i425" - "i423" - "i421" - "i419" - "i417" - "i415" - "i413" - "i411" - "i409" - "i407" - "i405" - "i403" - "i401" - "i399" - "i398" - "i396" - "i393" - "i392" - "i391" - "i389" - "i388" - "i386" - "i384" - "i382" - "i380" - "i378" - "i376" - "i374" - "i372" - "i369" - "i367" - "i366" - "i364" - "i362" - "i360" - "i358" - "i357" - "i356" - "i355" - "i353" - "i352" - "i349" - "i347" - "i345" - "i343" - "i341" - "i339" - "i337" - "i336" - "i335" - "i333" - "i331" - "i330" - "i327" - "i326" - "i324" - "i322" - "i320" - "i318" - "i316" - "i314" - "i312" - "i310" - "i308" - "i305" - "i303" - "i301" - "i299" - "i297" - "i295" - "i293" - "i291" - "i289" - "i287" - "i285" - "i283" - "i281" - "i279" - "i277" - "i275" - "i273" - "i271" - "i269" - "i267" - "i265" - "i263" - "i261" - "i260" - "i257" - "i255" - "i254" - "i253" - "i252" - "i251" - "i249" - "i247" - "i245" - "i242" - "i240" - "i238" - "i236" - "i234" - "i232" - "i230" - "i228" - "i226" - "i224" - "i222" - "i220" - "i218" - "i216" - "i214" - "i212" - "i210" - "i208")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("i46" "i45" "i44"))) - (hygiene guile)))) - (eq? (#{id-var-name 4320}# - '#(syntax-object - pad - ((top) - #(ribcage - #(pat exp) - #((top) (top)) - #("i3899" "i3900")) - #(ribcage () () ()) - #(ribcage - #(x keys clauses r mod) - #((top) (top) (top) (top) (top)) - #("i3888" - "i3889" - "i3890" - "i3891" - "i3892")) - #(ribcage - (gen-syntax-case - gen-clause - build-dispatch-call - convert-pattern) - ((top) (top) (top) (top)) - ("i3698" - "i3696" - "i3694" - "i3692")) - #(ribcage - (lambda-var-list - gen-var - strip - expand-lambda-case - lambda*-formals - expand-simple-lambda - lambda-formals - ellipsis? - expand-void - eval-local-transformer - expand-local-syntax - expand-body - expand-macro - expand-application - expand-expr - expand - syntax-type - parse-when-list - expand-install-global - expand-top-sequence - expand-sequence - source-wrap - wrap - bound-id-member? - distinct-bound-ids? - valid-bound-ids? - bound-id=? - free-id=? - id-var-name - same-marks? - join-marks - join-wraps - smart-append - make-binding-wrap - extend-ribcage! - make-empty-ribcage - new-mark - anti-mark - the-anti-mark - top-marked? - top-wrap - empty-wrap - set-ribcage-labels! - set-ribcage-marks! - set-ribcage-symnames! - ribcage-labels - ribcage-marks - ribcage-symnames - ribcage? - make-ribcage - gen-labels - gen-label - make-rename - rename-marks - rename-new - rename-old - subst-rename? - wrap-subst - wrap-marks - make-wrap - id-sym-name&marks - id-sym-name - id? - nonsymbol-id? - global-extend - lookup - macros-only-env - extend-var-env - extend-env - null-env - binding-value - binding-type - make-binding - arg-check - source-annotation - no-source - set-syntax-object-module! - set-syntax-object-wrap! - set-syntax-object-expression! - syntax-object-module - syntax-object-wrap - syntax-object-expression - syntax-object? - make-syntax-object - build-lexical-var - build-letrec - build-named-let - build-let - build-sequence - build-data - build-primref - build-lambda-case - build-case-lambda - build-simple-lambda - build-global-definition - build-global-assignment - build-global-reference - analyze-variable - build-lexical-assignment - build-lexical-reference - build-dynlet - build-conditional - build-application - build-void - maybe-name-value! - decorate-source - get-global-definition-hook - put-global-definition-hook - gensym-hook - local-eval-hook - top-level-eval-hook - fx< - fx= - fx- - fx+ - set-lambda-meta! - lambda-meta - lambda? - make-dynlet - make-letrec - make-let - make-lambda-case - make-lambda - make-sequence - make-application - make-conditional - make-toplevel-define - make-toplevel-set - make-toplevel-ref - make-module-set - make-module-ref - make-lexical-set - make-lexical-ref - make-primitive-ref - make-const - make-void) - ((top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top)) - ("i467" - "i465" - "i463" - "i461" - "i459" - "i457" - "i455" - "i453" - "i451" - "i449" - "i447" - "i445" - "i443" - "i441" - "i439" - "i437" - "i435" - "i433" - "i431" - "i429" - "i427" - "i425" - "i423" - "i421" - "i419" - "i417" - "i415" - "i413" - "i411" - "i409" - "i407" - "i405" - "i403" - "i401" - "i399" - "i398" - "i396" - "i393" - "i392" - "i391" - "i389" - "i388" - "i386" - "i384" - "i382" - "i380" - "i378" - "i376" - "i374" - "i372" - "i369" - "i367" - "i366" - "i364" - "i362" - "i360" - "i358" - "i357" - "i356" - "i355" - "i353" - "i352" - "i349" - "i347" - "i345" - "i343" - "i341" - "i339" - "i337" - "i336" - "i335" - "i333" - "i331" - "i330" - "i327" - "i326" - "i324" - "i322" - "i320" - "i318" - "i316" - "i314" - "i312" - "i310" - "i308" - "i305" - "i303" - "i301" - "i299" - "i297" - "i295" - "i293" - "i291" - "i289" - "i287" - "i285" - "i283" - "i281" - "i279" - "i277" - "i275" - "i273" - "i271" - "i269" - "i267" - "i265" - "i263" - "i261" - "i260" - "i257" - "i255" - "i254" - "i253" - "i252" - "i251" - "i249" - "i247" - "i245" - "i242" - "i240" - "i238" - "i236" - "i234" - "i232" - "i230" - "i228" - "i226" - "i224" - "i222" - "i220" - "i218" - "i216" - "i214" - "i212" - "i210" - "i208")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("i46" "i45" "i44"))) - (hygiene guile)) - '(())) - (#{id-var-name 4320}# - '#(syntax-object - _ - ((top) - #(ribcage - #(pat exp) - #((top) (top)) - #("i3899" "i3900")) - #(ribcage () () ()) - #(ribcage - #(x keys clauses r mod) - #((top) (top) (top) (top) (top)) - #("i3888" - "i3889" - "i3890" - "i3891" - "i3892")) - #(ribcage - (gen-syntax-case - gen-clause - build-dispatch-call - convert-pattern) - ((top) (top) (top) (top)) - ("i3698" - "i3696" - "i3694" - "i3692")) - #(ribcage - (lambda-var-list - gen-var - strip - expand-lambda-case - lambda*-formals - expand-simple-lambda - lambda-formals - ellipsis? - expand-void - eval-local-transformer - expand-local-syntax - expand-body - expand-macro - expand-application - expand-expr - expand - syntax-type - parse-when-list - expand-install-global - expand-top-sequence - expand-sequence - source-wrap - wrap - bound-id-member? - distinct-bound-ids? - valid-bound-ids? - bound-id=? - free-id=? - id-var-name - same-marks? - join-marks - join-wraps - smart-append - make-binding-wrap - extend-ribcage! - make-empty-ribcage - new-mark - anti-mark - the-anti-mark - top-marked? - top-wrap - empty-wrap - set-ribcage-labels! - set-ribcage-marks! - set-ribcage-symnames! - ribcage-labels - ribcage-marks - ribcage-symnames - ribcage? - make-ribcage - gen-labels - gen-label - make-rename - rename-marks - rename-new - rename-old - subst-rename? - wrap-subst - wrap-marks - make-wrap - id-sym-name&marks - id-sym-name - id? - nonsymbol-id? - global-extend - lookup - macros-only-env - extend-var-env - extend-env - null-env - binding-value - binding-type - make-binding - arg-check - source-annotation - no-source - set-syntax-object-module! - set-syntax-object-wrap! - set-syntax-object-expression! - syntax-object-module - syntax-object-wrap - syntax-object-expression - syntax-object? - make-syntax-object - build-lexical-var - build-letrec - build-named-let - build-let - build-sequence - build-data - build-primref - build-lambda-case - build-case-lambda - build-simple-lambda - build-global-definition - build-global-assignment - build-global-reference - analyze-variable - build-lexical-assignment - build-lexical-reference - build-dynlet - build-conditional - build-application - build-void - maybe-name-value! - decorate-source - get-global-definition-hook - put-global-definition-hook - gensym-hook - local-eval-hook - top-level-eval-hook - fx< - fx= - fx- - fx+ - set-lambda-meta! - lambda-meta - lambda? - make-dynlet - make-letrec - make-let - make-lambda-case - make-lambda - make-sequence - make-application - make-conditional - make-toplevel-define - make-toplevel-set - make-toplevel-ref - make-module-set - make-module-ref - make-lexical-set - make-lexical-ref - make-primitive-ref - make-const - make-void) - ((top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top)) - ("i467" - "i465" - "i463" - "i461" - "i459" - "i457" - "i455" - "i453" - "i451" - "i449" - "i447" - "i445" - "i443" - "i441" - "i439" - "i437" - "i435" - "i433" - "i431" - "i429" - "i427" - "i425" - "i423" - "i421" - "i419" - "i417" - "i415" - "i413" - "i411" - "i409" - "i407" - "i405" - "i403" - "i401" - "i399" - "i398" - "i396" - "i393" - "i392" - "i391" - "i389" - "i388" - "i386" - "i384" - "i382" - "i380" - "i378" - "i376" - "i374" - "i372" - "i369" - "i367" - "i366" - "i364" - "i362" - "i360" - "i358" - "i357" - "i356" - "i355" - "i353" - "i352" - "i349" - "i347" - "i345" - "i343" - "i341" - "i339" - "i337" - "i336" - "i335" - "i333" - "i331" - "i330" - "i327" - "i326" - "i324" - "i322" - "i320" - "i318" - "i316" - "i314" - "i312" - "i310" - "i308" - "i305" - "i303" - "i301" - "i299" - "i297" - "i295" - "i293" - "i291" - "i289" - "i287" - "i285" - "i283" - "i281" - "i279" - "i277" - "i275" - "i273" - "i271" - "i269" - "i267" - "i265" - "i263" - "i261" - "i260" - "i257" - "i255" - "i254" - "i253" - "i252" - "i251" - "i249" - "i247" - "i245" - "i242" - "i240" - "i238" - "i236" - "i234" - "i232" - "i230" - "i228" - "i226" - "i224" - "i222" - "i220" - "i218" - "i216" - "i214" - "i212" - "i210" - "i208")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("i46" "i45" "i44"))) - (hygiene guile)) - '(()))) - #f) - (#{expand 4333}# - #{exp 12601}# - #{r 12557}# + (if (#{free-id=? 4431}# + '#(syntax-object + pad + ((top) + #(ribcage + #(pat exp) + #((top) (top)) + #("i4007" "i4008")) + #(ribcage () () ()) + #(ribcage + #(x keys clauses r mod) + #((top) (top) (top) (top) (top)) + #("i3997" + "i3998" + "i3999" + "i4000" + "i4001")) + #(ribcage + (gen-syntax-case + gen-clause + build-dispatch-call + convert-pattern) + ((top) (top) (top) (top)) + ("i3810" "i3808" "i3806" "i3804")) + #(ribcage + (lambda-var-list + gen-var + strip + expand-lambda-case + lambda*-formals + expand-simple-lambda + lambda-formals + ellipsis? + expand-void + eval-local-transformer + expand-local-syntax + expand-body + expand-macro + expand-call + expand-expr + expand + syntax-type + parse-when-list + expand-install-global + expand-top-sequence + expand-sequence + source-wrap + wrap + bound-id-member? + distinct-bound-ids? + valid-bound-ids? + bound-id=? + free-id=? + resolve-identifier + id-var-name + same-marks? + join-marks + join-wraps + smart-append + make-binding-wrap + extend-ribcage! + make-empty-ribcage + new-mark + anti-mark + the-anti-mark + top-marked? + top-wrap + empty-wrap + set-ribcage-labels! + set-ribcage-marks! + set-ribcage-symnames! + ribcage-labels + ribcage-marks + ribcage-symnames + ribcage? + make-ribcage + gen-labels + gen-label + make-rename + rename-marks + rename-new + rename-old + subst-rename? + wrap-subst + wrap-marks + make-wrap + id-sym-name&marks + id-sym-name + id? + nonsymbol-id? + global-extend + macros-only-env + extend-var-env + extend-env + null-env + binding-value + binding-type + make-binding + arg-check + source-annotation + no-source + set-syntax-object-module! + set-syntax-object-wrap! + set-syntax-object-expression! + syntax-object-module + syntax-object-wrap + syntax-object-expression + syntax-object? + make-syntax-object + build-lexical-var + build-letrec + build-named-let + build-let + build-sequence + build-data + build-primref + build-primcall + build-lambda-case + build-case-lambda + build-simple-lambda + build-global-definition + build-global-assignment + build-global-reference + analyze-variable + build-lexical-assignment + build-lexical-reference + build-dynlet + build-conditional + build-call + build-void + maybe-name-value! + decorate-source + get-global-definition-hook + put-global-definition-hook + gensym-hook + local-eval-hook + top-level-eval-hook + fx< + fx= + fx- + fx+ + set-lambda-meta! + lambda-meta + lambda? + make-dynlet + make-letrec + make-let + make-lambda-case + make-lambda + make-seq + make-primcall + make-call + make-conditional + make-toplevel-define + make-toplevel-set + make-toplevel-ref + make-module-set + make-module-ref + make-lexical-set + make-lexical-ref + make-primitive-ref + make-const + make-void) + ((top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top)) + ("i471" + "i469" + "i467" + "i465" + "i463" + "i461" + "i459" + "i457" + "i455" + "i453" + "i451" + "i449" + "i447" + "i445" + "i443" + "i441" + "i439" + "i437" + "i435" + "i433" + "i431" + "i429" + "i427" + "i425" + "i423" + "i421" + "i419" + "i417" + "i415" + "i413" + "i411" + "i409" + "i407" + "i405" + "i403" + "i401" + "i400" + "i398" + "i395" + "i394" + "i393" + "i391" + "i390" + "i388" + "i386" + "i384" + "i382" + "i380" + "i378" + "i376" + "i374" + "i371" + "i369" + "i368" + "i366" + "i364" + "i362" + "i360" + "i359" + "i358" + "i357" + "i355" + "i354" + "i351" + "i349" + "i347" + "i345" + "i343" + "i341" + "i340" + "i339" + "i337" + "i335" + "i334" + "i331" + "i330" + "i328" + "i326" + "i324" + "i322" + "i320" + "i318" + "i316" + "i314" + "i312" + "i309" + "i307" + "i305" + "i303" + "i301" + "i299" + "i297" + "i295" + "i293" + "i291" + "i289" + "i287" + "i285" + "i283" + "i281" + "i279" + "i277" + "i275" + "i273" + "i271" + "i269" + "i267" + "i265" + "i263" + "i262" + "i259" + "i257" + "i256" + "i255" + "i254" + "i253" + "i251" + "i249" + "i247" + "i244" + "i242" + "i240" + "i238" + "i236" + "i234" + "i232" + "i230" + "i228" + "i226" + "i224" + "i222" + "i220" + "i218" + "i216" + "i214" + "i212" + "i210" + "i208")) + #(ribcage + (define-structure + define-expansion-accessors + define-expansion-constructors) + ((top) (top) (top)) + ("i46" "i45" "i44")) + #(ribcage () () ())) + (hygiene guile)) + '#(syntax-object + _ + ((top) + #(ribcage + #(pat exp) + #((top) (top)) + #("i4007" "i4008")) + #(ribcage () () ()) + #(ribcage + #(x keys clauses r mod) + #((top) (top) (top) (top) (top)) + #("i3997" + "i3998" + "i3999" + "i4000" + "i4001")) + #(ribcage + (gen-syntax-case + gen-clause + build-dispatch-call + convert-pattern) + ((top) (top) (top) (top)) + ("i3810" "i3808" "i3806" "i3804")) + #(ribcage + (lambda-var-list + gen-var + strip + expand-lambda-case + lambda*-formals + expand-simple-lambda + lambda-formals + ellipsis? + expand-void + eval-local-transformer + expand-local-syntax + expand-body + expand-macro + expand-call + expand-expr + expand + syntax-type + parse-when-list + expand-install-global + expand-top-sequence + expand-sequence + source-wrap + wrap + bound-id-member? + distinct-bound-ids? + valid-bound-ids? + bound-id=? + free-id=? + resolve-identifier + id-var-name + same-marks? + join-marks + join-wraps + smart-append + make-binding-wrap + extend-ribcage! + make-empty-ribcage + new-mark + anti-mark + the-anti-mark + top-marked? + top-wrap + empty-wrap + set-ribcage-labels! + set-ribcage-marks! + set-ribcage-symnames! + ribcage-labels + ribcage-marks + ribcage-symnames + ribcage? + make-ribcage + gen-labels + gen-label + make-rename + rename-marks + rename-new + rename-old + subst-rename? + wrap-subst + wrap-marks + make-wrap + id-sym-name&marks + id-sym-name + id? + nonsymbol-id? + global-extend + macros-only-env + extend-var-env + extend-env + null-env + binding-value + binding-type + make-binding + arg-check + source-annotation + no-source + set-syntax-object-module! + set-syntax-object-wrap! + set-syntax-object-expression! + syntax-object-module + syntax-object-wrap + syntax-object-expression + syntax-object? + make-syntax-object + build-lexical-var + build-letrec + build-named-let + build-let + build-sequence + build-data + build-primref + build-primcall + build-lambda-case + build-case-lambda + build-simple-lambda + build-global-definition + build-global-assignment + build-global-reference + analyze-variable + build-lexical-assignment + build-lexical-reference + build-dynlet + build-conditional + build-call + build-void + maybe-name-value! + decorate-source + get-global-definition-hook + put-global-definition-hook + gensym-hook + local-eval-hook + top-level-eval-hook + fx< + fx= + fx- + fx+ + set-lambda-meta! + lambda-meta + lambda? + make-dynlet + make-letrec + make-let + make-lambda-case + make-lambda + make-seq + make-primcall + make-call + make-conditional + make-toplevel-define + make-toplevel-set + make-toplevel-ref + make-module-set + make-module-ref + make-lexical-set + make-lexical-ref + make-primitive-ref + make-const + make-void) + ((top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top)) + ("i471" + "i469" + "i467" + "i465" + "i463" + "i461" + "i459" + "i457" + "i455" + "i453" + "i451" + "i449" + "i447" + "i445" + "i443" + "i441" + "i439" + "i437" + "i435" + "i433" + "i431" + "i429" + "i427" + "i425" + "i423" + "i421" + "i419" + "i417" + "i415" + "i413" + "i411" + "i409" + "i407" + "i405" + "i403" + "i401" + "i400" + "i398" + "i395" + "i394" + "i393" + "i391" + "i390" + "i388" + "i386" + "i384" + "i382" + "i380" + "i378" + "i376" + "i374" + "i371" + "i369" + "i368" + "i366" + "i364" + "i362" + "i360" + "i359" + "i358" + "i357" + "i355" + "i354" + "i351" + "i349" + "i347" + "i345" + "i343" + "i341" + "i340" + "i339" + "i337" + "i335" + "i334" + "i331" + "i330" + "i328" + "i326" + "i324" + "i322" + "i320" + "i318" + "i316" + "i314" + "i312" + "i309" + "i307" + "i305" + "i303" + "i301" + "i299" + "i297" + "i295" + "i293" + "i291" + "i289" + "i287" + "i285" + "i283" + "i281" + "i279" + "i277" + "i275" + "i273" + "i271" + "i269" + "i267" + "i265" + "i263" + "i262" + "i259" + "i257" + "i256" + "i255" + "i254" + "i253" + "i251" + "i249" + "i247" + "i244" + "i242" + "i240" + "i238" + "i236" + "i234" + "i232" + "i230" + "i228" + "i226" + "i224" + "i222" + "i220" + "i218" + "i216" + "i214" + "i212" + "i210" + "i208")) + #(ribcage + (define-structure + define-expansion-accessors + define-expansion-constructors) + ((top) (top) (top)) + ("i46" "i45" "i44")) + #(ribcage () () ())) + (hygiene guile))) + (#{expand 4443}# + #{exp 14565}# + #{r 14535}# '(()) - #{mod 12558}#) - (let ((#{labels 12809}# + #{mod 14536}#) + (let ((#{labels 14678}# (list (symbol->string (gensym "i")))) - (#{var 12810}# - (let ((#{id 12848}# - (if (if (vector? #{pat 12600}#) + (#{var 14679}# + (let ((#{id 14717}# + (if (if (vector? #{pat 14564}#) (if (= (vector-length - #{pat 12600}#) + #{pat 14564}#) 4) (eq? (vector-ref - #{pat 12600}# + #{pat 14564}# 0) 'syntax-object) #f) #f) - (vector-ref #{pat 12600}# 1) - #{pat 12600}#))) + (vector-ref #{pat 14564}# 1) + #{pat 14564}#))) (gensym (string-append - (symbol->string #{id 12848}#) + (symbol->string #{id 14717}#) " "))))) - (#{build-application 4268}# + (#{build-call 4377}# #f - (#{build-simple-lambda 4277}# + (#{build-simple-lambda 4386}# #f - (list (syntax->datum #{pat 12600}#)) + (list (syntax->datum #{pat 14564}#)) #f - (list #{var 12810}#) + (list #{var 14679}#) '() - (#{expand 4333}# - #{exp 12601}# - (#{extend-env 4295}# - #{labels 12809}# + (#{expand 4443}# + #{exp 14565}# + (#{extend-env 4405}# + #{labels 14678}# (list (cons 'syntax - (cons #{var 12810}# 0))) - #{r 12557}#) - (#{make-binding-wrap 4315}# - (list #{pat 12600}#) - #{labels 12809}# + (cons #{var 14679}# 0))) + #{r 14535}#) + (#{make-binding-wrap 4424}# + (list #{pat 14564}#) + #{labels 14678}# '(())) - #{mod 12558}#)) - (list #{x 12554}#)))) - (#{gen-clause 12144}# - #{x 12554}# - #{keys 12555}# - (cdr #{clauses 12556}#) - #{r 12557}# - #{pat 12600}# + #{mod 14536}#)) + (list #{x 14532}#)))) + (#{gen-clause 13787}# + #{x 14532}# + #{keys 14533}# + (cdr #{clauses 14534}#) + #{r 14535}# + #{pat 14564}# #t - #{exp 12601}# - #{mod 12558}#))) - #{tmp 12598}#) - (let ((#{tmp 13118}# - ($sc-dispatch #{tmp 12597}# '(any any any)))) - (if #{tmp 13118}# + #{exp 14565}# + #{mod 14536}#))) + #{tmp 14562}#) + (let ((#{tmp 15027}# + ($sc-dispatch #{tmp 14561}# '(any any any)))) + (if #{tmp 15027}# (@apply - (lambda (#{pat 13120}# - #{fender 13121}# - #{exp 13122}#) - (#{gen-clause 12144}# - #{x 12554}# - #{keys 12555}# - (cdr #{clauses 12556}#) - #{r 12557}# - #{pat 13120}# - #{fender 13121}# - #{exp 13122}# - #{mod 12558}#)) - #{tmp 13118}#) + (lambda (#{pat 15029}# + #{fender 15030}# + #{exp 15031}#) + (#{gen-clause 13787}# + #{x 14532}# + #{keys 14533}# + (cdr #{clauses 14534}#) + #{r 14535}# + #{pat 15029}# + #{fender 15030}# + #{exp 15031}# + #{mod 14536}#)) + #{tmp 15027}#) (syntax-violation 'syntax-case "invalid clause" - (car #{clauses 12556}#))))))))))) - (lambda (#{e 12146}# - #{r 12147}# - #{w 12148}# - #{s 12149}# - #{mod 12150}#) - (let ((#{e 12151}# - (#{wrap 4326}# - (begin - (if (if (pair? #{e 12146}#) #{s 12149}# #f) - (set-source-properties! #{e 12146}# #{s 12149}#)) - #{e 12146}#) - #{w 12148}# - #{mod 12150}#))) - (let ((#{tmp 12153}# - ($sc-dispatch - #{e 12151}# - '(_ any each-any . each-any)))) - (if #{tmp 12153}# - (@apply - (lambda (#{val 12178}# #{key 12179}# #{m 12180}#) - (if (and-map - (lambda (#{x 12181}#) - (if (if (symbol? #{x 12181}#) - #t - (if (if (vector? #{x 12181}#) - (if (= (vector-length #{x 12181}#) 4) - (eq? (vector-ref #{x 12181}# 0) - 'syntax-object) + (car #{clauses 14534}#))))))))))) + (lambda (#{e 13789}# + #{r 13790}# + #{w 13791}# + #{s 13792}# + #{mod 13793}#) + (let ((#{e 13794}# + (let ((#{x 14443}# + (begin + (if (if (pair? #{e 13789}#) #{s 13792}# #f) + (set-source-properties! #{e 13789}# #{s 13792}#)) + #{e 13789}#))) + (if (if (null? (car #{w 13791}#)) + (null? (cdr #{w 13791}#)) + #f) + #{x 14443}# + (if (if (vector? #{x 14443}#) + (if (= (vector-length #{x 14443}#) 4) + (eq? (vector-ref #{x 14443}# 0) 'syntax-object) + #f) + #f) + (let ((#{expression 14475}# (vector-ref #{x 14443}# 1)) + (#{wrap 14476}# + (let ((#{w2 14484}# + (vector-ref #{x 14443}# 2))) + (let ((#{m1 14485}# (car #{w 13791}#)) + (#{s1 14486}# (cdr #{w 13791}#))) + (if (null? #{m1 14485}#) + (if (null? #{s1 14486}#) + #{w2 14484}# + (cons (car #{w2 14484}#) + (let ((#{m2 14501}# + (cdr #{w2 14484}#))) + (if (null? #{m2 14501}#) + #{s1 14486}# + (append + #{s1 14486}# + #{m2 14501}#))))) + (cons (let ((#{m2 14509}# + (car #{w2 14484}#))) + (if (null? #{m2 14509}#) + #{m1 14485}# + (append + #{m1 14485}# + #{m2 14509}#))) + (let ((#{m2 14517}# + (cdr #{w2 14484}#))) + (if (null? #{m2 14517}#) + #{s1 14486}# + (append + #{s1 14486}# + #{m2 14517}#)))))))) + (#{module 14477}# (vector-ref #{x 14443}# 3))) + (vector + 'syntax-object + #{expression 14475}# + #{wrap 14476}# + #{module 14477}#)) + (if (null? #{x 14443}#) + #{x 14443}# + (vector + 'syntax-object + #{x 14443}# + #{w 13791}# + #{mod 13793}#))))))) + (let ((#{tmp 13795}# #{e 13794}#)) + (let ((#{tmp 13796}# + ($sc-dispatch + #{tmp 13795}# + '(_ any each-any . each-any)))) + (if #{tmp 13796}# + (@apply + (lambda (#{val 13848}# #{key 13849}# #{m 13850}#) + (if (and-map + (lambda (#{x 13851}#) + (if (if (symbol? #{x 13851}#) + #t + (if (if (vector? #{x 13851}#) + (if (= (vector-length #{x 13851}#) 4) + (eq? (vector-ref #{x 13851}# 0) + 'syntax-object) + #f) #f) - #f) - (symbol? (vector-ref #{x 12181}# 1)) - #f)) - (not (if (if (if (vector? #{x 12181}#) - (if (= (vector-length #{x 12181}#) - 4) - (eq? (vector-ref #{x 12181}# 0) - 'syntax-object) + (symbol? (vector-ref #{x 13851}# 1)) + #f)) + (not (if (if (if (vector? #{x 13851}#) + (if (= (vector-length + #{x 13851}#) + 4) + (eq? (vector-ref + #{x 13851}# + 0) + 'syntax-object) + #f) #f) - #f) - (symbol? (vector-ref #{x 12181}# 1)) - #f) - (if (eq? (if (if (vector? #{x 12181}#) - (if (= (vector-length - #{x 12181}#) - 4) - (eq? (vector-ref - #{x 12181}# - 0) - 'syntax-object) - #f) - #f) - (vector-ref #{x 12181}# 1) - #{x 12181}#) - (if (if (= (vector-length - '#(syntax-object - ... - ((top) - #(ribcage - () - () - ()) - #(ribcage - () - () - ()) - #(ribcage - #(x) - #((top)) - #("i2218")) - #(ribcage - (lambda-var-list - gen-var - strip - expand-lambda-case - lambda*-formals - expand-simple-lambda - lambda-formals - ellipsis? - expand-void - eval-local-transformer - expand-local-syntax - expand-body - expand-macro - expand-application - expand-expr - expand - syntax-type - parse-when-list - expand-install-global - expand-top-sequence - expand-sequence - source-wrap - wrap - bound-id-member? - distinct-bound-ids? - valid-bound-ids? - bound-id=? - free-id=? - id-var-name - same-marks? - join-marks - join-wraps - smart-append - make-binding-wrap - extend-ribcage! - make-empty-ribcage - new-mark - anti-mark - the-anti-mark - top-marked? - top-wrap - empty-wrap - set-ribcage-labels! - set-ribcage-marks! - set-ribcage-symnames! - ribcage-labels - ribcage-marks - ribcage-symnames - ribcage? - make-ribcage - gen-labels - gen-label - make-rename - rename-marks - rename-new - rename-old - subst-rename? - wrap-subst - wrap-marks - make-wrap - id-sym-name&marks - id-sym-name - id? - nonsymbol-id? - global-extend - lookup - macros-only-env - extend-var-env - extend-env - null-env - binding-value - binding-type - make-binding - arg-check - source-annotation - no-source - set-syntax-object-module! - set-syntax-object-wrap! - set-syntax-object-expression! - syntax-object-module - syntax-object-wrap - syntax-object-expression - syntax-object? - make-syntax-object - build-lexical-var - build-letrec - build-named-let - build-let - build-sequence - build-data - build-primref - build-lambda-case - build-case-lambda - build-simple-lambda - build-global-definition - build-global-assignment - build-global-reference - analyze-variable - build-lexical-assignment - build-lexical-reference - build-dynlet - build-conditional - build-application - build-void - maybe-name-value! - decorate-source - get-global-definition-hook - put-global-definition-hook - gensym-hook - local-eval-hook - top-level-eval-hook - fx< - fx= - fx- - fx+ - set-lambda-meta! - lambda-meta - lambda? - make-dynlet - make-letrec - make-let - make-lambda-case - make-lambda - make-sequence - make-application - make-conditional - make-toplevel-define - make-toplevel-set - make-toplevel-ref - make-module-set - make-module-ref - make-lexical-set - make-lexical-ref - make-primitive-ref - make-const - make-void) - ((top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top)) - ("i467" - "i465" - "i463" - "i461" - "i459" - "i457" - "i455" - "i453" - "i451" - "i449" - "i447" - "i445" - "i443" - "i441" - "i439" - "i437" - "i435" - "i433" - "i431" - "i429" - "i427" - "i425" - "i423" - "i421" - "i419" - "i417" - "i415" - "i413" - "i411" - "i409" - "i407" - "i405" - "i403" - "i401" - "i399" - "i398" - "i396" - "i393" - "i392" - "i391" - "i389" - "i388" - "i386" - "i384" - "i382" - "i380" - "i378" - "i376" - "i374" - "i372" - "i369" - "i367" - "i366" - "i364" - "i362" - "i360" - "i358" - "i357" - "i356" - "i355" - "i353" - "i352" - "i349" - "i347" - "i345" - "i343" - "i341" - "i339" - "i337" - "i336" - "i335" - "i333" - "i331" - "i330" - "i327" - "i326" - "i324" - "i322" - "i320" - "i318" - "i316" - "i314" - "i312" - "i310" - "i308" - "i305" - "i303" - "i301" - "i299" - "i297" - "i295" - "i293" - "i291" - "i289" - "i287" - "i285" - "i283" - "i281" - "i279" - "i277" - "i275" - "i273" - "i271" - "i269" - "i267" - "i265" - "i263" - "i261" - "i260" - "i257" - "i255" - "i254" - "i253" - "i252" - "i251" - "i249" - "i247" - "i245" - "i242" - "i240" - "i238" - "i236" - "i234" - "i232" - "i230" - "i228" - "i226" - "i224" - "i222" - "i220" - "i218" - "i216" - "i214" - "i212" - "i210" - "i208")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) - (top) - (top)) - ("i46" - "i45" - "i44"))) - (hygiene guile))) - 4) - #t - #f) - '... - '#(syntax-object - ... - ((top) - #(ribcage () () ()) - #(ribcage () () ()) - #(ribcage - #(x) - #((top)) - #("i2218")) - #(ribcage - (lambda-var-list - gen-var - strip - expand-lambda-case - lambda*-formals - expand-simple-lambda - lambda-formals - ellipsis? - expand-void - eval-local-transformer - expand-local-syntax - expand-body - expand-macro - expand-application - expand-expr - expand - syntax-type - parse-when-list - expand-install-global - expand-top-sequence - expand-sequence - source-wrap - wrap - bound-id-member? - distinct-bound-ids? - valid-bound-ids? - bound-id=? - free-id=? - id-var-name - same-marks? - join-marks - join-wraps - smart-append - make-binding-wrap - extend-ribcage! - make-empty-ribcage - new-mark - anti-mark - the-anti-mark - top-marked? - top-wrap - empty-wrap - set-ribcage-labels! - set-ribcage-marks! - set-ribcage-symnames! - ribcage-labels - ribcage-marks - ribcage-symnames - ribcage? - make-ribcage - gen-labels - gen-label - make-rename - rename-marks - rename-new - rename-old - subst-rename? - wrap-subst - wrap-marks - make-wrap - id-sym-name&marks - id-sym-name - id? - nonsymbol-id? - global-extend - lookup - macros-only-env - extend-var-env - extend-env - null-env - binding-value - binding-type - make-binding - arg-check - source-annotation - no-source - set-syntax-object-module! - set-syntax-object-wrap! - set-syntax-object-expression! - syntax-object-module - syntax-object-wrap - syntax-object-expression - syntax-object? - make-syntax-object - build-lexical-var - build-letrec - build-named-let - build-let - build-sequence - build-data - build-primref - build-lambda-case - build-case-lambda - build-simple-lambda - build-global-definition - build-global-assignment - build-global-reference - analyze-variable - build-lexical-assignment - build-lexical-reference - build-dynlet - build-conditional - build-application - build-void - maybe-name-value! - decorate-source - get-global-definition-hook - put-global-definition-hook - gensym-hook - local-eval-hook - top-level-eval-hook - fx< - fx= - fx- - fx+ - set-lambda-meta! - lambda-meta - lambda? - make-dynlet - make-letrec - make-let - make-lambda-case - make-lambda - make-sequence - make-application - make-conditional - make-toplevel-define - make-toplevel-set - make-toplevel-ref - make-module-set - make-module-ref - make-lexical-set - make-lexical-ref - make-primitive-ref - make-const - make-void) - ((top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top)) - ("i467" - "i465" - "i463" - "i461" - "i459" - "i457" - "i455" - "i453" - "i451" - "i449" - "i447" - "i445" - "i443" - "i441" - "i439" - "i437" - "i435" - "i433" - "i431" - "i429" - "i427" - "i425" - "i423" - "i421" - "i419" - "i417" - "i415" - "i413" - "i411" - "i409" - "i407" - "i405" - "i403" - "i401" - "i399" - "i398" - "i396" - "i393" - "i392" - "i391" - "i389" - "i388" - "i386" - "i384" - "i382" - "i380" - "i378" - "i376" - "i374" - "i372" - "i369" - "i367" - "i366" - "i364" - "i362" - "i360" - "i358" - "i357" - "i356" - "i355" - "i353" - "i352" - "i349" - "i347" - "i345" - "i343" - "i341" - "i339" - "i337" - "i336" - "i335" - "i333" - "i331" - "i330" - "i327" - "i326" - "i324" - "i322" - "i320" - "i318" - "i316" - "i314" - "i312" - "i310" - "i308" - "i305" - "i303" - "i301" - "i299" - "i297" - "i295" - "i293" - "i291" - "i289" - "i287" - "i285" - "i283" - "i281" - "i279" - "i277" - "i275" - "i273" - "i271" - "i269" - "i267" - "i265" - "i263" - "i261" - "i260" - "i257" - "i255" - "i254" - "i253" - "i252" - "i251" - "i249" - "i247" - "i245" - "i242" - "i240" - "i238" - "i236" - "i234" - "i232" - "i230" - "i228" - "i226" - "i224" - "i222" - "i220" - "i218" - "i216" - "i214" - "i212" - "i210" - "i208")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("i46" "i45" "i44"))) - (hygiene guile)))) - (eq? (#{id-var-name 4320}# - #{x 12181}# - '(())) - (#{id-var-name 4320}# - '#(syntax-object - ... - ((top) - #(ribcage () () ()) - #(ribcage () () ()) - #(ribcage - #(x) - #((top)) - #("i2218")) - #(ribcage - (lambda-var-list - gen-var - strip - expand-lambda-case - lambda*-formals - expand-simple-lambda - lambda-formals - ellipsis? - expand-void - eval-local-transformer - expand-local-syntax - expand-body - expand-macro - expand-application - expand-expr - expand - syntax-type - parse-when-list - expand-install-global - expand-top-sequence - expand-sequence - source-wrap - wrap - bound-id-member? - distinct-bound-ids? - valid-bound-ids? - bound-id=? - free-id=? - id-var-name - same-marks? - join-marks - join-wraps - smart-append - make-binding-wrap - extend-ribcage! - make-empty-ribcage - new-mark - anti-mark - the-anti-mark - top-marked? - top-wrap - empty-wrap - set-ribcage-labels! - set-ribcage-marks! - set-ribcage-symnames! - ribcage-labels - ribcage-marks - ribcage-symnames - ribcage? - make-ribcage - gen-labels - gen-label - make-rename - rename-marks - rename-new - rename-old - subst-rename? - wrap-subst - wrap-marks - make-wrap - id-sym-name&marks - id-sym-name - id? - nonsymbol-id? - global-extend - lookup - macros-only-env - extend-var-env - extend-env - null-env - binding-value - binding-type - make-binding - arg-check - source-annotation - no-source - set-syntax-object-module! - set-syntax-object-wrap! - set-syntax-object-expression! - syntax-object-module - syntax-object-wrap - syntax-object-expression - syntax-object? - make-syntax-object - build-lexical-var - build-letrec - build-named-let - build-let - build-sequence - build-data - build-primref - build-lambda-case - build-case-lambda - build-simple-lambda - build-global-definition - build-global-assignment - build-global-reference - analyze-variable - build-lexical-assignment - build-lexical-reference - build-dynlet - build-conditional - build-application - build-void - maybe-name-value! - decorate-source - get-global-definition-hook - put-global-definition-hook - gensym-hook - local-eval-hook - top-level-eval-hook - fx< - fx= - fx- - fx+ - set-lambda-meta! - lambda-meta - lambda? - make-dynlet - make-letrec - make-let - make-lambda-case - make-lambda - make-sequence - make-application - make-conditional - make-toplevel-define - make-toplevel-set - make-toplevel-ref - make-module-set - make-module-ref - make-lexical-set - make-lexical-ref - make-primitive-ref - make-const - make-void) - ((top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top) - (top)) - ("i467" - "i465" - "i463" - "i461" - "i459" - "i457" - "i455" - "i453" - "i451" - "i449" - "i447" - "i445" - "i443" - "i441" - "i439" - "i437" - "i435" - "i433" - "i431" - "i429" - "i427" - "i425" - "i423" - "i421" - "i419" - "i417" - "i415" - "i413" - "i411" - "i409" - "i407" - "i405" - "i403" - "i401" - "i399" - "i398" - "i396" - "i393" - "i392" - "i391" - "i389" - "i388" - "i386" - "i384" - "i382" - "i380" - "i378" - "i376" - "i374" - "i372" - "i369" - "i367" - "i366" - "i364" - "i362" - "i360" - "i358" - "i357" - "i356" - "i355" - "i353" - "i352" - "i349" - "i347" - "i345" - "i343" - "i341" - "i339" - "i337" - "i336" - "i335" - "i333" - "i331" - "i330" - "i327" - "i326" - "i324" - "i322" - "i320" - "i318" - "i316" - "i314" - "i312" - "i310" - "i308" - "i305" - "i303" - "i301" - "i299" - "i297" - "i295" - "i293" - "i291" - "i289" - "i287" - "i285" - "i283" - "i281" - "i279" - "i277" - "i275" - "i273" - "i271" - "i269" - "i267" - "i265" - "i263" - "i261" - "i260" - "i257" - "i255" - "i254" - "i253" - "i252" - "i251" - "i249" - "i247" - "i245" - "i242" - "i240" - "i238" - "i236" - "i234" - "i232" - "i230" - "i228" - "i226" - "i224" - "i222" - "i220" - "i218" - "i216" - "i214" - "i212" - "i210" - "i208")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("i46" "i45" "i44"))) - (hygiene guile)) - '(()))) - #f) - #f)) - #f)) - #{key 12179}#) - (let ((#{x 12307}# - (gensym - (string-append (symbol->string 'tmp) " ")))) - (#{build-application 4268}# - #{s 12149}# - (let ((#{req 12442}# (list 'tmp)) - (#{vars 12444}# (list #{x 12307}#)) - (#{exp 12446}# - (#{gen-syntax-case 12145}# - (make-struct/no-tail - (vector-ref %expanded-vtables 3) - #f - 'tmp - #{x 12307}#) - #{key 12179}# - #{m 12180}# - #{r 12147}# - #{mod 12150}#))) - (let ((#{body 12451}# - (make-struct/no-tail - (vector-ref %expanded-vtables 14) - #f - #{req 12442}# - #f - #f - #f - '() - #{vars 12444}# - #{exp 12446}# - #f))) - (make-struct/no-tail - (vector-ref %expanded-vtables 13) - #f - '() - #{body 12451}#))) - (list (#{expand 4333}# - #{val 12178}# - #{r 12147}# - '(()) - #{mod 12150}#)))) - (syntax-violation - 'syntax-case - "invalid literals list" - #{e 12151}#))) - #{tmp 12153}#) - (syntax-violation - #f - "source expression failed to match any pattern" - #{e 12151}#))))))) + (symbol? (vector-ref #{x 13851}# 1)) + #f) + (#{free-id=? 4431}# + #{x 13851}# + '#(syntax-object + ... + ((top) + #(ribcage () () ()) + #(ribcage () () ()) + #(ribcage + #(x) + #((top)) + #("i2338")) + #(ribcage + (lambda-var-list + gen-var + strip + expand-lambda-case + lambda*-formals + expand-simple-lambda + lambda-formals + ellipsis? + expand-void + eval-local-transformer + expand-local-syntax + expand-body + expand-macro + expand-call + expand-expr + expand + syntax-type + parse-when-list + expand-install-global + expand-top-sequence + expand-sequence + source-wrap + wrap + bound-id-member? + distinct-bound-ids? + valid-bound-ids? + bound-id=? + free-id=? + resolve-identifier + id-var-name + same-marks? + join-marks + join-wraps + smart-append + make-binding-wrap + extend-ribcage! + make-empty-ribcage + new-mark + anti-mark + the-anti-mark + top-marked? + top-wrap + empty-wrap + set-ribcage-labels! + set-ribcage-marks! + set-ribcage-symnames! + ribcage-labels + ribcage-marks + ribcage-symnames + ribcage? + make-ribcage + gen-labels + gen-label + make-rename + rename-marks + rename-new + rename-old + subst-rename? + wrap-subst + wrap-marks + make-wrap + id-sym-name&marks + id-sym-name + id? + nonsymbol-id? + global-extend + macros-only-env + extend-var-env + extend-env + null-env + binding-value + binding-type + make-binding + arg-check + source-annotation + no-source + set-syntax-object-module! + set-syntax-object-wrap! + set-syntax-object-expression! + syntax-object-module + syntax-object-wrap + syntax-object-expression + syntax-object? + make-syntax-object + build-lexical-var + build-letrec + build-named-let + build-let + build-sequence + build-data + build-primref + build-primcall + build-lambda-case + build-case-lambda + build-simple-lambda + build-global-definition + build-global-assignment + build-global-reference + analyze-variable + build-lexical-assignment + build-lexical-reference + build-dynlet + build-conditional + build-call + build-void + maybe-name-value! + decorate-source + get-global-definition-hook + put-global-definition-hook + gensym-hook + local-eval-hook + top-level-eval-hook + fx< + fx= + fx- + fx+ + set-lambda-meta! + lambda-meta + lambda? + make-dynlet + make-letrec + make-let + make-lambda-case + make-lambda + make-seq + make-primcall + make-call + make-conditional + make-toplevel-define + make-toplevel-set + make-toplevel-ref + make-module-set + make-module-ref + make-lexical-set + make-lexical-ref + make-primitive-ref + make-const + make-void) + ((top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top) + (top)) + ("i471" + "i469" + "i467" + "i465" + "i463" + "i461" + "i459" + "i457" + "i455" + "i453" + "i451" + "i449" + "i447" + "i445" + "i443" + "i441" + "i439" + "i437" + "i435" + "i433" + "i431" + "i429" + "i427" + "i425" + "i423" + "i421" + "i419" + "i417" + "i415" + "i413" + "i411" + "i409" + "i407" + "i405" + "i403" + "i401" + "i400" + "i398" + "i395" + "i394" + "i393" + "i391" + "i390" + "i388" + "i386" + "i384" + "i382" + "i380" + "i378" + "i376" + "i374" + "i371" + "i369" + "i368" + "i366" + "i364" + "i362" + "i360" + "i359" + "i358" + "i357" + "i355" + "i354" + "i351" + "i349" + "i347" + "i345" + "i343" + "i341" + "i340" + "i339" + "i337" + "i335" + "i334" + "i331" + "i330" + "i328" + "i326" + "i324" + "i322" + "i320" + "i318" + "i316" + "i314" + "i312" + "i309" + "i307" + "i305" + "i303" + "i301" + "i299" + "i297" + "i295" + "i293" + "i291" + "i289" + "i287" + "i285" + "i283" + "i281" + "i279" + "i277" + "i275" + "i273" + "i271" + "i269" + "i267" + "i265" + "i263" + "i262" + "i259" + "i257" + "i256" + "i255" + "i254" + "i253" + "i251" + "i249" + "i247" + "i244" + "i242" + "i240" + "i238" + "i236" + "i234" + "i232" + "i230" + "i228" + "i226" + "i224" + "i222" + "i220" + "i218" + "i216" + "i214" + "i212" + "i210" + "i208")) + #(ribcage + (define-structure + define-expansion-accessors + define-expansion-constructors) + ((top) (top) (top)) + ("i46" "i45" "i44")) + #(ribcage () () ())) + (hygiene guile))) + #f)) + #f)) + #{key 13849}#) + (let ((#{x 13916}# + (gensym + (string-append (symbol->string 'tmp) " ")))) + (#{build-call 4377}# + #{s 13792}# + (let ((#{req 14058}# (list 'tmp)) + (#{vars 14060}# (list #{x 13916}#)) + (#{exp 14062}# + (#{gen-syntax-case 13788}# + (make-struct/no-tail + (vector-ref %expanded-vtables 3) + #f + 'tmp + #{x 13916}#) + #{key 13849}# + #{m 13850}# + #{r 13790}# + #{mod 13793}#))) + (let ((#{body 14067}# + (make-struct/no-tail + (vector-ref %expanded-vtables 15) + #f + #{req 14058}# + #f + #f + #f + '() + #{vars 14060}# + #{exp 14062}# + #f))) + (make-struct/no-tail + (vector-ref %expanded-vtables 14) + #f + '() + #{body 14067}#))) + (list (#{expand 4443}# + #{val 13848}# + #{r 13790}# + '(()) + #{mod 13793}#)))) + (syntax-violation + 'syntax-case + "invalid literals list" + #{e 13794}#))) + #{tmp 13796}#) + (syntax-violation + #f + "source expression failed to match any pattern" + #{tmp 13795}#)))))))) (set! macroexpand (lambda* - (#{x 14909}# + (#{x 16799}# #:optional - (#{m 14910}# 'e) - (#{esew 14911}# '(eval))) - (#{expand-top-sequence 4329}# - (list #{x 14909}#) + (#{m 16800}# 'e) + (#{esew 16801}# '(eval))) + (#{expand-top-sequence 4439}# + (list #{x 16799}#) '() '((top)) #f - #{m 14910}# - #{esew 14911}# + #{m 16800}# + #{esew 16801}# (cons 'hygiene (module-name (current-module)))))) (set! identifier? - (lambda (#{x 14914}#) - (if (if (vector? #{x 14914}#) - (if (= (vector-length #{x 14914}#) 4) - (eq? (vector-ref #{x 14914}# 0) 'syntax-object) + (lambda (#{x 16804}#) + (if (if (vector? #{x 16804}#) + (if (= (vector-length #{x 16804}#) 4) + (eq? (vector-ref #{x 16804}# 0) 'syntax-object) #f) #f) - (symbol? (vector-ref #{x 14914}# 1)) + (symbol? (vector-ref #{x 16804}# 1)) #f))) (set! datum->syntax - (lambda (#{id 14939}# #{datum 14940}#) - (let ((#{wrap 14945}# (vector-ref #{id 14939}# 2)) - (#{module 14946}# (vector-ref #{id 14939}# 3))) + (lambda (#{id 16829}# #{datum 16830}#) + (let ((#{wrap 16835}# (vector-ref #{id 16829}# 2)) + (#{module 16836}# (vector-ref #{id 16829}# 3))) (vector 'syntax-object - #{datum 14940}# - #{wrap 14945}# - #{module 14946}#)))) + #{datum 16830}# + #{wrap 16835}# + #{module 16836}#)))) (set! syntax->datum - (lambda (#{x 14953}#) - (#{strip 4346}# #{x 14953}# '(())))) + (lambda (#{x 16843}#) + (#{strip 4456}# #{x 16843}# '(())))) (set! syntax-source - (lambda (#{x 14956}#) - (#{source-annotation 4294}# #{x 14956}#))) + (lambda (#{x 16846}#) + (#{source-annotation 4404}# #{x 16846}#))) (set! generate-temporaries - (lambda (#{ls 15128}#) + (lambda (#{ls 17048}#) (begin - (if (not (list? #{ls 15128}#)) + (if (not (list? #{ls 17048}#)) (syntax-violation 'generate-temporaries "invalid argument" - #{ls 15128}#)) - (let ((#{mod 15136}# + #{ls 17048}#)) + (let ((#{mod 17056}# (cons 'hygiene (module-name (current-module))))) - (map (lambda (#{x 15137}#) - (#{wrap 4326}# (gensym) '((top)) #{mod 15136}#)) - #{ls 15128}#))))) + (map (lambda (#{x 17057}#) + (let ((#{x 17061}# (gensym))) + (if (if (vector? #{x 17061}#) + (if (= (vector-length #{x 17061}#) 4) + (eq? (vector-ref #{x 17061}# 0) 'syntax-object) + #f) + #f) + (let ((#{expression 17076}# (vector-ref #{x 17061}# 1)) + (#{wrap 17077}# + (let ((#{w2 17085}# (vector-ref #{x 17061}# 2))) + (cons (let ((#{m2 17092}# (car #{w2 17085}#))) + (if (null? #{m2 17092}#) + '(top) + (append '(top) #{m2 17092}#))) + (let ((#{m2 17099}# (cdr #{w2 17085}#))) + (if (null? #{m2 17099}#) + '() + (append '() #{m2 17099}#)))))) + (#{module 17078}# (vector-ref #{x 17061}# 3))) + (vector + 'syntax-object + #{expression 17076}# + #{wrap 17077}# + #{module 17078}#)) + (if (null? #{x 17061}#) + #{x 17061}# + (vector + 'syntax-object + #{x 17061}# + '((top)) + #{mod 17056}#))))) + #{ls 17048}#))))) (set! free-identifier=? - (lambda (#{x 15141}# #{y 15142}#) + (lambda (#{x 17108}# #{y 17109}#) (begin - (if (not (if (if (vector? #{x 15141}#) - (if (= (vector-length #{x 15141}#) 4) - (eq? (vector-ref #{x 15141}# 0) 'syntax-object) + (if (not (if (if (vector? #{x 17108}#) + (if (= (vector-length #{x 17108}#) 4) + (eq? (vector-ref #{x 17108}# 0) 'syntax-object) #f) #f) - (symbol? (vector-ref #{x 15141}# 1)) + (symbol? (vector-ref #{x 17108}# 1)) #f)) (syntax-violation 'free-identifier=? "invalid argument" - #{x 15141}#)) - (if (not (if (if (vector? #{y 15142}#) - (if (= (vector-length #{y 15142}#) 4) - (eq? (vector-ref #{y 15142}# 0) 'syntax-object) + #{x 17108}#)) + (if (not (if (if (vector? #{y 17109}#) + (if (= (vector-length #{y 17109}#) 4) + (eq? (vector-ref #{y 17109}# 0) 'syntax-object) #f) #f) - (symbol? (vector-ref #{y 15142}# 1)) + (symbol? (vector-ref #{y 17109}# 1)) #f)) (syntax-violation 'free-identifier=? "invalid argument" - #{y 15142}#)) - (if (eq? (if (if (vector? #{x 15141}#) - (if (= (vector-length #{x 15141}#) 4) - (eq? (vector-ref #{x 15141}# 0) 'syntax-object) - #f) - #f) - (vector-ref #{x 15141}# 1) - #{x 15141}#) - (if (if (vector? #{y 15142}#) - (if (= (vector-length #{y 15142}#) 4) - (eq? (vector-ref #{y 15142}# 0) 'syntax-object) - #f) - #f) - (vector-ref #{y 15142}# 1) - #{y 15142}#)) - (eq? (#{id-var-name 4320}# #{x 15141}# '(())) - (#{id-var-name 4320}# #{y 15142}# '(()))) - #f)))) + #{y 17109}#)) + (#{free-id=? 4431}# #{x 17108}# #{y 17109}#)))) (set! bound-identifier=? - (lambda (#{x 15292}# #{y 15293}#) + (lambda (#{x 17184}# #{y 17185}#) (begin - (if (not (if (if (vector? #{x 15292}#) - (if (= (vector-length #{x 15292}#) 4) - (eq? (vector-ref #{x 15292}# 0) 'syntax-object) + (if (not (if (if (vector? #{x 17184}#) + (if (= (vector-length #{x 17184}#) 4) + (eq? (vector-ref #{x 17184}# 0) 'syntax-object) #f) #f) - (symbol? (vector-ref #{x 15292}# 1)) + (symbol? (vector-ref #{x 17184}# 1)) #f)) (syntax-violation 'bound-identifier=? "invalid argument" - #{x 15292}#)) - (if (not (if (if (vector? #{y 15293}#) - (if (= (vector-length #{y 15293}#) 4) - (eq? (vector-ref #{y 15293}# 0) 'syntax-object) + #{x 17184}#)) + (if (not (if (if (vector? #{y 17185}#) + (if (= (vector-length #{y 17185}#) 4) + (eq? (vector-ref #{y 17185}# 0) 'syntax-object) #f) #f) - (symbol? (vector-ref #{y 15293}# 1)) + (symbol? (vector-ref #{y 17185}# 1)) #f)) (syntax-violation 'bound-identifier=? "invalid argument" - #{y 15293}#)) - (if (if (if (vector? #{x 15292}#) - (if (= (vector-length #{x 15292}#) 4) - (eq? (vector-ref #{x 15292}# 0) 'syntax-object) - #f) - #f) - (if (vector? #{y 15293}#) - (if (= (vector-length #{y 15293}#) 4) - (eq? (vector-ref #{y 15293}# 0) 'syntax-object) - #f) - #f) - #f) - (if (eq? (vector-ref #{x 15292}# 1) - (vector-ref #{y 15293}# 1)) - (#{same-marks? 4319}# - (car (vector-ref #{x 15292}# 2)) - (car (vector-ref #{y 15293}# 2))) - #f) - (eq? #{x 15292}# #{y 15293}#))))) + #{y 17185}#)) + (#{bound-id=? 4432}# #{x 17184}# #{y 17185}#)))) (set! syntax-violation (lambda* - (#{who 15426}# - #{message 15427}# - #{form 15428}# + (#{who 17351}# + #{message 17352}# + #{form 17353}# #:optional - (#{subform 15429}# #f)) + (#{subform 17354}# #f)) (begin - (if (not (if (not #{who 15426}#) - (not #{who 15426}#) - (let ((#{t 15447}# (string? #{who 15426}#))) - (if #{t 15447}# - #{t 15447}# - (symbol? #{who 15426}#))))) + (if (not (if (not #{who 17351}#) + (not #{who 17351}#) + (let ((#{t 17372}# (string? #{who 17351}#))) + (if #{t 17372}# + #{t 17372}# + (symbol? #{who 17351}#))))) (syntax-violation 'syntax-violation "invalid argument" - #{who 15426}#)) - (if (not (string? #{message 15427}#)) + #{who 17351}#)) + (if (not (string? #{message 17352}#)) (syntax-violation 'syntax-violation "invalid argument" - #{message 15427}#)) + #{message 17352}#)) (throw 'syntax-error - #{who 15426}# - #{message 15427}# - (#{source-annotation 4294}# - (if #{form 15428}# - #{form 15428}# - #{subform 15429}#)) - (#{strip 4346}# #{form 15428}# '(())) - (if #{subform 15429}# - (#{strip 4346}# #{subform 15429}# '(())) + #{who 17351}# + #{message 17352}# + (#{source-annotation 4404}# + (if #{form 17353}# + #{form 17353}# + #{subform 17354}#)) + (#{strip 4456}# #{form 17353}# '(())) + (if #{subform 17354}# + (#{strip 4456}# #{subform 17354}# '(())) #f))))) (letrec* - ((#{match-each 15670}# - (lambda (#{e 16293}# - #{p 16294}# - #{w 16295}# - #{mod 16296}#) - (if (pair? #{e 16293}#) - (let ((#{first 16297}# - (#{match 15676}# - (car #{e 16293}#) - #{p 16294}# - #{w 16295}# + ((#{match-each 17623}# + (lambda (#{e 18511}# + #{p 18512}# + #{w 18513}# + #{mod 18514}#) + (if (pair? #{e 18511}#) + (let ((#{first 18515}# + (#{match 17629}# + (car #{e 18511}#) + #{p 18512}# + #{w 18513}# '() - #{mod 16296}#))) - (if #{first 16297}# - (let ((#{rest 16300}# - (#{match-each 15670}# - (cdr #{e 16293}#) - #{p 16294}# - #{w 16295}# - #{mod 16296}#))) - (if #{rest 16300}# - (cons #{first 16297}# #{rest 16300}#) + #{mod 18514}#))) + (if #{first 18515}# + (let ((#{rest 18518}# + (#{match-each 17623}# + (cdr #{e 18511}#) + #{p 18512}# + #{w 18513}# + #{mod 18514}#))) + (if #{rest 18518}# + (cons #{first 18515}# #{rest 18518}#) #f)) #f)) - (if (null? #{e 16293}#) + (if (null? #{e 18511}#) '() - (if (if (vector? #{e 16293}#) - (if (= (vector-length #{e 16293}#) 4) - (eq? (vector-ref #{e 16293}# 0) 'syntax-object) + (if (if (vector? #{e 18511}#) + (if (= (vector-length #{e 18511}#) 4) + (eq? (vector-ref #{e 18511}# 0) 'syntax-object) #f) #f) - (#{match-each 15670}# - (vector-ref #{e 16293}# 1) - #{p 16294}# - (#{join-wraps 4317}# - #{w 16295}# - (vector-ref #{e 16293}# 2)) - (vector-ref #{e 16293}# 3)) + (#{match-each 17623}# + (vector-ref #{e 18511}# 1) + #{p 18512}# + (let ((#{w2 18540}# (vector-ref #{e 18511}# 2))) + (let ((#{m1 18541}# (car #{w 18513}#)) + (#{s1 18542}# (cdr #{w 18513}#))) + (if (null? #{m1 18541}#) + (if (null? #{s1 18542}#) + #{w2 18540}# + (cons (car #{w2 18540}#) + (let ((#{m2 18553}# (cdr #{w2 18540}#))) + (if (null? #{m2 18553}#) + #{s1 18542}# + (append #{s1 18542}# #{m2 18553}#))))) + (cons (let ((#{m2 18561}# (car #{w2 18540}#))) + (if (null? #{m2 18561}#) + #{m1 18541}# + (append #{m1 18541}# #{m2 18561}#))) + (let ((#{m2 18569}# (cdr #{w2 18540}#))) + (if (null? #{m2 18569}#) + #{s1 18542}# + (append #{s1 18542}# #{m2 18569}#))))))) + (vector-ref #{e 18511}# 3)) #f))))) - (#{match-each-any 15672}# - (lambda (#{e 16328}# #{w 16329}# #{mod 16330}#) - (if (pair? #{e 16328}#) - (let ((#{l 16331}# - (#{match-each-any 15672}# - (cdr #{e 16328}#) - #{w 16329}# - #{mod 16330}#))) - (if #{l 16331}# - (cons (#{wrap 4326}# - (car #{e 16328}#) - #{w 16329}# - #{mod 16330}#) - #{l 16331}#) + (#{match-each-any 17625}# + (lambda (#{e 18578}# #{w 18579}# #{mod 18580}#) + (if (pair? #{e 18578}#) + (let ((#{l 18581}# + (#{match-each-any 17625}# + (cdr #{e 18578}#) + #{w 18579}# + #{mod 18580}#))) + (if #{l 18581}# + (cons (let ((#{x 18586}# (car #{e 18578}#))) + (if (if (null? (car #{w 18579}#)) + (null? (cdr #{w 18579}#)) + #f) + #{x 18586}# + (if (if (vector? #{x 18586}#) + (if (= (vector-length #{x 18586}#) 4) + (eq? (vector-ref #{x 18586}# 0) + 'syntax-object) + #f) + #f) + (let ((#{expression 18604}# + (vector-ref #{x 18586}# 1)) + (#{wrap 18605}# + (let ((#{w2 18613}# + (vector-ref #{x 18586}# 2))) + (let ((#{m1 18614}# (car #{w 18579}#)) + (#{s1 18615}# (cdr #{w 18579}#))) + (if (null? #{m1 18614}#) + (if (null? #{s1 18615}#) + #{w2 18613}# + (cons (car #{w2 18613}#) + (let ((#{m2 18630}# + (cdr #{w2 18613}#))) + (if (null? #{m2 18630}#) + #{s1 18615}# + (append + #{s1 18615}# + #{m2 18630}#))))) + (cons (let ((#{m2 18638}# + (car #{w2 18613}#))) + (if (null? #{m2 18638}#) + #{m1 18614}# + (append + #{m1 18614}# + #{m2 18638}#))) + (let ((#{m2 18646}# + (cdr #{w2 18613}#))) + (if (null? #{m2 18646}#) + #{s1 18615}# + (append + #{s1 18615}# + #{m2 18646}#)))))))) + (#{module 18606}# + (vector-ref #{x 18586}# 3))) + (vector + 'syntax-object + #{expression 18604}# + #{wrap 18605}# + #{module 18606}#)) + (if (null? #{x 18586}#) + #{x 18586}# + (vector + 'syntax-object + #{x 18586}# + #{w 18579}# + #{mod 18580}#))))) + #{l 18581}#) #f)) - (if (null? #{e 16328}#) + (if (null? #{e 18578}#) '() - (if (if (vector? #{e 16328}#) - (if (= (vector-length #{e 16328}#) 4) - (eq? (vector-ref #{e 16328}# 0) 'syntax-object) + (if (if (vector? #{e 18578}#) + (if (= (vector-length #{e 18578}#) 4) + (eq? (vector-ref #{e 18578}# 0) 'syntax-object) #f) #f) - (#{match-each-any 15672}# - (vector-ref #{e 16328}# 1) - (#{join-wraps 4317}# - #{w 16329}# - (vector-ref #{e 16328}# 2)) - #{mod 16330}#) + (#{match-each-any 17625}# + (vector-ref #{e 18578}# 1) + (let ((#{w2 18679}# (vector-ref #{e 18578}# 2))) + (let ((#{m1 18680}# (car #{w 18579}#)) + (#{s1 18681}# (cdr #{w 18579}#))) + (if (null? #{m1 18680}#) + (if (null? #{s1 18681}#) + #{w2 18679}# + (cons (car #{w2 18679}#) + (let ((#{m2 18692}# (cdr #{w2 18679}#))) + (if (null? #{m2 18692}#) + #{s1 18681}# + (append #{s1 18681}# #{m2 18692}#))))) + (cons (let ((#{m2 18700}# (car #{w2 18679}#))) + (if (null? #{m2 18700}#) + #{m1 18680}# + (append #{m1 18680}# #{m2 18700}#))) + (let ((#{m2 18708}# (cdr #{w2 18679}#))) + (if (null? #{m2 18708}#) + #{s1 18681}# + (append #{s1 18681}# #{m2 18708}#))))))) + #{mod 18580}#) #f))))) - (#{match-empty 15673}# - (lambda (#{p 16355}# #{r 16356}#) - (if (null? #{p 16355}#) - #{r 16356}# - (if (eq? #{p 16355}# '_) - #{r 16356}# - (if (eq? #{p 16355}# 'any) - (cons '() #{r 16356}#) - (if (pair? #{p 16355}#) - (#{match-empty 15673}# - (car #{p 16355}#) - (#{match-empty 15673}# - (cdr #{p 16355}#) - #{r 16356}#)) - (if (eq? #{p 16355}# 'each-any) - (cons '() #{r 16356}#) - (let ((#{atom-key 16357}# (vector-ref #{p 16355}# 0))) - (if (eqv? #{atom-key 16357}# 'each) - (#{match-empty 15673}# - (vector-ref #{p 16355}# 1) - #{r 16356}#) - (if (eqv? #{atom-key 16357}# 'each+) - (#{match-empty 15673}# - (vector-ref #{p 16355}# 1) - (#{match-empty 15673}# - (reverse (vector-ref #{p 16355}# 2)) - (#{match-empty 15673}# - (vector-ref #{p 16355}# 3) - #{r 16356}#))) - (if (if (eqv? #{atom-key 16357}# 'free-id) + (#{match-empty 17626}# + (lambda (#{p 18713}# #{r 18714}#) + (if (null? #{p 18713}#) + #{r 18714}# + (if (eq? #{p 18713}# '_) + #{r 18714}# + (if (eq? #{p 18713}# 'any) + (cons '() #{r 18714}#) + (if (pair? #{p 18713}#) + (#{match-empty 17626}# + (car #{p 18713}#) + (#{match-empty 17626}# + (cdr #{p 18713}#) + #{r 18714}#)) + (if (eq? #{p 18713}# 'each-any) + (cons '() #{r 18714}#) + (let ((#{atom-key 18715}# (vector-ref #{p 18713}# 0))) + (if (eqv? #{atom-key 18715}# 'each) + (#{match-empty 17626}# + (vector-ref #{p 18713}# 1) + #{r 18714}#) + (if (eqv? #{atom-key 18715}# 'each+) + (#{match-empty 17626}# + (vector-ref #{p 18713}# 1) + (#{match-empty 17626}# + (reverse (vector-ref #{p 18713}# 2)) + (#{match-empty 17626}# + (vector-ref #{p 18713}# 3) + #{r 18714}#))) + (if (if (eqv? #{atom-key 18715}# 'free-id) #t - (eqv? #{atom-key 16357}# 'atom)) - #{r 16356}# - (if (eqv? #{atom-key 16357}# 'vector) - (#{match-empty 15673}# - (vector-ref #{p 16355}# 1) - #{r 16356}#))))))))))))) - (#{combine 15674}# - (lambda (#{r* 16376}# #{r 16377}#) - (if (null? (car #{r* 16376}#)) - #{r 16377}# - (cons (map car #{r* 16376}#) - (#{combine 15674}# - (map cdr #{r* 16376}#) - #{r 16377}#))))) - (#{match* 15675}# - (lambda (#{e 15705}# - #{p 15706}# - #{w 15707}# - #{r 15708}# - #{mod 15709}#) - (if (null? #{p 15706}#) - (if (null? #{e 15705}#) #{r 15708}# #f) - (if (pair? #{p 15706}#) - (if (pair? #{e 15705}#) - (#{match 15676}# - (car #{e 15705}#) - (car #{p 15706}#) - #{w 15707}# - (#{match 15676}# - (cdr #{e 15705}#) - (cdr #{p 15706}#) - #{w 15707}# - #{r 15708}# - #{mod 15709}#) - #{mod 15709}#) + (eqv? #{atom-key 18715}# 'atom)) + #{r 18714}# + (if (eqv? #{atom-key 18715}# 'vector) + (#{match-empty 17626}# + (vector-ref #{p 18713}# 1) + #{r 18714}#))))))))))))) + (#{combine 17627}# + (lambda (#{r* 18734}# #{r 18735}#) + (if (null? (car #{r* 18734}#)) + #{r 18735}# + (cons (map car #{r* 18734}#) + (#{combine 17627}# + (map cdr #{r* 18734}#) + #{r 18735}#))))) + (#{match* 17628}# + (lambda (#{e 17658}# + #{p 17659}# + #{w 17660}# + #{r 17661}# + #{mod 17662}#) + (if (null? #{p 17659}#) + (if (null? #{e 17658}#) #{r 17661}# #f) + (if (pair? #{p 17659}#) + (if (pair? #{e 17658}#) + (#{match 17629}# + (car #{e 17658}#) + (car #{p 17659}#) + #{w 17660}# + (#{match 17629}# + (cdr #{e 17658}#) + (cdr #{p 17659}#) + #{w 17660}# + #{r 17661}# + #{mod 17662}#) + #{mod 17662}#) #f) - (if (eq? #{p 15706}# 'each-any) - (let ((#{l 15714}# - (#{match-each-any 15672}# - #{e 15705}# - #{w 15707}# - #{mod 15709}#))) - (if #{l 15714}# - (cons #{l 15714}# #{r 15708}#) + (if (eq? #{p 17659}# 'each-any) + (let ((#{l 17667}# + (#{match-each-any 17625}# + #{e 17658}# + #{w 17660}# + #{mod 17662}#))) + (if #{l 17667}# + (cons #{l 17667}# #{r 17661}#) #f)) - (let ((#{atom-key 15719}# (vector-ref #{p 15706}# 0))) - (if (eqv? #{atom-key 15719}# 'each) - (if (null? #{e 15705}#) - (#{match-empty 15673}# - (vector-ref #{p 15706}# 1) - #{r 15708}#) - (let ((#{l 15726}# - (#{match-each 15670}# - #{e 15705}# - (vector-ref #{p 15706}# 1) - #{w 15707}# - #{mod 15709}#))) - (if #{l 15726}# + (let ((#{atom-key 17672}# (vector-ref #{p 17659}# 0))) + (if (eqv? #{atom-key 17672}# 'each) + (if (null? #{e 17658}#) + (#{match-empty 17626}# + (vector-ref #{p 17659}# 1) + #{r 17661}#) + (let ((#{l 17679}# + (#{match-each 17623}# + #{e 17658}# + (vector-ref #{p 17659}# 1) + #{w 17660}# + #{mod 17662}#))) + (if #{l 17679}# (letrec* - ((#{collect 15729}# - (lambda (#{l 15782}#) - (if (null? (car #{l 15782}#)) - #{r 15708}# - (cons (map car #{l 15782}#) - (#{collect 15729}# - (map cdr #{l 15782}#))))))) - (#{collect 15729}# #{l 15726}#)) + ((#{collect 17682}# + (lambda (#{l 17743}#) + (if (null? (car #{l 17743}#)) + #{r 17661}# + (cons (map car #{l 17743}#) + (#{collect 17682}# + (map cdr #{l 17743}#))))))) + (#{collect 17682}# #{l 17679}#)) #f))) - (if (eqv? #{atom-key 15719}# 'each+) + (if (eqv? #{atom-key 17672}# 'each+) (call-with-values (lambda () - (let ((#{x-pat 15791}# (vector-ref #{p 15706}# 1)) - (#{y-pat 15792}# (vector-ref #{p 15706}# 2)) - (#{z-pat 15793}# (vector-ref #{p 15706}# 3))) + (let ((#{x-pat 17752}# (vector-ref #{p 17659}# 1)) + (#{y-pat 17753}# (vector-ref #{p 17659}# 2)) + (#{z-pat 17754}# (vector-ref #{p 17659}# 3))) (letrec* - ((#{f 15797}# - (lambda (#{e 15799}# #{w 15800}#) - (if (pair? #{e 15799}#) + ((#{f 17758}# + (lambda (#{e 17760}# #{w 17761}#) + (if (pair? #{e 17760}#) (call-with-values (lambda () - (#{f 15797}# - (cdr #{e 15799}#) - #{w 15800}#)) - (lambda (#{xr* 15801}# - #{y-pat 15802}# - #{r 15803}#) - (if #{r 15803}# - (if (null? #{y-pat 15802}#) - (let ((#{xr 15804}# - (#{match 15676}# - (car #{e 15799}#) - #{x-pat 15791}# - #{w 15800}# + (#{f 17758}# + (cdr #{e 17760}#) + #{w 17761}#)) + (lambda (#{xr* 17762}# + #{y-pat 17763}# + #{r 17764}#) + (if #{r 17764}# + (if (null? #{y-pat 17763}#) + (let ((#{xr 17765}# + (#{match 17629}# + (car #{e 17760}#) + #{x-pat 17752}# + #{w 17761}# '() - #{mod 15709}#))) - (if #{xr 15804}# + #{mod 17662}#))) + (if #{xr 17765}# (values - (cons #{xr 15804}# - #{xr* 15801}#) - #{y-pat 15802}# - #{r 15803}#) + (cons #{xr 17765}# + #{xr* 17762}#) + #{y-pat 17763}# + #{r 17764}#) (values #f #f #f))) (values '() - (cdr #{y-pat 15802}#) - (#{match 15676}# - (car #{e 15799}#) - (car #{y-pat 15802}#) - #{w 15800}# - #{r 15803}# - #{mod 15709}#))) + (cdr #{y-pat 17763}#) + (#{match 17629}# + (car #{e 17760}#) + (car #{y-pat 17763}#) + #{w 17761}# + #{r 17764}# + #{mod 17662}#))) (values #f #f #f)))) - (if (if (vector? #{e 15799}#) - (if (= (vector-length #{e 15799}#) + (if (if (vector? #{e 17760}#) + (if (= (vector-length #{e 17760}#) 4) - (eq? (vector-ref #{e 15799}# 0) + (eq? (vector-ref #{e 17760}# 0) 'syntax-object) #f) #f) - (#{f 15797}# - (vector-ref #{e 15799}# 1) - (#{join-wraps 4317}# - #{w 15800}# - #{e 15799}#)) + (#{f 17758}# + (vector-ref #{e 17760}# 1) + (let ((#{m1 17793}# + (car #{w 17761}#)) + (#{s1 17794}# + (cdr #{w 17761}#))) + (if (null? #{m1 17793}#) + (if (null? #{s1 17794}#) + #{e 17760}# + (cons (car #{e 17760}#) + (let ((#{m2 17806}# + (cdr #{e 17760}#))) + (if (null? #{m2 17806}#) + #{s1 17794}# + (append + #{s1 17794}# + #{m2 17806}#))))) + (cons (let ((#{m2 17816}# + (car #{e 17760}#))) + (if (null? #{m2 17816}#) + #{m1 17793}# + (append + #{m1 17793}# + #{m2 17816}#))) + (let ((#{m2 17826}# + (cdr #{e 17760}#))) + (if (null? #{m2 17826}#) + #{s1 17794}# + (append + #{s1 17794}# + #{m2 17826}#))))))) (values '() - #{y-pat 15792}# - (#{match 15676}# - #{e 15799}# - #{z-pat 15793}# - #{w 15800}# - #{r 15708}# - #{mod 15709}#))))))) - (#{f 15797}# #{e 15705}# #{w 15707}#)))) - (lambda (#{xr* 15832}# #{y-pat 15833}# #{r 15834}#) - (if #{r 15834}# - (if (null? #{y-pat 15833}#) - (if (null? #{xr* 15832}#) - (#{match-empty 15673}# - (vector-ref #{p 15706}# 1) - #{r 15834}#) - (#{combine 15674}# #{xr* 15832}# #{r 15834}#)) + #{y-pat 17753}# + (#{match 17629}# + #{e 17760}# + #{z-pat 17754}# + #{w 17761}# + #{r 17661}# + #{mod 17662}#))))))) + (#{f 17758}# #{e 17658}# #{w 17660}#)))) + (lambda (#{xr* 17836}# #{y-pat 17837}# #{r 17838}#) + (if #{r 17838}# + (if (null? #{y-pat 17837}#) + (if (null? #{xr* 17836}#) + (#{match-empty 17626}# + (vector-ref #{p 17659}# 1) + #{r 17838}#) + (#{combine 17627}# #{xr* 17836}# #{r 17838}#)) #f) #f))) - (if (eqv? #{atom-key 15719}# 'free-id) - (if (if (symbol? #{e 15705}#) + (if (eqv? #{atom-key 17672}# 'free-id) + (if (if (symbol? #{e 17658}#) #t - (if (if (vector? #{e 15705}#) - (if (= (vector-length #{e 15705}#) 4) - (eq? (vector-ref #{e 15705}# 0) + (if (if (vector? #{e 17658}#) + (if (= (vector-length #{e 17658}#) 4) + (eq? (vector-ref #{e 17658}# 0) 'syntax-object) #f) #f) - (symbol? (vector-ref #{e 15705}# 1)) + (symbol? (vector-ref #{e 17658}# 1)) #f)) - (if (let ((#{i 16197}# - (#{wrap 4326}# - #{e 15705}# - #{w 15707}# - #{mod 15709}#)) - (#{j 16198}# (vector-ref #{p 15706}# 1))) - (if (eq? (if (if (vector? #{i 16197}#) - (if (= (vector-length - #{i 16197}#) - 4) - (eq? (vector-ref - #{i 16197}# - 0) - 'syntax-object) - #f) - #f) - (vector-ref #{i 16197}# 1) - #{i 16197}#) - (if (if (vector? #{j 16198}#) - (if (= (vector-length - #{j 16198}#) - 4) - (eq? (vector-ref - #{j 16198}# - 0) - 'syntax-object) - #f) - #f) - (vector-ref #{j 16198}# 1) - #{j 16198}#)) - (eq? (#{id-var-name 4320}# - #{i 16197}# - '(())) - (#{id-var-name 4320}# - #{j 16198}# - '(()))) - #f)) - #{r 15708}# + (if (#{free-id=? 4431}# + (if (if (null? (car #{w 17660}#)) + (null? (cdr #{w 17660}#)) + #f) + #{e 17658}# + (if (if (vector? #{e 17658}#) + (if (= (vector-length #{e 17658}#) 4) + (eq? (vector-ref #{e 17658}# 0) + 'syntax-object) + #f) + #f) + (let ((#{expression 18269}# + (vector-ref #{e 17658}# 1)) + (#{wrap 18270}# + (let ((#{w2 18280}# + (vector-ref + #{e 17658}# + 2))) + (let ((#{m1 18281}# + (car #{w 17660}#)) + (#{s1 18282}# + (cdr #{w 17660}#))) + (if (null? #{m1 18281}#) + (if (null? #{s1 18282}#) + #{w2 18280}# + (cons (car #{w2 18280}#) + (let ((#{m2 18299}# + (cdr #{w2 18280}#))) + (if (null? #{m2 18299}#) + #{s1 18282}# + (append + #{s1 18282}# + #{m2 18299}#))))) + (cons (let ((#{m2 18307}# + (car #{w2 18280}#))) + (if (null? #{m2 18307}#) + #{m1 18281}# + (append + #{m1 18281}# + #{m2 18307}#))) + (let ((#{m2 18315}# + (cdr #{w2 18280}#))) + (if (null? #{m2 18315}#) + #{s1 18282}# + (append + #{s1 18282}# + #{m2 18315}#)))))))) + (#{module 18271}# + (vector-ref #{e 17658}# 3))) + (vector + 'syntax-object + #{expression 18269}# + #{wrap 18270}# + #{module 18271}#)) + (if (null? #{e 17658}#) + #{e 17658}# + (vector + 'syntax-object + #{e 17658}# + #{w 17660}# + #{mod 17662}#)))) + (vector-ref #{p 17659}# 1)) + #{r 17661}# #f) #f) - (if (eqv? #{atom-key 15719}# 'atom) + (if (eqv? #{atom-key 17672}# 'atom) (if (equal? - (vector-ref #{p 15706}# 1) - (#{strip 4346}# #{e 15705}# #{w 15707}#)) - #{r 15708}# + (vector-ref #{p 17659}# 1) + (#{strip 4456}# #{e 17658}# #{w 17660}#)) + #{r 17661}# #f) - (if (eqv? #{atom-key 15719}# 'vector) - (if (vector? #{e 15705}#) - (#{match 15676}# - (vector->list #{e 15705}#) - (vector-ref #{p 15706}# 1) - #{w 15707}# - #{r 15708}# - #{mod 15709}#) + (if (eqv? #{atom-key 17672}# 'vector) + (if (vector? #{e 17658}#) + (#{match 17629}# + (vector->list #{e 17658}#) + (vector-ref #{p 17659}# 1) + #{w 17660}# + #{r 17661}# + #{mod 17662}#) #f)))))))))))) - (#{match 15676}# - (lambda (#{e 16258}# - #{p 16259}# - #{w 16260}# - #{r 16261}# - #{mod 16262}#) - (if (not #{r 16261}#) + (#{match 17629}# + (lambda (#{e 18348}# + #{p 18349}# + #{w 18350}# + #{r 18351}# + #{mod 18352}#) + (if (not #{r 18351}#) #f - (if (eq? #{p 16259}# '_) - #{r 16261}# - (if (eq? #{p 16259}# 'any) - (cons (#{wrap 4326}# - #{e 16258}# - #{w 16260}# - #{mod 16262}#) - #{r 16261}#) - (if (if (vector? #{e 16258}#) - (if (= (vector-length #{e 16258}#) 4) - (eq? (vector-ref #{e 16258}# 0) 'syntax-object) + (if (eq? #{p 18349}# '_) + #{r 18351}# + (if (eq? #{p 18349}# 'any) + (cons (if (if (null? (car #{w 18350}#)) + (null? (cdr #{w 18350}#)) + #f) + #{e 18348}# + (if (if (vector? #{e 18348}#) + (if (= (vector-length #{e 18348}#) 4) + (eq? (vector-ref #{e 18348}# 0) + 'syntax-object) + #f) + #f) + (let ((#{expression 18382}# + (vector-ref #{e 18348}# 1)) + (#{wrap 18383}# + (let ((#{w2 18393}# + (vector-ref #{e 18348}# 2))) + (let ((#{m1 18394}# (car #{w 18350}#)) + (#{s1 18395}# (cdr #{w 18350}#))) + (if (null? #{m1 18394}#) + (if (null? #{s1 18395}#) + #{w2 18393}# + (cons (car #{w2 18393}#) + (let ((#{m2 18412}# + (cdr #{w2 18393}#))) + (if (null? #{m2 18412}#) + #{s1 18395}# + (append + #{s1 18395}# + #{m2 18412}#))))) + (cons (let ((#{m2 18420}# + (car #{w2 18393}#))) + (if (null? #{m2 18420}#) + #{m1 18394}# + (append + #{m1 18394}# + #{m2 18420}#))) + (let ((#{m2 18428}# + (cdr #{w2 18393}#))) + (if (null? #{m2 18428}#) + #{s1 18395}# + (append + #{s1 18395}# + #{m2 18428}#)))))))) + (#{module 18384}# (vector-ref #{e 18348}# 3))) + (vector + 'syntax-object + #{expression 18382}# + #{wrap 18383}# + #{module 18384}#)) + (if (null? #{e 18348}#) + #{e 18348}# + (vector + 'syntax-object + #{e 18348}# + #{w 18350}# + #{mod 18352}#)))) + #{r 18351}#) + (if (if (vector? #{e 18348}#) + (if (= (vector-length #{e 18348}#) 4) + (eq? (vector-ref #{e 18348}# 0) 'syntax-object) #f) #f) - (#{match* 15675}# - (vector-ref #{e 16258}# 1) - #{p 16259}# - (#{join-wraps 4317}# - #{w 16260}# - (vector-ref #{e 16258}# 2)) - #{r 16261}# - (vector-ref #{e 16258}# 3)) - (#{match* 15675}# - #{e 16258}# - #{p 16259}# - #{w 16260}# - #{r 16261}# - #{mod 16262}#)))))))) + (#{match* 17628}# + (vector-ref #{e 18348}# 1) + #{p 18349}# + (let ((#{w2 18471}# (vector-ref #{e 18348}# 2))) + (let ((#{m1 18472}# (car #{w 18350}#)) + (#{s1 18473}# (cdr #{w 18350}#))) + (if (null? #{m1 18472}#) + (if (null? #{s1 18473}#) + #{w2 18471}# + (cons (car #{w2 18471}#) + (let ((#{m2 18484}# (cdr #{w2 18471}#))) + (if (null? #{m2 18484}#) + #{s1 18473}# + (append #{s1 18473}# #{m2 18484}#))))) + (cons (let ((#{m2 18492}# (car #{w2 18471}#))) + (if (null? #{m2 18492}#) + #{m1 18472}# + (append #{m1 18472}# #{m2 18492}#))) + (let ((#{m2 18500}# (cdr #{w2 18471}#))) + (if (null? #{m2 18500}#) + #{s1 18473}# + (append #{s1 18473}# #{m2 18500}#))))))) + #{r 18351}# + (vector-ref #{e 18348}# 3)) + (#{match* 17628}# + #{e 18348}# + #{p 18349}# + #{w 18350}# + #{r 18351}# + #{mod 18352}#)))))))) (set! $sc-dispatch - (lambda (#{e 15677}# #{p 15678}#) - (if (eq? #{p 15678}# 'any) - (list #{e 15677}#) - (if (eq? #{p 15678}# '_) + (lambda (#{e 17630}# #{p 17631}#) + (if (eq? #{p 17631}# 'any) + (list #{e 17630}#) + (if (eq? #{p 17631}# '_) '() - (if (if (vector? #{e 15677}#) - (if (= (vector-length #{e 15677}#) 4) - (eq? (vector-ref #{e 15677}# 0) 'syntax-object) + (if (if (vector? #{e 17630}#) + (if (= (vector-length #{e 17630}#) 4) + (eq? (vector-ref #{e 17630}# 0) 'syntax-object) #f) #f) - (#{match* 15675}# - (vector-ref #{e 15677}# 1) - #{p 15678}# - (vector-ref #{e 15677}# 2) + (#{match* 17628}# + (vector-ref #{e 17630}# 1) + #{p 17631}# + (vector-ref #{e 17630}# 2) '() - (vector-ref #{e 15677}# 3)) - (#{match* 15675}# - #{e 15677}# - #{p 15678}# + (vector-ref #{e 17630}# 3)) + (#{match* 17628}# + #{e 17630}# + #{p 17631}# '(()) '() #f))))))))) @@ -21818,82 +17731,118 @@ (make-syntax-transformer 'with-syntax 'macro - (lambda (#{x 28920}#) - (let ((#{tmp 28922}# - ($sc-dispatch #{x 28920}# '(_ () any . each-any)))) - (if #{tmp 28922}# + (lambda (#{x 36772}#) + (let ((#{tmp 36774}# + ($sc-dispatch #{x 36772}# '(_ () any . each-any)))) + (if #{tmp 36774}# (@apply - (lambda (#{e1 28926}# #{e2 28927}#) + (lambda (#{e1 36778}# #{e2 36779}#) (cons '#(syntax-object let ((top) #(ribcage #(e1 e2) #((top) (top)) - #("i28893" "i28894")) + #("i36745" "i36746")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i28890"))) + #(ribcage #(x) #((top)) #("i36742")) + #(ribcage + (with-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + with-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) - (cons '() (cons #{e1 28926}# #{e2 28927}#)))) - #{tmp 28922}#) - (let ((#{tmp 28928}# + (cons '() (cons #{e1 36778}# #{e2 36779}#)))) + #{tmp 36774}#) + (let ((#{tmp 36780}# ($sc-dispatch - #{x 28920}# + #{x 36772}# '(_ ((any any)) any . each-any)))) - (if #{tmp 28928}# + (if #{tmp 36780}# (@apply - (lambda (#{out 28932}# - #{in 28933}# - #{e1 28934}# - #{e2 28935}#) + (lambda (#{out 36784}# + #{in 36785}# + #{e1 36786}# + #{e2 36787}#) (list '#(syntax-object syntax-case ((top) #(ribcage #(out in e1 e2) #((top) (top) (top) (top)) - #("i28899" "i28900" "i28901" "i28902")) + #("i36751" "i36752" "i36753" "i36754")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i28890"))) + #(ribcage #(x) #((top)) #("i36742")) + #(ribcage + (with-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + with-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) - #{in 28933}# + #{in 36785}# '() - (list #{out 28932}# + (list #{out 36784}# (cons '#(syntax-object let ((top) #(ribcage #(out in e1 e2) #((top) (top) (top) (top)) - #("i28899" - "i28900" - "i28901" - "i28902")) + #("i36751" + "i36752" + "i36753" + "i36754")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i28890"))) + #(ribcage #(x) #((top)) #("i36742")) + #(ribcage + (with-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + with-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) (cons '() - (cons #{e1 28934}# #{e2 28935}#)))))) - #{tmp 28928}#) - (let ((#{tmp 28936}# + (cons #{e1 36786}# #{e2 36787}#)))))) + #{tmp 36780}#) + (let ((#{tmp 36788}# ($sc-dispatch - #{x 28920}# + #{x 36772}# '(_ #(each (any any)) any . each-any)))) - (if #{tmp 28936}# + (if #{tmp 36788}# (@apply - (lambda (#{out 28940}# - #{in 28941}# - #{e1 28942}# - #{e2 28943}#) + (lambda (#{out 36792}# + #{in 36793}# + #{e1 36794}# + #{e2 36795}#) (list '#(syntax-object syntax-case ((top) #(ribcage #(out in e1 e2) #((top) (top) (top) (top)) - #("i28909" "i28910" "i28911" "i28912")) + #("i36761" "i36762" "i36763" "i36764")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i28890"))) + #(ribcage #(x) #((top)) #("i36742")) + #(ribcage + (with-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + with-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) (cons '#(syntax-object list @@ -21901,62 +17850,89 @@ #(ribcage #(out in e1 e2) #((top) (top) (top) (top)) - #("i28909" "i28910" "i28911" "i28912")) + #("i36761" "i36762" "i36763" "i36764")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i28890"))) + #(ribcage #(x) #((top)) #("i36742")) + #(ribcage + (with-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + with-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) - #{in 28941}#) + #{in 36793}#) '() - (list #{out 28940}# + (list #{out 36792}# (cons '#(syntax-object let ((top) #(ribcage #(out in e1 e2) #((top) (top) (top) (top)) - #("i28909" - "i28910" - "i28911" - "i28912")) + #("i36761" + "i36762" + "i36763" + "i36764")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("i28890"))) + #("i36742")) + #(ribcage + (with-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + with-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) (cons '() - (cons #{e1 28942}# - #{e2 28943}#)))))) - #{tmp 28936}#) + (cons #{e1 36794}# + #{e2 36795}#)))))) + #{tmp 36788}#) (syntax-violation #f "source expression failed to match any pattern" - #{x 28920}#)))))))))) + #{x 36772}#)))))))))) (define syntax-rules (make-syntax-transformer 'syntax-rules 'macro - (lambda (#{x 28997}#) - (let ((#{tmp 28999}# + (lambda (#{x 36850}#) + (let ((#{tmp 36852}# ($sc-dispatch - #{x 28997}# + #{x 36850}# '(_ each-any . #(each ((any . any) any)))))) - (if #{tmp 28999}# + (if #{tmp 36852}# (@apply - (lambda (#{k 29003}# - #{keyword 29004}# - #{pattern 29005}# - #{template 29006}#) + (lambda (#{k 36856}# + #{keyword 36857}# + #{pattern 36858}# + #{template 36859}#) (list '#(syntax-object lambda ((top) #(ribcage #(k keyword pattern template) #((top) (top) (top) (top)) - #("i28960" "i28961" "i28962" "i28963")) + #("i36813" "i36814" "i36815" "i36816")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i28957"))) + #(ribcage #(x) #((top)) #("i36810")) + #(ribcage + (syntax-rules) + ((top)) + (((hygiene guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene guile)))))) (hygiene guile)) '(#(syntax-object x @@ -21964,9 +17940,18 @@ #(ribcage #(k keyword pattern template) #((top) (top) (top) (top)) - #("i28960" "i28961" "i28962" "i28963")) + #("i36813" "i36814" "i36815" "i36816")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i28957"))) + #(ribcage #(x) #((top)) #("i36810")) + #(ribcage + (syntax-rules) + ((top)) + (((hygiene guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene guile)))))) (hygiene guile))) (vector '(#(syntax-object @@ -21975,9 +17960,18 @@ #(ribcage #(k keyword pattern template) #((top) (top) (top) (top)) - #("i28960" "i28961" "i28962" "i28963")) + #("i36813" "i36814" "i36815" "i36816")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i28957"))) + #(ribcage #(x) #((top)) #("i36810")) + #(ribcage + (syntax-rules) + ((top)) + (((hygiene guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene guile)))))) (hygiene guile)) . #(syntax-object @@ -21986,9 +17980,18 @@ #(ribcage #(k keyword pattern template) #((top) (top) (top) (top)) - #("i28960" "i28961" "i28962" "i28963")) + #("i36813" "i36814" "i36815" "i36816")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i28957"))) + #(ribcage #(x) #((top)) #("i36810")) + #(ribcage + (syntax-rules) + ((top)) + (((hygiene guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene guile)))))) (hygiene guile))) (cons '#(syntax-object patterns @@ -21996,20 +17999,38 @@ #(ribcage #(k keyword pattern template) #((top) (top) (top) (top)) - #("i28960" "i28961" "i28962" "i28963")) + #("i36813" "i36814" "i36815" "i36816")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i28957"))) + #(ribcage #(x) #((top)) #("i36810")) + #(ribcage + (syntax-rules) + ((top)) + (((hygiene guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene guile)))))) (hygiene guile)) - #{pattern 29005}#)) + #{pattern 36858}#)) (cons '#(syntax-object syntax-case ((top) #(ribcage #(k keyword pattern template) #((top) (top) (top) (top)) - #("i28960" "i28961" "i28962" "i28963")) + #("i36813" "i36814" "i36815" "i36816")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i28957"))) + #(ribcage #(x) #((top)) #("i36810")) + #(ribcage + (syntax-rules) + ((top)) + (((hygiene guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene guile)))))) (hygiene guile)) (cons '#(syntax-object x @@ -22017,15 +18038,24 @@ #(ribcage #(k keyword pattern template) #((top) (top) (top) (top)) - #("i28960" "i28961" "i28962" "i28963")) + #("i36813" "i36814" "i36815" "i36816")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i28957"))) + #(ribcage #(x) #((top)) #("i36810")) + #(ribcage + (syntax-rules) + ((top)) + (((hygiene guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene guile)))))) (hygiene guile)) - (cons #{k 29003}# - (map (lambda (#{tmp 28971 29007}# - #{tmp 28970 29008}#) + (cons #{k 36856}# + (map (lambda (#{tmp 36824 36860}# + #{tmp 36823 36861}#) (list (cons '#(syntax-object - dummy + _ ((top) #(ribcage #(k @@ -22036,10 +18066,10 @@ (top) (top) (top)) - #("i28960" - "i28961" - "i28962" - "i28963")) + #("i36813" + "i36814" + "i36815" + "i36816")) #(ribcage () () @@ -22047,9 +18077,20 @@ #(ribcage #(x) #((top)) - #("i28957"))) + #("i36810")) + #(ribcage + (syntax-rules) + ((top)) + (((hygiene + guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene + guile)))))) (hygiene guile)) - #{tmp 28970 29008}#) + #{tmp 36823 36861}#) (list '#(syntax-object syntax ((top) @@ -22062,10 +18103,10 @@ (top) (top) (top)) - #("i28960" - "i28961" - "i28962" - "i28963")) + #("i36813" + "i36814" + "i36815" + "i36816")) #(ribcage () () @@ -22073,41 +18114,61 @@ #(ribcage #(x) #((top)) - #("i28957"))) + #("i36810")) + #(ribcage + (syntax-rules) + ((top)) + (((hygiene + guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene + guile)))))) (hygiene guile)) - #{tmp 28971 29007}#))) - #{template 29006}# - #{pattern 29005}#)))))) - #{tmp 28999}#) - (let ((#{tmp 29009}# + #{tmp 36824 36860}#))) + #{template 36859}# + #{pattern 36858}#)))))) + #{tmp 36852}#) + (let ((#{tmp 36862}# ($sc-dispatch - #{x 28997}# + #{x 36850}# '(_ each-any any . #(each ((any . any) any)))))) - (if (if #{tmp 29009}# + (if (if #{tmp 36862}# (@apply - (lambda (#{k 29013}# - #{docstring 29014}# - #{keyword 29015}# - #{pattern 29016}# - #{template 29017}#) - (string? (syntax->datum #{docstring 29014}#))) - #{tmp 29009}#) + (lambda (#{k 36866}# + #{docstring 36867}# + #{keyword 36868}# + #{pattern 36869}# + #{template 36870}#) + (string? (syntax->datum #{docstring 36867}#))) + #{tmp 36862}#) #f) (@apply - (lambda (#{k 29018}# - #{docstring 29019}# - #{keyword 29020}# - #{pattern 29021}# - #{template 29022}#) + (lambda (#{k 36871}# + #{docstring 36872}# + #{keyword 36873}# + #{pattern 36874}# + #{template 36875}#) (list '#(syntax-object lambda ((top) #(ribcage #(k docstring keyword pattern template) #((top) (top) (top) (top) (top)) - #("i28983" "i28984" "i28985" "i28986" "i28987")) + #("i36836" "i36837" "i36838" "i36839" "i36840")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i28957"))) + #(ribcage #(x) #((top)) #("i36810")) + #(ribcage + (syntax-rules) + ((top)) + (((hygiene guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene guile)))))) (hygiene guile)) '(#(syntax-object x @@ -22115,11 +18176,20 @@ #(ribcage #(k docstring keyword pattern template) #((top) (top) (top) (top) (top)) - #("i28983" "i28984" "i28985" "i28986" "i28987")) + #("i36836" "i36837" "i36838" "i36839" "i36840")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i28957"))) + #(ribcage #(x) #((top)) #("i36810")) + #(ribcage + (syntax-rules) + ((top)) + (((hygiene guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene guile)))))) (hygiene guile))) - #{docstring 29019}# + #{docstring 36872}# (vector '(#(syntax-object macro-type @@ -22127,13 +18197,22 @@ #(ribcage #(k docstring keyword pattern template) #((top) (top) (top) (top) (top)) - #("i28983" - "i28984" - "i28985" - "i28986" - "i28987")) + #("i36836" + "i36837" + "i36838" + "i36839" + "i36840")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i28957"))) + #(ribcage #(x) #((top)) #("i36810")) + #(ribcage + (syntax-rules) + ((top)) + (((hygiene guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene guile)))))) (hygiene guile)) . #(syntax-object @@ -22142,13 +18221,22 @@ #(ribcage #(k docstring keyword pattern template) #((top) (top) (top) (top) (top)) - #("i28983" - "i28984" - "i28985" - "i28986" - "i28987")) + #("i36836" + "i36837" + "i36838" + "i36839" + "i36840")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i28957"))) + #(ribcage #(x) #((top)) #("i36810")) + #(ribcage + (syntax-rules) + ((top)) + (((hygiene guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene guile)))))) (hygiene guile))) (cons '#(syntax-object patterns @@ -22156,28 +18244,46 @@ #(ribcage #(k docstring keyword pattern template) #((top) (top) (top) (top) (top)) - #("i28983" - "i28984" - "i28985" - "i28986" - "i28987")) + #("i36836" + "i36837" + "i36838" + "i36839" + "i36840")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i28957"))) + #(ribcage #(x) #((top)) #("i36810")) + #(ribcage + (syntax-rules) + ((top)) + (((hygiene guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene guile)))))) (hygiene guile)) - #{pattern 29021}#)) + #{pattern 36874}#)) (cons '#(syntax-object syntax-case ((top) #(ribcage #(k docstring keyword pattern template) #((top) (top) (top) (top) (top)) - #("i28983" - "i28984" - "i28985" - "i28986" - "i28987")) + #("i36836" + "i36837" + "i36838" + "i36839" + "i36840")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i28957"))) + #(ribcage #(x) #((top)) #("i36810")) + #(ribcage + (syntax-rules) + ((top)) + (((hygiene guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene guile)))))) (hygiene guile)) (cons '#(syntax-object x @@ -22189,19 +18295,28 @@ pattern template) #((top) (top) (top) (top) (top)) - #("i28983" - "i28984" - "i28985" - "i28986" - "i28987")) + #("i36836" + "i36837" + "i36838" + "i36839" + "i36840")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i28957"))) + #(ribcage #(x) #((top)) #("i36810")) + #(ribcage + (syntax-rules) + ((top)) + (((hygiene guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene guile)))))) (hygiene guile)) - (cons #{k 29018}# - (map (lambda (#{tmp 28996 29023}# - #{tmp 28995 29024}#) + (cons #{k 36871}# + (map (lambda (#{tmp 36849 36876}# + #{tmp 36848 36877}#) (list (cons '#(syntax-object - dummy + _ ((top) #(ribcage #(k @@ -22214,11 +18329,11 @@ (top) (top) (top)) - #("i28983" - "i28984" - "i28985" - "i28986" - "i28987")) + #("i36836" + "i36837" + "i36838" + "i36839" + "i36840")) #(ribcage () () @@ -22226,10 +18341,21 @@ #(ribcage #(x) #((top)) - #("i28957"))) + #("i36810")) + #(ribcage + (syntax-rules) + ((top)) + (((hygiene + guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene + guile)))))) (hygiene guile)) - #{tmp 28995 29024}#) + #{tmp 36848 36877}#) (list '#(syntax-object syntax ((top) @@ -22244,11 +18370,11 @@ (top) (top) (top)) - #("i28983" - "i28984" - "i28985" - "i28986" - "i28987")) + #("i36836" + "i36837" + "i36838" + "i36839" + "i36840")) #(ribcage () () @@ -22256,50 +18382,79 @@ #(ribcage #(x) #((top)) - #("i28957"))) + #("i36810")) + #(ribcage + (syntax-rules) + ((top)) + (((hygiene + guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene + guile)))))) (hygiene guile)) - #{tmp 28996 29023}#))) - #{template 29022}# - #{pattern 29021}#)))))) - #{tmp 29009}#) + #{tmp 36849 36876}#))) + #{template 36875}# + #{pattern 36874}#)))))) + #{tmp 36862}#) (syntax-violation #f "source expression failed to match any pattern" - #{x 28997}#)))))))) + #{x 36850}#)))))))) (define define-syntax-rule (make-syntax-transformer 'define-syntax-rule 'macro - (lambda (#{x 29061}#) - (let ((#{tmp 29063}# - ($sc-dispatch #{x 29061}# '(_ (any . any) any)))) - (if #{tmp 29063}# + (lambda (#{x 36915}#) + (let ((#{tmp 36917}# + ($sc-dispatch #{x 36915}# '(_ (any . any) any)))) + (if #{tmp 36917}# (@apply - (lambda (#{name 29067}# - #{pattern 29068}# - #{template 29069}#) + (lambda (#{name 36921}# + #{pattern 36922}# + #{template 36923}#) (list '#(syntax-object define-syntax ((top) #(ribcage #(name pattern template) #((top) (top) (top)) - #("i29038" "i29039" "i29040")) + #("i36892" "i36893" "i36894")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i29035"))) + #(ribcage #(x) #((top)) #("i36889")) + #(ribcage + (define-syntax-rule) + ((top)) + (((hygiene guile) + . + #(syntax-object + define-syntax-rule + ((top)) + (hygiene guile)))))) (hygiene guile)) - #{name 29067}# + #{name 36921}# (list '#(syntax-object syntax-rules ((top) #(ribcage #(name pattern template) #((top) (top) (top)) - #("i29038" "i29039" "i29040")) + #("i36892" "i36893" "i36894")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i29035"))) + #(ribcage #(x) #((top)) #("i36889")) + #(ribcage + (define-syntax-rule) + ((top)) + (((hygiene guile) + . + #(syntax-object + define-syntax-rule + ((top)) + (hygiene guile)))))) (hygiene guile)) '() (list (cons '#(syntax-object @@ -22308,54 +18463,81 @@ #(ribcage #(name pattern template) #((top) (top) (top)) - #("i29038" "i29039" "i29040")) + #("i36892" "i36893" "i36894")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i29035"))) + #(ribcage #(x) #((top)) #("i36889")) + #(ribcage + (define-syntax-rule) + ((top)) + (((hygiene guile) + . + #(syntax-object + define-syntax-rule + ((top)) + (hygiene guile)))))) (hygiene guile)) - #{pattern 29068}#) - #{template 29069}#)))) - #{tmp 29063}#) - (let ((#{tmp 29070}# + #{pattern 36922}#) + #{template 36923}#)))) + #{tmp 36917}#) + (let ((#{tmp 36924}# ($sc-dispatch - #{x 29061}# + #{x 36915}# '(_ (any . any) any any)))) - (if (if #{tmp 29070}# + (if (if #{tmp 36924}# (@apply - (lambda (#{name 29074}# - #{pattern 29075}# - #{docstring 29076}# - #{template 29077}#) - (string? (syntax->datum #{docstring 29076}#))) - #{tmp 29070}#) + (lambda (#{name 36928}# + #{pattern 36929}# + #{docstring 36930}# + #{template 36931}#) + (string? (syntax->datum #{docstring 36930}#))) + #{tmp 36924}#) #f) (@apply - (lambda (#{name 29078}# - #{pattern 29079}# - #{docstring 29080}# - #{template 29081}#) + (lambda (#{name 36932}# + #{pattern 36933}# + #{docstring 36934}# + #{template 36935}#) (list '#(syntax-object define-syntax ((top) #(ribcage #(name pattern docstring template) #((top) (top) (top) (top)) - #("i29053" "i29054" "i29055" "i29056")) + #("i36907" "i36908" "i36909" "i36910")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i29035"))) + #(ribcage #(x) #((top)) #("i36889")) + #(ribcage + (define-syntax-rule) + ((top)) + (((hygiene guile) + . + #(syntax-object + define-syntax-rule + ((top)) + (hygiene guile)))))) (hygiene guile)) - #{name 29078}# + #{name 36932}# (list '#(syntax-object syntax-rules ((top) #(ribcage #(name pattern docstring template) #((top) (top) (top) (top)) - #("i29053" "i29054" "i29055" "i29056")) + #("i36907" "i36908" "i36909" "i36910")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i29035"))) + #(ribcage #(x) #((top)) #("i36889")) + #(ribcage + (define-syntax-rule) + ((top)) + (((hygiene guile) + . + #(syntax-object + define-syntax-rule + ((top)) + (hygiene guile)))))) (hygiene guile)) '() - #{docstring 29080}# + #{docstring 36934}# (list (cons '#(syntax-object _ ((top) @@ -22365,53 +18547,62 @@ docstring template) #((top) (top) (top) (top)) - #("i29053" - "i29054" - "i29055" - "i29056")) + #("i36907" + "i36908" + "i36909" + "i36910")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("i29035"))) + #("i36889")) + #(ribcage + (define-syntax-rule) + ((top)) + (((hygiene guile) + . + #(syntax-object + define-syntax-rule + ((top)) + (hygiene guile)))))) (hygiene guile)) - #{pattern 29079}#) - #{template 29081}#)))) - #{tmp 29070}#) + #{pattern 36933}#) + #{template 36935}#)))) + #{tmp 36924}#) (syntax-violation #f "source expression failed to match any pattern" - #{x 29061}#)))))))) + #{x 36915}#)))))))) (define let* (make-syntax-transformer 'let* 'macro - (lambda (#{x 29130}#) - (let ((#{tmp 29132}# + (lambda (#{x 36985}#) + (let ((#{tmp 36987}# ($sc-dispatch - #{x 29130}# + #{x 36985}# '(any #(each (any any)) any . each-any)))) - (if (if #{tmp 29132}# + (if (if #{tmp 36987}# (@apply - (lambda (#{let* 29136}# - #{x 29137}# - #{v 29138}# - #{e1 29139}# - #{e2 29140}#) - (and-map identifier? #{x 29137}#)) - #{tmp 29132}#) + (lambda (#{let* 36991}# + #{x 36992}# + #{v 36993}# + #{e1 36994}# + #{e2 36995}#) + (and-map identifier? #{x 36992}#)) + #{tmp 36987}#) #f) (@apply - (lambda (#{let* 29141}# - #{x 29142}# - #{v 29143}# - #{e1 29144}# - #{e2 29145}#) + (lambda (#{let* 36996}# + #{x 36997}# + #{v 36998}# + #{e1 36999}# + #{e2 37000}#) (letrec* - ((#{f 29146}# - (lambda (#{bindings 29149}#) - (if (null? #{bindings 29149}#) + ((#{f 37001}# + (lambda (#{bindings 37004}#) + (if (null? #{bindings 37004}#) (cons '#(syntax-object let ((top) @@ -22419,27 +18610,36 @@ #(ribcage #(f bindings) #((top) (top)) - #("i29116" "i29117")) + #("i36971" "i36972")) #(ribcage #(let* x v e1 e2) #((top) (top) (top) (top) (top)) - #("i29106" - "i29107" - "i29108" - "i29109" - "i29110")) + #("i36961" + "i36962" + "i36963" + "i36964" + "i36965")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i29092"))) + #(ribcage #(x) #((top)) #("i36947")) + #(ribcage + (let*) + ((top)) + (((hygiene guile) + . + #(syntax-object + let* + ((top)) + (hygiene guile)))))) (hygiene guile)) - (cons '() (cons #{e1 29144}# #{e2 29145}#))) - (let ((#{tmp 29150}# - (list (#{f 29146}# (cdr #{bindings 29149}#)) - (car #{bindings 29149}#)))) - (let ((#{tmp 29151}# - ($sc-dispatch #{tmp 29150}# '(any any)))) - (if #{tmp 29151}# + (cons '() (cons #{e1 36999}# #{e2 37000}#))) + (let ((#{tmp 37005}# + (list (#{f 37001}# (cdr #{bindings 37004}#)) + (car #{bindings 37004}#)))) + (let ((#{tmp 37006}# + ($sc-dispatch #{tmp 37005}# '(any any)))) + (if #{tmp 37006}# (@apply - (lambda (#{body 29153}# #{binding 29154}#) + (lambda (#{body 37008}# #{binding 37009}#) (list '#(syntax-object let ((top) @@ -22447,86 +18647,92 @@ #(ribcage #(body binding) #((top) (top)) - #("i29126" "i29127")) + #("i36981" "i36982")) #(ribcage () () ()) #(ribcage #(f bindings) #((top) (top)) - #("i29116" "i29117")) + #("i36971" "i36972")) #(ribcage #(let* x v e1 e2) #((top) (top) (top) (top) (top)) - #("i29106" - "i29107" - "i29108" - "i29109" - "i29110")) + #("i36961" + "i36962" + "i36963" + "i36964" + "i36965")) #(ribcage () () ()) + #(ribcage #(x) #((top)) #("i36947")) #(ribcage - #(x) - #((top)) - #("i29092"))) + (let*) + ((top)) + (((hygiene guile) + . + #(syntax-object + let* + ((top)) + (hygiene guile)))))) (hygiene guile)) - (list #{binding 29154}#) - #{body 29153}#)) - #{tmp 29151}#) + (list #{binding 37009}#) + #{body 37008}#)) + #{tmp 37006}#) (syntax-violation #f "source expression failed to match any pattern" - #{tmp 29150}#)))))))) - (#{f 29146}# (map list #{x 29142}# #{v 29143}#)))) - #{tmp 29132}#) + #{tmp 37005}#)))))))) + (#{f 37001}# (map list #{x 36997}# #{v 36998}#)))) + #{tmp 36987}#) (syntax-violation #f "source expression failed to match any pattern" - #{x 29130}#)))))) + #{x 36985}#)))))) (define do (make-syntax-transformer 'do 'macro - (lambda (#{orig-x 29212}#) - (let ((#{tmp 29214}# + (lambda (#{orig-x 37068}#) + (let ((#{tmp 37070}# ($sc-dispatch - #{orig-x 29212}# + #{orig-x 37068}# '(_ #(each (any any . any)) (any . each-any) . each-any)))) - (if #{tmp 29214}# + (if #{tmp 37070}# (@apply - (lambda (#{var 29218}# - #{init 29219}# - #{step 29220}# - #{e0 29221}# - #{e1 29222}# - #{c 29223}#) - (let ((#{tmp 29224}# - (map (lambda (#{v 29227}# #{s 29228}#) - (let ((#{tmp 29230}# - ($sc-dispatch #{s 29228}# '()))) - (if #{tmp 29230}# - (@apply (lambda () #{v 29227}#) #{tmp 29230}#) - (let ((#{tmp 29233}# - ($sc-dispatch #{s 29228}# '(any)))) - (if #{tmp 29233}# + (lambda (#{var 37074}# + #{init 37075}# + #{step 37076}# + #{e0 37077}# + #{e1 37078}# + #{c 37079}#) + (let ((#{tmp 37080}# + (map (lambda (#{v 37083}# #{s 37084}#) + (let ((#{tmp 37086}# + ($sc-dispatch #{s 37084}# '()))) + (if #{tmp 37086}# + (@apply (lambda () #{v 37083}#) #{tmp 37086}#) + (let ((#{tmp 37089}# + ($sc-dispatch #{s 37084}# '(any)))) + (if #{tmp 37089}# (@apply - (lambda (#{e 29236}#) #{e 29236}#) - #{tmp 29233}#) + (lambda (#{e 37092}#) #{e 37092}#) + #{tmp 37089}#) (syntax-violation 'do "bad step expression" - #{orig-x 29212}# - #{s 29228}#)))))) - #{var 29218}# - #{step 29220}#))) - (let ((#{tmp 29225}# - ($sc-dispatch #{tmp 29224}# 'each-any))) - (if #{tmp 29225}# + #{orig-x 37068}# + #{s 37084}#)))))) + #{var 37074}# + #{step 37076}#))) + (let ((#{tmp 37081}# + ($sc-dispatch #{tmp 37080}# 'each-any))) + (if #{tmp 37081}# (@apply - (lambda (#{step 29242}#) - (let ((#{tmp 29244}# ($sc-dispatch #{e1 29222}# '()))) - (if #{tmp 29244}# + (lambda (#{step 37098}#) + (let ((#{tmp 37100}# ($sc-dispatch #{e1 37078}# '()))) + (if #{tmp 37100}# (@apply (lambda () (list '#(syntax-object @@ -22536,7 +18742,7 @@ #(ribcage #(step) #((top)) - #("i29180")) + #("i37036")) #(ribcage #(var init step e0 e1 c) #((top) @@ -22545,17 +18751,26 @@ (top) (top) (top)) - #("i29165" - "i29166" - "i29167" - "i29168" - "i29169" - "i29170")) + #("i37021" + "i37022" + "i37023" + "i37024" + "i37025" + "i37026")) #(ribcage () () ()) #(ribcage #(orig-x) #((top)) - #("i29162"))) + #("i37018")) + #(ribcage + (do) + ((top)) + (((hygiene guile) + . + #(syntax-object + do + ((top)) + (hygiene guile)))))) (hygiene guile)) '#(syntax-object doloop @@ -22564,7 +18779,7 @@ #(ribcage #(step) #((top)) - #("i29180")) + #("i37036")) #(ribcage #(var init step e0 e1 c) #((top) @@ -22573,19 +18788,28 @@ (top) (top) (top)) - #("i29165" - "i29166" - "i29167" - "i29168" - "i29169" - "i29170")) + #("i37021" + "i37022" + "i37023" + "i37024" + "i37025" + "i37026")) #(ribcage () () ()) #(ribcage #(orig-x) #((top)) - #("i29162"))) + #("i37018")) + #(ribcage + (do) + ((top)) + (((hygiene guile) + . + #(syntax-object + do + ((top)) + (hygiene guile)))))) (hygiene guile)) - (map list #{var 29218}# #{init 29219}#) + (map list #{var 37074}# #{init 37075}#) (list '#(syntax-object if ((top) @@ -22593,7 +18817,7 @@ #(ribcage #(step) #((top)) - #("i29180")) + #("i37036")) #(ribcage #(var init step e0 e1 c) #((top) @@ -22602,17 +18826,26 @@ (top) (top) (top)) - #("i29165" - "i29166" - "i29167" - "i29168" - "i29169" - "i29170")) + #("i37021" + "i37022" + "i37023" + "i37024" + "i37025" + "i37026")) #(ribcage () () ()) #(ribcage #(orig-x) #((top)) - #("i29162"))) + #("i37018")) + #(ribcage + (do) + ((top)) + (((hygiene guile) + . + #(syntax-object + do + ((top)) + (hygiene guile)))))) (hygiene guile)) (list '#(syntax-object not @@ -22621,7 +18854,7 @@ #(ribcage #(step) #((top)) - #("i29180")) + #("i37036")) #(ribcage #(var init @@ -22635,19 +18868,29 @@ (top) (top) (top)) - #("i29165" - "i29166" - "i29167" - "i29168" - "i29169" - "i29170")) + #("i37021" + "i37022" + "i37023" + "i37024" + "i37025" + "i37026")) #(ribcage () () ()) #(ribcage #(orig-x) #((top)) - #("i29162"))) + #("i37018")) + #(ribcage + (do) + ((top)) + (((hygiene guile) + . + #(syntax-object + do + ((top)) + (hygiene + guile)))))) (hygiene guile)) - #{e0 29221}#) + #{e0 37077}#) (cons '#(syntax-object begin ((top) @@ -22655,7 +18898,7 @@ #(ribcage #(step) #((top)) - #("i29180")) + #("i37036")) #(ribcage #(var init @@ -22669,20 +18912,30 @@ (top) (top) (top)) - #("i29165" - "i29166" - "i29167" - "i29168" - "i29169" - "i29170")) + #("i37021" + "i37022" + "i37023" + "i37024" + "i37025" + "i37026")) #(ribcage () () ()) #(ribcage #(orig-x) #((top)) - #("i29162"))) + #("i37018")) + #(ribcage + (do) + ((top)) + (((hygiene guile) + . + #(syntax-object + do + ((top)) + (hygiene + guile)))))) (hygiene guile)) (append - #{c 29223}# + #{c 37079}# (list (cons '#(syntax-object doloop ((top) @@ -22693,7 +18946,7 @@ #(ribcage #(step) #((top)) - #("i29180")) + #("i37036")) #(ribcage #(var init @@ -22707,12 +18960,12 @@ (top) (top) (top)) - #("i29165" - "i29166" - "i29167" - "i29168" - "i29169" - "i29170")) + #("i37021" + "i37022" + "i37023" + "i37024" + "i37025" + "i37026")) #(ribcage () () @@ -22720,30 +18973,41 @@ #(ribcage #(orig-x) #((top)) - #("i29162"))) + #("i37018")) + #(ribcage + (do) + ((top)) + (((hygiene + guile) + . + #(syntax-object + do + ((top)) + (hygiene + guile)))))) (hygiene guile)) - #{step 29242}#))))))) - #{tmp 29244}#) - (let ((#{tmp 29248}# + #{step 37098}#))))))) + #{tmp 37100}#) + (let ((#{tmp 37104}# ($sc-dispatch - #{e1 29222}# + #{e1 37078}# '(any . each-any)))) - (if #{tmp 29248}# + (if #{tmp 37104}# (@apply - (lambda (#{e1 29252}# #{e2 29253}#) + (lambda (#{e1 37108}# #{e2 37109}#) (list '#(syntax-object let ((top) #(ribcage #(e1 e2) #((top) (top)) - #("i29189" "i29190")) + #("i37045" "i37046")) #(ribcage () () ()) #(ribcage #(step) #((top)) - #("i29180")) + #("i37036")) #(ribcage #(var init step e0 e1 c) #((top) @@ -22752,17 +19016,26 @@ (top) (top) (top)) - #("i29165" - "i29166" - "i29167" - "i29168" - "i29169" - "i29170")) + #("i37021" + "i37022" + "i37023" + "i37024" + "i37025" + "i37026")) #(ribcage () () ()) #(ribcage #(orig-x) #((top)) - #("i29162"))) + #("i37018")) + #(ribcage + (do) + ((top)) + (((hygiene guile) + . + #(syntax-object + do + ((top)) + (hygiene guile)))))) (hygiene guile)) '#(syntax-object doloop @@ -22770,12 +19043,12 @@ #(ribcage #(e1 e2) #((top) (top)) - #("i29189" "i29190")) + #("i37045" "i37046")) #(ribcage () () ()) #(ribcage #(step) #((top)) - #("i29180")) + #("i37036")) #(ribcage #(var init step e0 e1 c) #((top) @@ -22784,33 +19057,42 @@ (top) (top) (top)) - #("i29165" - "i29166" - "i29167" - "i29168" - "i29169" - "i29170")) + #("i37021" + "i37022" + "i37023" + "i37024" + "i37025" + "i37026")) #(ribcage () () ()) #(ribcage #(orig-x) #((top)) - #("i29162"))) + #("i37018")) + #(ribcage + (do) + ((top)) + (((hygiene guile) + . + #(syntax-object + do + ((top)) + (hygiene guile)))))) (hygiene guile)) (map list - #{var 29218}# - #{init 29219}#) + #{var 37074}# + #{init 37075}#) (list '#(syntax-object if ((top) #(ribcage #(e1 e2) #((top) (top)) - #("i29189" "i29190")) + #("i37045" "i37046")) #(ribcage () () ()) #(ribcage #(step) #((top)) - #("i29180")) + #("i37036")) #(ribcage #(var init step e0 e1 c) #((top) @@ -22819,32 +19101,41 @@ (top) (top) (top)) - #("i29165" - "i29166" - "i29167" - "i29168" - "i29169" - "i29170")) + #("i37021" + "i37022" + "i37023" + "i37024" + "i37025" + "i37026")) #(ribcage () () ()) #(ribcage #(orig-x) #((top)) - #("i29162"))) + #("i37018")) + #(ribcage + (do) + ((top)) + (((hygiene guile) + . + #(syntax-object + do + ((top)) + (hygiene guile)))))) (hygiene guile)) - #{e0 29221}# + #{e0 37077}# (cons '#(syntax-object begin ((top) #(ribcage #(e1 e2) #((top) (top)) - #("i29189" - "i29190")) + #("i37045" + "i37046")) #(ribcage () () ()) #(ribcage #(step) #((top)) - #("i29180")) + #("i37036")) #(ribcage #(var init @@ -22858,33 +19149,43 @@ (top) (top) (top)) - #("i29165" - "i29166" - "i29167" - "i29168" - "i29169" - "i29170")) + #("i37021" + "i37022" + "i37023" + "i37024" + "i37025" + "i37026")) #(ribcage () () ()) #(ribcage #(orig-x) #((top)) - #("i29162"))) + #("i37018")) + #(ribcage + (do) + ((top)) + (((hygiene guile) + . + #(syntax-object + do + ((top)) + (hygiene + guile)))))) (hygiene guile)) - (cons #{e1 29252}# - #{e2 29253}#)) + (cons #{e1 37108}# + #{e2 37109}#)) (cons '#(syntax-object begin ((top) #(ribcage #(e1 e2) #((top) (top)) - #("i29189" - "i29190")) + #("i37045" + "i37046")) #(ribcage () () ()) #(ribcage #(step) #((top)) - #("i29180")) + #("i37036")) #(ribcage #(var init @@ -22898,20 +19199,30 @@ (top) (top) (top)) - #("i29165" - "i29166" - "i29167" - "i29168" - "i29169" - "i29170")) + #("i37021" + "i37022" + "i37023" + "i37024" + "i37025" + "i37026")) #(ribcage () () ()) #(ribcage #(orig-x) #((top)) - #("i29162"))) + #("i37018")) + #(ribcage + (do) + ((top)) + (((hygiene guile) + . + #(syntax-object + do + ((top)) + (hygiene + guile)))))) (hygiene guile)) (append - #{c 29223}# + #{c 37079}# (list (cons '#(syntax-object doloop ((top) @@ -22920,8 +19231,8 @@ e2) #((top) (top)) - #("i29189" - "i29190")) + #("i37045" + "i37046")) #(ribcage () () @@ -22929,7 +19240,7 @@ #(ribcage #(step) #((top)) - #("i29180")) + #("i37036")) #(ribcage #(var init @@ -22943,12 +19254,12 @@ (top) (top) (top)) - #("i29165" - "i29166" - "i29167" - "i29168" - "i29169" - "i29170")) + #("i37021" + "i37022" + "i37023" + "i37024" + "i37025" + "i37026")) #(ribcage () () @@ -22956,36 +19267,47 @@ #(ribcage #(orig-x) #((top)) - #("i29162"))) + #("i37018")) + #(ribcage + (do) + ((top)) + (((hygiene + guile) + . + #(syntax-object + do + ((top)) + (hygiene + guile)))))) (hygiene guile)) - #{step 29242}#))))))) - #{tmp 29248}#) + #{step 37098}#))))))) + #{tmp 37104}#) (syntax-violation #f "source expression failed to match any pattern" - #{e1 29222}#)))))) - #{tmp 29225}#) + #{e1 37078}#)))))) + #{tmp 37081}#) (syntax-violation #f "source expression failed to match any pattern" - #{tmp 29224}#))))) - #{tmp 29214}#) + #{tmp 37080}#))))) + #{tmp 37070}#) (syntax-violation #f "source expression failed to match any pattern" - #{orig-x 29212}#)))))) + #{orig-x 37068}#)))))) (define quasiquote (make-syntax-transformer 'quasiquote 'macro (letrec* - ((#{quasi 29539}# - (lambda (#{p 29563}# #{lev 29564}#) - (let ((#{tmp 29566}# + ((#{quasi 37396}# + (lambda (#{p 37420}# #{lev 37421}#) + (let ((#{tmp 37423}# ($sc-dispatch - #{p 29563}# + #{p 37420}# '(#(free-id #(syntax-object unquote @@ -22994,7 +19316,7 @@ #(ribcage #(p lev) #((top) (top)) - #("i29285" "i29286")) + #("i37142" "i37143")) #(ribcage (emit quasivector quasilist* @@ -23003,28 +19325,37 @@ vquasi quasi) ((top) (top) (top) (top) (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile))) any)))) - (if #{tmp 29566}# + (if #{tmp 37423}# (@apply - (lambda (#{p 29570}#) - (if (= #{lev 29564}# 0) + (lambda (#{p 37427}#) + (if (= #{lev 37421}# 0) (list '#(syntax-object "value" ((top) - #(ribcage #(p) #((top)) #("i29289")) + #(ribcage #(p) #((top)) #("i37146")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("i29285" "i29286")) + #("i37142" "i37143")) #(ribcage (emit quasivector quasilist* @@ -23033,25 +19364,34 @@ vquasi quasi) ((top) (top) (top) (top) (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) - #{p 29570}#) - (#{quasicons 29541}# + #{p 37427}#) + (#{quasicons 37398}# '(#(syntax-object "quote" ((top) - #(ribcage #(p) #((top)) #("i29289")) + #(ribcage #(p) #((top)) #("i37146")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("i29285" "i29286")) + #("i37142" "i37143")) #(ribcage (emit quasivector quasilist* @@ -23060,23 +19400,32 @@ vquasi quasi) ((top) (top) (top) (top) (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) #(syntax-object unquote ((top) - #(ribcage #(p) #((top)) #("i29289")) + #(ribcage #(p) #((top)) #("i37146")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("i29285" "i29286")) + #("i37142" "i37143")) #(ribcage (emit quasivector quasilist* @@ -23085,21 +19434,30 @@ vquasi quasi) ((top) (top) (top) (top) (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile))) - (#{quasi 29539}# - (list #{p 29570}#) - (#{1-}# #{lev 29564}#))))) - #{tmp 29566}#) - (let ((#{tmp 29573}# + (#{quasi 37396}# + (list #{p 37427}#) + (#{1-}# #{lev 37421}#))))) + #{tmp 37423}#) + (let ((#{tmp 37430}# ($sc-dispatch - #{p 29563}# + #{p 37420}# '(#(free-id #(syntax-object quasiquote @@ -23108,7 +19466,7 @@ #(ribcage #(p lev) #((top) (top)) - #("i29285" "i29286")) + #("i37142" "i37143")) #(ribcage (emit quasivector quasilist* @@ -23117,28 +19475,37 @@ vquasi quasi) ((top) (top) (top) (top) (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile))) any)))) - (if #{tmp 29573}# + (if #{tmp 37430}# (@apply - (lambda (#{p 29577}#) - (#{quasicons 29541}# + (lambda (#{p 37434}#) + (#{quasicons 37398}# '(#(syntax-object "quote" ((top) - #(ribcage #(p) #((top)) #("i29292")) + #(ribcage #(p) #((top)) #("i37149")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("i29285" "i29286")) + #("i37142" "i37143")) #(ribcage (emit quasivector quasilist* @@ -23147,23 +19514,32 @@ vquasi quasi) ((top) (top) (top) (top) (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) #(syntax-object quasiquote ((top) - #(ribcage #(p) #((top)) #("i29292")) + #(ribcage #(p) #((top)) #("i37149")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("i29285" "i29286")) + #("i37142" "i37143")) #(ribcage (emit quasivector quasilist* @@ -23172,26 +19548,35 @@ vquasi quasi) ((top) (top) (top) (top) (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile))) - (#{quasi 29539}# - (list #{p 29577}#) - (#{1+}# #{lev 29564}#)))) - #{tmp 29573}#) - (let ((#{tmp 29580}# - ($sc-dispatch #{p 29563}# '(any . any)))) - (if #{tmp 29580}# + (#{quasi 37396}# + (list #{p 37434}#) + (#{1+}# #{lev 37421}#)))) + #{tmp 37430}#) + (let ((#{tmp 37437}# + ($sc-dispatch #{p 37420}# '(any . any)))) + (if #{tmp 37437}# (@apply - (lambda (#{p 29584}# #{q 29585}#) - (let ((#{tmp 29587}# + (lambda (#{p 37441}# #{q 37442}#) + (let ((#{tmp 37444}# ($sc-dispatch - #{p 29584}# + #{p 37441}# '(#(free-id #(syntax-object unquote @@ -23199,12 +19584,12 @@ #(ribcage #(p q) #((top) (top)) - #("i29295" "i29296")) + #("i37152" "i37153")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("i29285" "i29286")) + #("i37142" "i37143")) #(ribcage (emit quasivector quasilist* @@ -23219,38 +19604,47 @@ (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile))) . each-any)))) - (if #{tmp 29587}# + (if #{tmp 37444}# (@apply - (lambda (#{p 29591}#) - (if (= #{lev 29564}# 0) - (#{quasilist* 29543}# - (map (lambda (#{tmp 29303 29627}#) + (lambda (#{p 37448}#) + (if (= #{lev 37421}# 0) + (#{quasilist* 37400}# + (map (lambda (#{tmp 37160 37487}#) (list '#(syntax-object "value" ((top) #(ribcage #(p) #((top)) - #("i29301")) + #("i37158")) #(ribcage #(p q) #((top) (top)) - #("i29295" "i29296")) + #("i37152" "i37153")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("i29285" "i29286")) + #("i37142" "i37143")) #(ribcage (emit quasivector quasilist* @@ -23265,37 +19659,47 @@ (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene + guile)))))) (hygiene guile)) - #{tmp 29303 29627}#)) - #{p 29591}#) - (#{quasi 29539}# - #{q 29585}# - #{lev 29564}#)) - (#{quasicons 29541}# - (#{quasicons 29541}# + #{tmp 37160 37487}#)) + #{p 37448}#) + (#{quasi 37396}# + #{q 37442}# + #{lev 37421}#)) + (#{quasicons 37398}# + (#{quasicons 37398}# '(#(syntax-object "quote" ((top) #(ribcage #(p) #((top)) - #("i29301")) + #("i37158")) #(ribcage #(p q) #((top) (top)) - #("i29295" "i29296")) + #("i37152" "i37153")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("i29285" "i29286")) + #("i37142" "i37143")) #(ribcage (emit quasivector quasilist* @@ -23310,13 +19714,22 @@ (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) #(syntax-object unquote @@ -23324,16 +19737,16 @@ #(ribcage #(p) #((top)) - #("i29301")) + #("i37158")) #(ribcage #(p q) #((top) (top)) - #("i29295" "i29296")) + #("i37152" "i37153")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("i29285" "i29286")) + #("i37142" "i37143")) #(ribcage (emit quasivector quasilist* @@ -23348,24 +19761,33 @@ (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile))) - (#{quasi 29539}# - #{p 29591}# - (#{1-}# #{lev 29564}#))) - (#{quasi 29539}# - #{q 29585}# - #{lev 29564}#)))) - #{tmp 29587}#) - (let ((#{tmp 29632}# + (#{quasi 37396}# + #{p 37448}# + (#{1-}# #{lev 37421}#))) + (#{quasi 37396}# + #{q 37442}# + #{lev 37421}#)))) + #{tmp 37444}#) + (let ((#{tmp 37492}# ($sc-dispatch - #{p 29584}# + #{p 37441}# '(#(free-id #(syntax-object unquote-splicing @@ -23373,12 +19795,12 @@ #(ribcage #(p q) #((top) (top)) - #("i29295" "i29296")) + #("i37152" "i37153")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("i29285" "i29286")) + #("i37142" "i37143")) #(ribcage (emit quasivector quasilist* @@ -23393,40 +19815,49 @@ (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile))) . each-any)))) - (if #{tmp 29632}# + (if #{tmp 37492}# (@apply - (lambda (#{p 29636}#) - (if (= #{lev 29564}# 0) - (#{quasiappend 29542}# - (map (lambda (#{tmp 29308 29639}#) + (lambda (#{p 37496}#) + (if (= #{lev 37421}# 0) + (#{quasiappend 37399}# + (map (lambda (#{tmp 37165 37499}#) (list '#(syntax-object "value" ((top) #(ribcage #(p) #((top)) - #("i29306")) + #("i37163")) #(ribcage #(p q) #((top) (top)) - #("i29295" - "i29296")) + #("i37152" + "i37153")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("i29285" - "i29286")) + #("i37142" + "i37143")) #(ribcage (emit quasivector quasilist* @@ -23441,37 +19872,47 @@ (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene + guile)))))) (hygiene guile)) - #{tmp 29308 29639}#)) - #{p 29636}#) - (#{quasi 29539}# - #{q 29585}# - #{lev 29564}#)) - (#{quasicons 29541}# - (#{quasicons 29541}# + #{tmp 37165 37499}#)) + #{p 37496}#) + (#{quasi 37396}# + #{q 37442}# + #{lev 37421}#)) + (#{quasicons 37398}# + (#{quasicons 37398}# '(#(syntax-object "quote" ((top) #(ribcage #(p) #((top)) - #("i29306")) + #("i37163")) #(ribcage #(p q) #((top) (top)) - #("i29295" "i29296")) + #("i37152" "i37153")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("i29285" "i29286")) + #("i37142" "i37143")) #(ribcage (emit quasivector quasilist* @@ -23486,13 +19927,22 @@ (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) #(syntax-object unquote-splicing @@ -23500,16 +19950,16 @@ #(ribcage #(p) #((top)) - #("i29306")) + #("i37163")) #(ribcage #(p q) #((top) (top)) - #("i29295" "i29296")) + #("i37152" "i37153")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("i29285" "i29286")) + #("i37142" "i37143")) #(ribcage (emit quasivector quasilist* @@ -23524,57 +19974,66 @@ (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile))) - (#{quasi 29539}# - #{p 29636}# - (#{1-}# #{lev 29564}#))) - (#{quasi 29539}# - #{q 29585}# - #{lev 29564}#)))) - #{tmp 29632}#) - (#{quasicons 29541}# - (#{quasi 29539}# - #{p 29584}# - #{lev 29564}#) - (#{quasi 29539}# - #{q 29585}# - #{lev 29564}#))))))) - #{tmp 29580}#) - (let ((#{tmp 29653}# - ($sc-dispatch #{p 29563}# '#(vector each-any)))) - (if #{tmp 29653}# + (#{quasi 37396}# + #{p 37496}# + (#{1-}# #{lev 37421}#))) + (#{quasi 37396}# + #{q 37442}# + #{lev 37421}#)))) + #{tmp 37492}#) + (#{quasicons 37398}# + (#{quasi 37396}# + #{p 37441}# + #{lev 37421}#) + (#{quasi 37396}# + #{q 37442}# + #{lev 37421}#))))))) + #{tmp 37437}#) + (let ((#{tmp 37513}# + ($sc-dispatch #{p 37420}# '#(vector each-any)))) + (if #{tmp 37513}# (@apply - (lambda (#{x 29657}#) - (let ((#{x 29660}# - (#{vquasi 29540}# - #{x 29657}# - #{lev 29564}#))) - (let ((#{tmp 29662}# + (lambda (#{x 37517}#) + (let ((#{x 37520}# + (#{vquasi 37397}# + #{x 37517}# + #{lev 37421}#))) + (let ((#{tmp 37522}# ($sc-dispatch - #{x 29660}# + #{x 37520}# '(#(atom "quote") each-any)))) - (if #{tmp 29662}# + (if #{tmp 37522}# (@apply - (lambda (#{x 29666}#) + (lambda (#{x 37526}#) (list '#(syntax-object "quote" ((top) #(ribcage #(x) #((top)) - #("i29413")) + #("i37270")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("i29410")) + #("i37267")) #(ribcage (emit quasivector quasilist* @@ -23589,36 +20048,45 @@ (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) - (list->vector #{x 29666}#))) - #{tmp 29662}#) + (list->vector #{x 37526}#))) + #{tmp 37522}#) (letrec* - ((#{f 29668}# - (lambda (#{y 29680}# #{k 29681}#) - (let ((#{tmp 29683}# + ((#{f 37528}# + (lambda (#{y 37540}# #{k 37541}#) + (let ((#{tmp 37543}# ($sc-dispatch - #{y 29680}# + #{y 37540}# '(#(atom "quote") each-any)))) - (if #{tmp 29683}# + (if #{tmp 37543}# (@apply - (lambda (#{y 29686}#) - (#{k 29681}# - (map (lambda (#{tmp 29438 29687}#) + (lambda (#{y 37546}#) + (#{k 37541}# + (map (lambda (#{tmp 37295 37547}#) (list '#(syntax-object "quote" ((top) #(ribcage #(y) #((top)) - #("i29436")) + #("i37293")) #(ribcage () () @@ -23630,13 +20098,13 @@ #((top) (top) (top)) - #("i29418" - "i29419" - "i29420")) + #("i37275" + "i37276" + "i37277")) #(ribcage #(_) #((top)) - #("i29416")) + #("i37273")) #(ribcage () () @@ -23644,7 +20112,7 @@ #(ribcage #(x) #((top)) - #("i29410")) + #("i37267")) #(ribcage (emit quasivector quasilist* @@ -23659,51 +20127,62 @@ (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene + guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene + guile)))))) (hygiene guile)) - #{tmp 29438 29687}#)) - #{y 29686}#))) - #{tmp 29683}#) - (let ((#{tmp 29688}# + #{tmp 37295 37547}#)) + #{y 37546}#))) + #{tmp 37543}#) + (let ((#{tmp 37548}# ($sc-dispatch - #{y 29680}# + #{y 37540}# '(#(atom "list") . each-any)))) - (if #{tmp 29688}# + (if #{tmp 37548}# (@apply - (lambda (#{y 29691}#) - (#{k 29681}# - #{y 29691}#)) - #{tmp 29688}#) - (let ((#{tmp 29692}# + (lambda (#{y 37551}#) + (#{k 37541}# + #{y 37551}#)) + #{tmp 37548}#) + (let ((#{tmp 37552}# ($sc-dispatch - #{y 29680}# + #{y 37540}# '(#(atom "list*") . #(each+ any (any) ()))))) - (if #{tmp 29692}# + (if #{tmp 37552}# (@apply - (lambda (#{y 29695}# - #{z 29696}#) - (#{f 29668}# - #{z 29696}# - (lambda (#{ls 29697}#) - (#{k 29681}# + (lambda (#{y 37555}# + #{z 37556}#) + (#{f 37528}# + #{z 37556}# + (lambda (#{ls 37557}#) + (#{k 37541}# (append - #{y 29695}# - #{ls 29697}#))))) - #{tmp 29692}#) + #{y 37555}# + #{ls 37557}#))))) + #{tmp 37552}#) (list '#(syntax-object "list->vector" ((top) @@ -23712,14 +20191,14 @@ () ()) #(ribcage - #(#{ g29453}#) - #((m29454 + #(#{ g37310}#) + #((m37311 top)) - #("i29457")) + #("i37314")) #(ribcage #(else) #((top)) - #("i29451")) + #("i37308")) #(ribcage () () @@ -23729,13 +20208,13 @@ #((top) (top) (top)) - #("i29418" - "i29419" - "i29420")) + #("i37275" + "i37276" + "i37277")) #(ribcage #(_) #((top)) - #("i29416")) + #("i37273")) #(ribcage () () @@ -23743,7 +20222,7 @@ #(ribcage #(x) #((top)) - #("i29410")) + #("i37267")) #(ribcage (emit quasivector quasilist* @@ -23758,26 +20237,37 @@ (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene + guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene + guile)))))) (hygiene guile)) - #{x 29660}#)))))))))) - (#{f 29668}# - #{x 29660}# - (lambda (#{ls 29670}#) - (let ((#{tmp 29672}# + #{x 37520}#)))))))))) + (#{f 37528}# + #{x 37520}# + (lambda (#{ls 37530}#) + (let ((#{tmp 37532}# ($sc-dispatch - #{ls 29670}# + #{ls 37530}# 'each-any))) - (if #{tmp 29672}# + (if #{tmp 37532}# (@apply - (lambda (#{ g29426 29675}#) + (lambda (#{ g37283 37535}#) (cons '#(syntax-object "vector" ((top) @@ -23786,9 +20276,9 @@ () ()) #(ribcage - #(#{ g29426}#) - #((m29427 top)) - #("i29431")) + #(#{ g37283}#) + #((m37284 top)) + #("i37288")) #(ribcage () () @@ -23804,11 +20294,11 @@ #(ribcage #(ls) #((top)) - #("i29425")) + #("i37282")) #(ribcage #(_) #((top)) - #("i29416")) + #("i37273")) #(ribcage () () @@ -23816,7 +20306,7 @@ #(ribcage #(x) #((top)) - #("i29410")) + #("i37267")) #(ribcage (emit quasivector quasilist* @@ -23831,30 +20321,41 @@ (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene + guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene + guile)))))) (hygiene guile)) - #{ g29426 29675}#)) - #{tmp 29672}#) + #{ g37283 37535}#)) + #{tmp 37532}#) (syntax-violation #f "source expression failed to match any pattern" - #{ls 29670}#)))))))))) - #{tmp 29653}#) + #{ls 37530}#)))))))))) + #{tmp 37513}#) (list '#(syntax-object "quote" ((top) - #(ribcage #(p) #((top)) #("i29316")) + #(ribcage #(p) #((top)) #("i37173")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("i29285" "i29286")) + #("i37142" "i37143")) #(ribcage (emit quasivector quasilist* @@ -23869,25 +20370,34 @@ (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) - #{p 29563}#))))))))))) - (#{vquasi 29540}# - (lambda (#{p 29725}# #{lev 29726}#) - (let ((#{tmp 29728}# - ($sc-dispatch #{p 29725}# '(any . any)))) - (if #{tmp 29728}# + #{p 37420}#))))))))))) + (#{vquasi 37397}# + (lambda (#{p 37585}# #{lev 37586}#) + (let ((#{tmp 37588}# + ($sc-dispatch #{p 37585}# '(any . any)))) + (if #{tmp 37588}# (@apply - (lambda (#{p 29732}# #{q 29733}#) - (let ((#{tmp 29735}# + (lambda (#{p 37592}# #{q 37593}#) + (let ((#{tmp 37595}# ($sc-dispatch - #{p 29732}# + #{p 37592}# '(#(free-id #(syntax-object unquote @@ -23895,12 +20405,12 @@ #(ribcage #(p q) #((top) (top)) - #("i29324" "i29325")) + #("i37181" "i37182")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("i29320" "i29321")) + #("i37177" "i37178")) #(ribcage (emit quasivector quasilist* @@ -23915,38 +20425,47 @@ (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile))) . each-any)))) - (if #{tmp 29735}# + (if #{tmp 37595}# (@apply - (lambda (#{p 29739}#) - (if (= #{lev 29726}# 0) - (#{quasilist* 29543}# - (map (lambda (#{tmp 29332 29775}#) + (lambda (#{p 37599}#) + (if (= #{lev 37586}# 0) + (#{quasilist* 37400}# + (map (lambda (#{tmp 37189 37638}#) (list '#(syntax-object "value" ((top) #(ribcage #(p) #((top)) - #("i29330")) + #("i37187")) #(ribcage #(p q) #((top) (top)) - #("i29324" "i29325")) + #("i37181" "i37182")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("i29320" "i29321")) + #("i37177" "i37178")) #(ribcage (emit quasivector quasilist* @@ -23961,32 +20480,41 @@ (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) - #{tmp 29332 29775}#)) - #{p 29739}#) - (#{vquasi 29540}# #{q 29733}# #{lev 29726}#)) - (#{quasicons 29541}# - (#{quasicons 29541}# + #{tmp 37189 37638}#)) + #{p 37599}#) + (#{vquasi 37397}# #{q 37593}# #{lev 37586}#)) + (#{quasicons 37398}# + (#{quasicons 37398}# '(#(syntax-object "quote" ((top) - #(ribcage #(p) #((top)) #("i29330")) + #(ribcage #(p) #((top)) #("i37187")) #(ribcage #(p q) #((top) (top)) - #("i29324" "i29325")) + #("i37181" "i37182")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("i29320" "i29321")) + #("i37177" "i37178")) #(ribcage (emit quasivector quasilist* @@ -24001,27 +20529,36 @@ (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) #(syntax-object unquote ((top) - #(ribcage #(p) #((top)) #("i29330")) + #(ribcage #(p) #((top)) #("i37187")) #(ribcage #(p q) #((top) (top)) - #("i29324" "i29325")) + #("i37181" "i37182")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("i29320" "i29321")) + #("i37177" "i37178")) #(ribcage (emit quasivector quasilist* @@ -24036,22 +20573,31 @@ (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile))) - (#{quasi 29539}# - #{p 29739}# - (#{1-}# #{lev 29726}#))) - (#{vquasi 29540}# #{q 29733}# #{lev 29726}#)))) - #{tmp 29735}#) - (let ((#{tmp 29782}# + (#{quasi 37396}# + #{p 37599}# + (#{1-}# #{lev 37586}#))) + (#{vquasi 37397}# #{q 37593}# #{lev 37586}#)))) + #{tmp 37595}#) + (let ((#{tmp 37645}# ($sc-dispatch - #{p 29732}# + #{p 37592}# '(#(free-id #(syntax-object unquote-splicing @@ -24059,12 +20605,12 @@ #(ribcage #(p q) #((top) (top)) - #("i29324" "i29325")) + #("i37181" "i37182")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("i29320" "i29321")) + #("i37177" "i37178")) #(ribcage (emit quasivector quasilist* @@ -24079,38 +20625,47 @@ (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile))) . each-any)))) - (if #{tmp 29782}# + (if #{tmp 37645}# (@apply - (lambda (#{p 29786}#) - (if (= #{lev 29726}# 0) - (#{quasiappend 29542}# - (map (lambda (#{tmp 29337 29789}#) + (lambda (#{p 37649}#) + (if (= #{lev 37586}# 0) + (#{quasiappend 37399}# + (map (lambda (#{tmp 37194 37652}#) (list '#(syntax-object "value" ((top) #(ribcage #(p) #((top)) - #("i29335")) + #("i37192")) #(ribcage #(p q) #((top) (top)) - #("i29324" "i29325")) + #("i37181" "i37182")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("i29320" "i29321")) + #("i37177" "i37178")) #(ribcage (emit quasivector quasilist* @@ -24125,34 +20680,43 @@ (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) - #{tmp 29337 29789}#)) - #{p 29786}#) - (#{vquasi 29540}# - #{q 29733}# - #{lev 29726}#)) - (#{quasicons 29541}# - (#{quasicons 29541}# + #{tmp 37194 37652}#)) + #{p 37649}#) + (#{vquasi 37397}# + #{q 37593}# + #{lev 37586}#)) + (#{quasicons 37398}# + (#{quasicons 37398}# '(#(syntax-object "quote" ((top) - #(ribcage #(p) #((top)) #("i29335")) + #(ribcage #(p) #((top)) #("i37192")) #(ribcage #(p q) #((top) (top)) - #("i29324" "i29325")) + #("i37181" "i37182")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("i29320" "i29321")) + #("i37177" "i37178")) #(ribcage (emit quasivector quasilist* @@ -24167,27 +20731,36 @@ (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) #(syntax-object unquote-splicing ((top) - #(ribcage #(p) #((top)) #("i29335")) + #(ribcage #(p) #((top)) #("i37192")) #(ribcage #(p q) #((top) (top)) - #("i29324" "i29325")) + #("i37181" "i37182")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("i29320" "i29321")) + #("i37177" "i37178")) #(ribcage (emit quasivector quasilist* @@ -24202,27 +20775,36 @@ (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile))) - (#{quasi 29539}# - #{p 29786}# - (#{1-}# #{lev 29726}#))) - (#{vquasi 29540}# - #{q 29733}# - #{lev 29726}#)))) - #{tmp 29782}#) - (#{quasicons 29541}# - (#{quasi 29539}# #{p 29732}# #{lev 29726}#) - (#{vquasi 29540}# #{q 29733}# #{lev 29726}#))))))) - #{tmp 29728}#) - (let ((#{tmp 29807}# ($sc-dispatch #{p 29725}# '()))) - (if #{tmp 29807}# + (#{quasi 37396}# + #{p 37649}# + (#{1-}# #{lev 37586}#))) + (#{vquasi 37397}# + #{q 37593}# + #{lev 37586}#)))) + #{tmp 37645}#) + (#{quasicons 37398}# + (#{quasi 37396}# #{p 37592}# #{lev 37586}#) + (#{vquasi 37397}# #{q 37593}# #{lev 37586}#))))))) + #{tmp 37588}#) + (let ((#{tmp 37670}# ($sc-dispatch #{p 37585}# '()))) + (if #{tmp 37670}# (@apply (lambda () '(#(syntax-object @@ -24232,7 +20814,7 @@ #(ribcage #(p lev) #((top) (top)) - #("i29320" "i29321")) + #("i37177" "i37178")) #(ribcage (emit quasivector quasilist* @@ -24241,64 +20823,73 @@ vquasi quasi) ((top) (top) (top) (top) (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) ())) - #{tmp 29807}#) + #{tmp 37670}#) (syntax-violation #f "source expression failed to match any pattern" - #{p 29725}#))))))) - (#{quasicons 29541}# - (lambda (#{x 29820}# #{y 29821}#) - (let ((#{tmp 29822}# (list #{x 29820}# #{y 29821}#))) - (let ((#{tmp 29823}# - ($sc-dispatch #{tmp 29822}# '(any any)))) - (if #{tmp 29823}# + #{p 37585}#))))))) + (#{quasicons 37398}# + (lambda (#{x 37683}# #{y 37684}#) + (let ((#{tmp 37685}# (list #{x 37683}# #{y 37684}#))) + (let ((#{tmp 37686}# + ($sc-dispatch #{tmp 37685}# '(any any)))) + (if #{tmp 37686}# (@apply - (lambda (#{x 29825}# #{y 29826}#) - (let ((#{tmp 29828}# + (lambda (#{x 37688}# #{y 37689}#) + (let ((#{tmp 37691}# ($sc-dispatch - #{y 29826}# + #{y 37689}# '(#(atom "quote") any)))) - (if #{tmp 29828}# + (if #{tmp 37691}# (@apply - (lambda (#{dy 29832}#) - (let ((#{tmp 29834}# + (lambda (#{dy 37695}#) + (let ((#{tmp 37697}# ($sc-dispatch - #{x 29825}# + #{x 37688}# '(#(atom "quote") any)))) - (if #{tmp 29834}# + (if #{tmp 37697}# (@apply - (lambda (#{dx 29838}#) + (lambda (#{dx 37701}#) (list '#(syntax-object "quote" ((top) #(ribcage #(dx) #((top)) - #("i29359")) + #("i37216")) #(ribcage #(dy) #((top)) - #("i29355")) + #("i37212")) #(ribcage () () ()) #(ribcage #(x y) #((top) (top)) - #("i29349" "i29350")) + #("i37206" "i37207")) #(ribcage () () ()) #(ribcage () () ()) #(ribcage #(x y) #((top) (top)) - #("i29344" "i29345")) + #("i37201" "i37202")) #(ribcage (emit quasivector quasilist* @@ -24313,39 +20904,48 @@ (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) - (cons #{dx 29838}# #{dy 29832}#))) - #{tmp 29834}#) - (if (null? #{dy 29832}#) + (cons #{dx 37701}# #{dy 37695}#))) + #{tmp 37697}#) + (if (null? #{dy 37695}#) (list '#(syntax-object "list" ((top) #(ribcage #(_) #((top)) - #("i29361")) + #("i37218")) #(ribcage #(dy) #((top)) - #("i29355")) + #("i37212")) #(ribcage () () ()) #(ribcage #(x y) #((top) (top)) - #("i29349" "i29350")) + #("i37206" "i37207")) #(ribcage () () ()) #(ribcage () () ()) #(ribcage #(x y) #((top) (top)) - #("i29344" "i29345")) + #("i37201" "i37202")) #(ribcage (emit quasivector quasilist* @@ -24360,37 +20960,46 @@ (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) - #{x 29825}#) + #{x 37688}#) (list '#(syntax-object "list*" ((top) #(ribcage #(_) #((top)) - #("i29361")) + #("i37218")) #(ribcage #(dy) #((top)) - #("i29355")) + #("i37212")) #(ribcage () () ()) #(ribcage #(x y) #((top) (top)) - #("i29349" "i29350")) + #("i37206" "i37207")) #(ribcage () () ()) #(ribcage () () ()) #(ribcage #(x y) #((top) (top)) - #("i29344" "i29345")) + #("i37201" "i37202")) #(ribcage (emit quasivector quasilist* @@ -24405,42 +21014,51 @@ (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) - #{x 29825}# - #{y 29826}#))))) - #{tmp 29828}#) - (let ((#{tmp 29843}# + #{x 37688}# + #{y 37689}#))))) + #{tmp 37691}#) + (let ((#{tmp 37706}# ($sc-dispatch - #{y 29826}# + #{y 37689}# '(#(atom "list") . any)))) - (if #{tmp 29843}# + (if #{tmp 37706}# (@apply - (lambda (#{stuff 29847}#) + (lambda (#{stuff 37710}#) (cons '#(syntax-object "list" ((top) #(ribcage #(stuff) #((top)) - #("i29364")) + #("i37221")) #(ribcage () () ()) #(ribcage #(x y) #((top) (top)) - #("i29349" "i29350")) + #("i37206" "i37207")) #(ribcage () () ()) #(ribcage () () ()) #(ribcage #(x y) #((top) (top)) - #("i29344" "i29345")) + #("i37201" "i37202")) #(ribcage (emit quasivector quasilist* @@ -24455,41 +21073,50 @@ (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) - (cons #{x 29825}# #{stuff 29847}#))) - #{tmp 29843}#) - (let ((#{tmp 29848}# + (cons #{x 37688}# #{stuff 37710}#))) + #{tmp 37706}#) + (let ((#{tmp 37711}# ($sc-dispatch - #{y 29826}# + #{y 37689}# '(#(atom "list*") . any)))) - (if #{tmp 29848}# + (if #{tmp 37711}# (@apply - (lambda (#{stuff 29852}#) + (lambda (#{stuff 37715}#) (cons '#(syntax-object "list*" ((top) #(ribcage #(stuff) #((top)) - #("i29367")) + #("i37224")) #(ribcage () () ()) #(ribcage #(x y) #((top) (top)) - #("i29349" "i29350")) + #("i37206" "i37207")) #(ribcage () () ()) #(ribcage () () ()) #(ribcage #(x y) #((top) (top)) - #("i29344" "i29345")) + #("i37201" "i37202")) #(ribcage (emit quasivector quasilist* @@ -24504,31 +21131,40 @@ (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) - (cons #{x 29825}# #{stuff 29852}#))) - #{tmp 29848}#) + (cons #{x 37688}# #{stuff 37715}#))) + #{tmp 37711}#) (list '#(syntax-object "list*" ((top) - #(ribcage #(_) #((top)) #("i29369")) + #(ribcage #(_) #((top)) #("i37226")) #(ribcage () () ()) #(ribcage #(x y) #((top) (top)) - #("i29349" "i29350")) + #("i37206" "i37207")) #(ribcage () () ()) #(ribcage () () ()) #(ribcage #(x y) #((top) (top)) - #("i29344" "i29345")) + #("i37201" "i37202")) #(ribcage (emit quasivector quasilist* @@ -24543,29 +21179,38 @@ (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) - #{x 29825}# - #{y 29826}#)))))))) - #{tmp 29823}#) + #{x 37688}# + #{y 37689}#)))))))) + #{tmp 37686}#) (syntax-violation #f "source expression failed to match any pattern" - #{tmp 29822}#)))))) - (#{quasiappend 29542}# - (lambda (#{x 29863}# #{y 29864}#) - (let ((#{tmp 29866}# - ($sc-dispatch #{y 29864}# '(#(atom "quote") ())))) - (if #{tmp 29866}# + #{tmp 37685}#)))))) + (#{quasiappend 37399}# + (lambda (#{x 37726}# #{y 37727}#) + (let ((#{tmp 37729}# + ($sc-dispatch #{y 37727}# '(#(atom "quote") ())))) + (if #{tmp 37729}# (@apply (lambda () - (if (null? #{x 29863}#) + (if (null? #{x 37726}#) '(#(syntax-object "quote" ((top) @@ -24573,7 +21218,7 @@ #(ribcage #(x y) #((top) (top)) - #("i29373" "i29374")) + #("i37230" "i37231")) #(ribcage (emit quasivector quasilist* @@ -24582,32 +21227,41 @@ vquasi quasi) ((top) (top) (top) (top) (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) ()) - (if (null? (cdr #{x 29863}#)) - (car #{x 29863}#) - (let ((#{tmp 29871}# - ($sc-dispatch #{x 29863}# 'each-any))) - (if #{tmp 29871}# + (if (null? (cdr #{x 37726}#)) + (car #{x 37726}#) + (let ((#{tmp 37734}# + ($sc-dispatch #{x 37726}# 'each-any))) + (if #{tmp 37734}# (@apply - (lambda (#{p 29875}#) + (lambda (#{p 37738}#) (cons '#(syntax-object "append" ((top) #(ribcage () () ()) - #(ribcage #(p) #((top)) #("i29385")) + #(ribcage #(p) #((top)) #("i37242")) #(ribcage () () ()) #(ribcage #(x y) #((top) (top)) - #("i29373" "i29374")) + #("i37230" "i37231")) #(ribcage (emit quasivector quasilist* @@ -24622,29 +21276,38 @@ (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) - #{p 29875}#)) - #{tmp 29871}#) + #{p 37738}#)) + #{tmp 37734}#) (syntax-violation #f "source expression failed to match any pattern" - #{x 29863}#)))))) - #{tmp 29866}#) - (if (null? #{x 29863}#) - #{y 29864}# - (let ((#{tmp 29883}# (list #{x 29863}# #{y 29864}#))) - (let ((#{tmp 29884}# - ($sc-dispatch #{tmp 29883}# '(each-any any)))) - (if #{tmp 29884}# + #{x 37726}#)))))) + #{tmp 37729}#) + (if (null? #{x 37726}#) + #{y 37727}# + (let ((#{tmp 37746}# (list #{x 37726}# #{y 37727}#))) + (let ((#{tmp 37747}# + ($sc-dispatch #{tmp 37746}# '(each-any any)))) + (if #{tmp 37747}# (@apply - (lambda (#{p 29886}# #{y 29887}#) + (lambda (#{p 37749}# #{y 37750}#) (cons '#(syntax-object "append" ((top) @@ -24652,13 +21315,13 @@ #(ribcage #(p y) #((top) (top)) - #("i29396" "i29397")) - #(ribcage #(_) #((top)) #("i29388")) + #("i37253" "i37254")) + #(ribcage #(_) #((top)) #("i37245")) #(ribcage () () ()) #(ribcage #(x y) #((top) (top)) - #("i29373" "i29374")) + #("i37230" "i37231")) #(ribcage (emit quasivector quasilist* @@ -24673,44 +21336,53 @@ (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) - (append #{p 29886}# (list #{y 29887}#)))) - #{tmp 29884}#) + (append #{p 37749}# (list #{y 37750}#)))) + #{tmp 37747}#) (syntax-violation #f "source expression failed to match any pattern" - #{tmp 29883}#))))))))) - (#{quasilist* 29543}# - (lambda (#{x 29891}# #{y 29892}#) + #{tmp 37746}#))))))))) + (#{quasilist* 37400}# + (lambda (#{x 37754}# #{y 37755}#) (letrec* - ((#{f 29893}# - (lambda (#{x 29982}#) - (if (null? #{x 29982}#) - #{y 29892}# - (#{quasicons 29541}# - (car #{x 29982}#) - (#{f 29893}# (cdr #{x 29982}#))))))) - (#{f 29893}# #{x 29891}#)))) - (#{emit 29545}# - (lambda (#{x 29985}#) - (let ((#{tmp 29987}# - ($sc-dispatch #{x 29985}# '(#(atom "quote") any)))) - (if #{tmp 29987}# + ((#{f 37756}# + (lambda (#{x 37860}#) + (if (null? #{x 37860}#) + #{y 37755}# + (#{quasicons 37398}# + (car #{x 37860}#) + (#{f 37756}# (cdr #{x 37860}#))))))) + (#{f 37756}# #{x 37754}#)))) + (#{emit 37402}# + (lambda (#{x 37863}#) + (let ((#{tmp 37865}# + ($sc-dispatch #{x 37863}# '(#(atom "quote") any)))) + (if #{tmp 37865}# (@apply - (lambda (#{x 29991}#) + (lambda (#{x 37869}#) (list '#(syntax-object quote ((top) - #(ribcage #(x) #((top)) #("i29463")) + #(ribcage #(x) #((top)) #("i37320")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i29460")) + #(ribcage #(x) #((top)) #("i37317")) #(ribcage (emit quasivector quasilist* @@ -24719,40 +21391,49 @@ vquasi quasi) ((top) (top) (top) (top) (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) - #{x 29991}#)) - #{tmp 29987}#) - (let ((#{tmp 29992}# + #{x 37869}#)) + #{tmp 37865}#) + (let ((#{tmp 37870}# ($sc-dispatch - #{x 29985}# + #{x 37863}# '(#(atom "list") . each-any)))) - (if #{tmp 29992}# + (if #{tmp 37870}# (@apply - (lambda (#{x 29996}#) - (let ((#{tmp 29997}# (map #{emit 29545}# #{x 29996}#))) - (let ((#{tmp 29998}# - ($sc-dispatch #{tmp 29997}# 'each-any))) - (if #{tmp 29998}# + (lambda (#{x 37874}#) + (let ((#{tmp 37875}# (map #{emit 37402}# #{x 37874}#))) + (let ((#{tmp 37876}# + ($sc-dispatch #{tmp 37875}# 'each-any))) + (if #{tmp 37876}# (@apply - (lambda (#{ g29468 30000}#) + (lambda (#{ g37325 37878}#) (cons '#(syntax-object list ((top) #(ribcage () () ()) #(ribcage - #(#{ g29468}#) - #((m29469 top)) - #("i29473")) - #(ribcage #(x) #((top)) #("i29466")) + #(#{ g37325}#) + #((m37326 top)) + #("i37330")) + #(ribcage #(x) #((top)) #("i37323")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i29460")) + #(ribcage #(x) #((top)) #("i37317")) #(ribcage (emit quasivector quasilist* @@ -24767,70 +21448,79 @@ (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) - #{ g29468 30000}#)) - #{tmp 29998}#) + #{ g37325 37878}#)) + #{tmp 37876}#) (syntax-violation #f "source expression failed to match any pattern" - #{tmp 29997}#))))) - #{tmp 29992}#) - (let ((#{tmp 30001}# + #{tmp 37875}#))))) + #{tmp 37870}#) + (let ((#{tmp 37879}# ($sc-dispatch - #{x 29985}# + #{x 37863}# '(#(atom "list*") . #(each+ any (any) ()))))) - (if #{tmp 30001}# + (if #{tmp 37879}# (@apply - (lambda (#{x 30005}# #{y 30006}#) + (lambda (#{x 37883}# #{y 37884}#) (letrec* - ((#{f 30007}# - (lambda (#{x* 30010}#) - (if (null? #{x* 30010}#) - (#{emit 29545}# #{y 30006}#) - (let ((#{tmp 30011}# - (list (#{emit 29545}# - (car #{x* 30010}#)) - (#{f 30007}# - (cdr #{x* 30010}#))))) - (let ((#{tmp 30012}# + ((#{f 37885}# + (lambda (#{x* 37888}#) + (if (null? #{x* 37888}#) + (#{emit 37402}# #{y 37884}#) + (let ((#{tmp 37889}# + (list (#{emit 37402}# + (car #{x* 37888}#)) + (#{f 37885}# + (cdr #{x* 37888}#))))) + (let ((#{tmp 37890}# ($sc-dispatch - #{tmp 30011}# + #{tmp 37889}# '(any any)))) - (if #{tmp 30012}# + (if #{tmp 37890}# (@apply - (lambda (#{ g29488 30014}# - #{ g29487 30015}#) + (lambda (#{ g37345 37892}# + #{ g37344 37893}#) (list '#(syntax-object cons ((top) #(ribcage () () ()) #(ribcage - #(#{ g29488}# - #{ g29487}#) - #((m29489 top) - (m29489 top)) - #("i29493" "i29494")) + #(#{ g37345}# + #{ g37344}#) + #((m37346 top) + (m37346 top)) + #("i37350" "i37351")) #(ribcage () () ()) #(ribcage #(f x*) #((top) (top)) - #("i29482" "i29483")) + #("i37339" "i37340")) #(ribcage #(x y) #((top) (top)) - #("i29478" "i29479")) + #("i37335" "i37336")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("i29460")) + #("i37317")) #(ribcage (emit quasivector quasilist* @@ -24845,56 +21535,66 @@ (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene + guile)))))) (hygiene guile)) - #{ g29488 30014}# - #{ g29487 30015}#)) - #{tmp 30012}#) + #{ g37345 37892}# + #{ g37344 37893}#)) + #{tmp 37890}#) (syntax-violation #f "source expression failed to match any pattern" - #{tmp 30011}#)))))))) - (#{f 30007}# #{x 30005}#))) - #{tmp 30001}#) - (let ((#{tmp 30016}# + #{tmp 37889}#)))))))) + (#{f 37885}# #{x 37883}#))) + #{tmp 37879}#) + (let ((#{tmp 37894}# ($sc-dispatch - #{x 29985}# + #{x 37863}# '(#(atom "append") . each-any)))) - (if #{tmp 30016}# + (if #{tmp 37894}# (@apply - (lambda (#{x 30020}#) - (let ((#{tmp 30021}# - (map #{emit 29545}# #{x 30020}#))) - (let ((#{tmp 30022}# + (lambda (#{x 37898}#) + (let ((#{tmp 37899}# + (map #{emit 37402}# #{x 37898}#))) + (let ((#{tmp 37900}# ($sc-dispatch - #{tmp 30021}# + #{tmp 37899}# 'each-any))) - (if #{tmp 30022}# + (if #{tmp 37900}# (@apply - (lambda (#{ g29500 30024}#) + (lambda (#{ g37357 37902}#) (cons '#(syntax-object append ((top) #(ribcage () () ()) #(ribcage - #(#{ g29500}#) - #((m29501 top)) - #("i29505")) + #(#{ g37357}#) + #((m37358 top)) + #("i37362")) #(ribcage #(x) #((top)) - #("i29498")) + #("i37355")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("i29460")) + #("i37317")) #(ribcage (emit quasivector quasilist* @@ -24909,54 +21609,63 @@ (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) - #{ g29500 30024}#)) - #{tmp 30022}#) + #{ g37357 37902}#)) + #{tmp 37900}#) (syntax-violation #f "source expression failed to match any pattern" - #{tmp 30021}#))))) - #{tmp 30016}#) - (let ((#{tmp 30025}# + #{tmp 37899}#))))) + #{tmp 37894}#) + (let ((#{tmp 37903}# ($sc-dispatch - #{x 29985}# + #{x 37863}# '(#(atom "vector") . each-any)))) - (if #{tmp 30025}# + (if #{tmp 37903}# (@apply - (lambda (#{x 30029}#) - (let ((#{tmp 30030}# - (map #{emit 29545}# #{x 30029}#))) - (let ((#{tmp 30031}# + (lambda (#{x 37907}#) + (let ((#{tmp 37908}# + (map #{emit 37402}# #{x 37907}#))) + (let ((#{tmp 37909}# ($sc-dispatch - #{tmp 30030}# + #{tmp 37908}# 'each-any))) - (if #{tmp 30031}# + (if #{tmp 37909}# (@apply - (lambda (#{ g29512 30033}#) + (lambda (#{ g37369 37911}#) (cons '#(syntax-object vector ((top) #(ribcage () () ()) #(ribcage - #(#{ g29512}#) - #((m29513 top)) - #("i29517")) + #(#{ g37369}#) + #((m37370 top)) + #("i37374")) #(ribcage #(x) #((top)) - #("i29510")) + #("i37367")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("i29460")) + #("i37317")) #(ribcage (emit quasivector quasilist* @@ -24971,47 +21680,57 @@ (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene + guile)))))) (hygiene guile)) - #{ g29512 30033}#)) - #{tmp 30031}#) + #{ g37369 37911}#)) + #{tmp 37909}#) (syntax-violation #f "source expression failed to match any pattern" - #{tmp 30030}#))))) - #{tmp 30025}#) - (let ((#{tmp 30034}# + #{tmp 37908}#))))) + #{tmp 37903}#) + (let ((#{tmp 37912}# ($sc-dispatch - #{x 29985}# + #{x 37863}# '(#(atom "list->vector") any)))) - (if #{tmp 30034}# + (if #{tmp 37912}# (@apply - (lambda (#{x 30038}#) - (let ((#{tmp 30039}# - (#{emit 29545}# #{x 30038}#))) + (lambda (#{x 37916}#) + (let ((#{tmp 37917}# + (#{emit 37402}# #{x 37916}#))) (list '#(syntax-object list->vector ((top) #(ribcage () () ()) #(ribcage - #(#{ g29524}#) - #((m29525 top)) - #("i29528")) + #(#{ g37381}#) + #((m37382 top)) + #("i37385")) #(ribcage #(x) #((top)) - #("i29522")) + #("i37379")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("i29460")) + #("i37317")) #(ribcage (emit quasivector quasilist* @@ -25026,188 +21745,215 @@ (top) (top) (top)) - ("i29281" - "i29279" - "i29277" - "i29275" - "i29273" - "i29271" - "i29269"))) + ("i37138" + "i37136" + "i37134" + "i37132" + "i37130" + "i37128" + "i37126")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) - #{tmp 30039}#))) - #{tmp 30034}#) - (let ((#{tmp 30042}# + #{tmp 37917}#))) + #{tmp 37912}#) + (let ((#{tmp 37920}# ($sc-dispatch - #{x 29985}# + #{x 37863}# '(#(atom "value") any)))) - (if #{tmp 30042}# + (if #{tmp 37920}# (@apply - (lambda (#{x 30046}#) #{x 30046}#) - #{tmp 30042}#) + (lambda (#{x 37924}#) #{x 37924}#) + #{tmp 37920}#) (syntax-violation #f "source expression failed to match any pattern" - #{x 29985}#)))))))))))))))))) - (lambda (#{x 29546}#) - (let ((#{tmp 29548}# - ($sc-dispatch #{x 29546}# '(_ any)))) - (if #{tmp 29548}# + #{x 37863}#)))))))))))))))))) + (lambda (#{x 37403}#) + (let ((#{tmp 37405}# + ($sc-dispatch #{x 37403}# '(_ any)))) + (if #{tmp 37405}# (@apply - (lambda (#{e 29552}#) - (#{emit 29545}# (#{quasi 29539}# #{e 29552}# 0))) - #{tmp 29548}#) + (lambda (#{e 37409}#) + (#{emit 37402}# (#{quasi 37396}# #{e 37409}# 0))) + #{tmp 37405}#) (syntax-violation #f "source expression failed to match any pattern" - #{x 29546}#))))))) + #{x 37403}#))))))) (define include (make-syntax-transformer 'include 'macro - (lambda (#{x 30101}#) + (lambda (#{x 37980}#) (letrec* - ((#{read-file 30102}# - (lambda (#{fn 30213}# #{k 30214}#) - (let ((#{p 30215}# (open-input-file #{fn 30213}#))) + ((#{read-file 37981}# + (lambda (#{fn 38097}# #{k 38098}#) + (let ((#{p 38099}# (open-input-file #{fn 38097}#))) (letrec* - ((#{f 30216}# - (lambda (#{x 30270}# #{result 30271}#) - (if (eof-object? #{x 30270}#) + ((#{f 38100}# + (lambda (#{x 38157}# #{result 38158}#) + (if (eof-object? #{x 38157}#) (begin - (close-input-port #{p 30215}#) - (reverse #{result 30271}#)) - (#{f 30216}# - (read #{p 30215}#) - (cons (datum->syntax #{k 30214}# #{x 30270}#) - #{result 30271}#)))))) - (#{f 30216}# (read #{p 30215}#) '())))))) - (let ((#{tmp 30104}# - ($sc-dispatch #{x 30101}# '(any any)))) - (if #{tmp 30104}# + (close-input-port #{p 38099}#) + (reverse #{result 38158}#)) + (#{f 38100}# + (read #{p 38099}#) + (cons (datum->syntax #{k 38098}# #{x 38157}#) + #{result 38158}#)))))) + (#{f 38100}# (read #{p 38099}#) '())))))) + (let ((#{tmp 37983}# + ($sc-dispatch #{x 37980}# '(any any)))) + (if #{tmp 37983}# (@apply - (lambda (#{k 30108}# #{filename 30109}#) - (let ((#{fn 30110}# (syntax->datum #{filename 30109}#))) - (let ((#{tmp 30111}# - (#{read-file 30102}# - #{fn 30110}# - #{filename 30109}#))) - (let ((#{tmp 30112}# - ($sc-dispatch #{tmp 30111}# 'each-any))) - (if #{tmp 30112}# + (lambda (#{k 37987}# #{filename 37988}#) + (let ((#{fn 37989}# (syntax->datum #{filename 37988}#))) + (let ((#{tmp 37990}# + (#{read-file 37981}# + #{fn 37989}# + #{filename 37988}#))) + (let ((#{tmp 37991}# + ($sc-dispatch #{tmp 37990}# 'each-any))) + (if #{tmp 37991}# (@apply - (lambda (#{exp 30130}#) + (lambda (#{exp 38009}#) (cons '#(syntax-object begin ((top) #(ribcage () () ()) - #(ribcage #(exp) #((top)) #("i30098")) + #(ribcage #(exp) #((top)) #("i37977")) #(ribcage () () ()) #(ribcage () () ()) - #(ribcage #(fn) #((top)) #("i30093")) + #(ribcage #(fn) #((top)) #("i37972")) #(ribcage #(k filename) #((top) (top)) - #("i30089" "i30090")) - #(ribcage (read-file) ((top)) ("i30073")) - #(ribcage #(x) #((top)) #("i30072"))) + #("i37968" "i37969")) + #(ribcage (read-file) ((top)) ("i37952")) + #(ribcage #(x) #((top)) #("i37951")) + #(ribcage + (include) + ((top)) + (((hygiene guile) + . + #(syntax-object + include + ((top)) + (hygiene guile)))))) (hygiene guile)) - #{exp 30130}#)) - #{tmp 30112}#) + #{exp 38009}#)) + #{tmp 37991}#) (syntax-violation #f "source expression failed to match any pattern" - #{tmp 30111}#)))))) - #{tmp 30104}#) + #{tmp 37990}#)))))) + #{tmp 37983}#) (syntax-violation #f "source expression failed to match any pattern" - #{x 30101}#))))))) + #{x 37980}#))))))) (define include-from-path (make-syntax-transformer 'include-from-path 'macro - (lambda (#{x 30290}#) - (let ((#{tmp 30292}# - ($sc-dispatch #{x 30290}# '(any any)))) - (if #{tmp 30292}# + (lambda (#{x 38178}#) + (let ((#{tmp 38180}# + ($sc-dispatch #{x 38178}# '(any any)))) + (if #{tmp 38180}# (@apply - (lambda (#{k 30296}# #{filename 30297}#) - (let ((#{fn 30298}# (syntax->datum #{filename 30297}#))) - (let ((#{tmp 30299}# + (lambda (#{k 38184}# #{filename 38185}#) + (let ((#{fn 38186}# (syntax->datum #{filename 38185}#))) + (let ((#{tmp 38187}# (datum->syntax - #{filename 30297}# - (let ((#{t 30302}# (%search-load-path #{fn 30298}#))) - (if #{t 30302}# - #{t 30302}# + #{filename 38185}# + (let ((#{t 38190}# (%search-load-path #{fn 38186}#))) + (if #{t 38190}# + #{t 38190}# (syntax-violation 'include-from-path "file not found in path" - #{x 30290}# - #{filename 30297}#)))))) + #{x 38178}# + #{filename 38185}#)))))) (list '#(syntax-object include ((top) #(ribcage () () ()) - #(ribcage #(fn) #((top)) #("i30284")) + #(ribcage #(fn) #((top)) #("i38172")) #(ribcage () () ()) #(ribcage () () ()) - #(ribcage #(fn) #((top)) #("i30280")) + #(ribcage #(fn) #((top)) #("i38168")) #(ribcage #(k filename) #((top) (top)) - #("i30276" "i30277")) + #("i38164" "i38165")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i30273"))) + #(ribcage #(x) #((top)) #("i38161")) + #(ribcage + (include-from-path) + ((top)) + (((hygiene guile) + . + #(syntax-object + include-from-path + ((top)) + (hygiene guile)))))) (hygiene guile)) - #{tmp 30299}#)))) - #{tmp 30292}#) + #{tmp 38187}#)))) + #{tmp 38180}#) (syntax-violation #f "source expression failed to match any pattern" - #{x 30290}#)))))) + #{x 38178}#)))))) (define unquote (make-syntax-transformer 'unquote 'macro - (lambda (#{x 30311}#) + (lambda (#{x 38200}#) (syntax-violation 'unquote "expression not valid outside of quasiquote" - #{x 30311}#)))) + #{x 38200}#)))) (define unquote-splicing (make-syntax-transformer 'unquote-splicing 'macro - (lambda (#{x 30314}#) + (lambda (#{x 38204}#) (syntax-violation 'unquote-splicing "expression not valid outside of quasiquote" - #{x 30314}#)))) + #{x 38204}#)))) (define case (make-syntax-transformer 'case 'macro - (lambda (#{x 30370}#) - (let ((#{tmp 30372}# + (lambda (#{x 38261}#) + (let ((#{tmp 38263}# ($sc-dispatch - #{x 30370}# + #{x 38261}# '(_ any any . each-any)))) - (if #{tmp 30372}# + (if #{tmp 38263}# (@apply - (lambda (#{e 30376}# #{m1 30377}# #{m2 30378}#) - (let ((#{tmp 30379}# + (lambda (#{e 38267}# #{m1 38268}# #{m2 38269}#) + (let ((#{tmp 38270}# (letrec* - ((#{f 30425}# - (lambda (#{clause 30428}# #{clauses 30429}#) - (if (null? #{clauses 30429}#) - (let ((#{tmp 30431}# + ((#{f 38331}# + (lambda (#{clause 38334}# #{clauses 38335}#) + (if (null? #{clauses 38335}#) + (let ((#{tmp 38337}# ($sc-dispatch - #{clause 30428}# + #{clause 38334}# '(#(free-id #(syntax-object else @@ -25216,91 +21962,118 @@ #(ribcage #(f clause clauses) #((top) (top) (top)) - #("i30329" - "i30330" - "i30331")) + #("i38220" + "i38221" + "i38222")) #(ribcage #(e m1 m2) #((top) (top) (top)) - #("i30319" - "i30320" - "i30321")) + #("i38210" + "i38211" + "i38212")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("i30316"))) + #("i38207")) + #(ribcage + (case) + ((top)) + (((hygiene guile) + . + #(syntax-object + case + ((top)) + (hygiene guile)))))) (hygiene guile))) any . each-any)))) - (if #{tmp 30431}# + (if #{tmp 38337}# (@apply - (lambda (#{e1 30435}# #{e2 30436}#) + (lambda (#{e1 38341}# #{e2 38342}#) (cons '#(syntax-object begin ((top) #(ribcage #(e1 e2) #((top) (top)) - #("i30338" "i30339")) + #("i38229" "i38230")) #(ribcage () () ()) #(ribcage #(f clause clauses) #((top) (top) (top)) - #("i30329" - "i30330" - "i30331")) + #("i38220" + "i38221" + "i38222")) #(ribcage #(e m1 m2) #((top) (top) (top)) - #("i30319" - "i30320" - "i30321")) + #("i38210" + "i38211" + "i38212")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("i30316"))) + #("i38207")) + #(ribcage + (case) + ((top)) + (((hygiene guile) + . + #(syntax-object + case + ((top)) + (hygiene guile)))))) (hygiene guile)) - (cons #{e1 30435}# #{e2 30436}#))) - #{tmp 30431}#) - (let ((#{tmp 30437}# + (cons #{e1 38341}# #{e2 38342}#))) + #{tmp 38337}#) + (let ((#{tmp 38343}# ($sc-dispatch - #{clause 30428}# + #{clause 38334}# '(each-any any . each-any)))) - (if #{tmp 30437}# + (if #{tmp 38343}# (@apply - (lambda (#{k 30441}# - #{e1 30442}# - #{e2 30443}#) + (lambda (#{k 38347}# + #{e1 38348}# + #{e2 38349}#) (list '#(syntax-object if ((top) #(ribcage #(k e1 e2) #((top) (top) (top)) - #("i30344" - "i30345" - "i30346")) + #("i38235" + "i38236" + "i38237")) #(ribcage () () ()) #(ribcage #(f clause clauses) #((top) (top) (top)) - #("i30329" - "i30330" - "i30331")) + #("i38220" + "i38221" + "i38222")) #(ribcage #(e m1 m2) #((top) (top) (top)) - #("i30319" - "i30320" - "i30321")) + #("i38210" + "i38211" + "i38212")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("i30316"))) + #("i38207")) + #(ribcage + (case) + ((top)) + (((hygiene guile) + . + #(syntax-object + case + ((top)) + (hygiene guile)))))) (hygiene guile)) (list '#(syntax-object memv @@ -25310,9 +22083,9 @@ #((top) (top) (top)) - #("i30344" - "i30345" - "i30346")) + #("i38235" + "i38236" + "i38237")) #(ribcage () () ()) #(ribcage #(f @@ -25321,22 +22094,32 @@ #((top) (top) (top)) - #("i30329" - "i30330" - "i30331")) + #("i38220" + "i38221" + "i38222")) #(ribcage #(e m1 m2) #((top) (top) (top)) - #("i30319" - "i30320" - "i30321")) + #("i38210" + "i38211" + "i38212")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("i30316"))) + #("i38207")) + #(ribcage + (case) + ((top)) + (((hygiene guile) + . + #(syntax-object + case + ((top)) + (hygiene + guile)))))) (hygiene guile)) '#(syntax-object t @@ -25346,9 +22129,9 @@ #((top) (top) (top)) - #("i30344" - "i30345" - "i30346")) + #("i38235" + "i38236" + "i38237")) #(ribcage () () ()) #(ribcage #(f @@ -25357,22 +22140,32 @@ #((top) (top) (top)) - #("i30329" - "i30330" - "i30331")) + #("i38220" + "i38221" + "i38222")) #(ribcage #(e m1 m2) #((top) (top) (top)) - #("i30319" - "i30320" - "i30321")) + #("i38210" + "i38211" + "i38212")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("i30316"))) + #("i38207")) + #(ribcage + (case) + ((top)) + (((hygiene guile) + . + #(syntax-object + case + ((top)) + (hygiene + guile)))))) (hygiene guile)) (list '#(syntax-object quote @@ -25382,9 +22175,9 @@ #((top) (top) (top)) - #("i30344" - "i30345" - "i30346")) + #("i38235" + "i38236" + "i38237")) #(ribcage () () @@ -25396,17 +22189,17 @@ #((top) (top) (top)) - #("i30329" - "i30330" - "i30331")) + #("i38220" + "i38221" + "i38222")) #(ribcage #(e m1 m2) #((top) (top) (top)) - #("i30319" - "i30320" - "i30321")) + #("i38210" + "i38211" + "i38212")) #(ribcage () () @@ -25414,10 +22207,21 @@ #(ribcage #(x) #((top)) - #("i30316"))) + #("i38207")) + #(ribcage + (case) + ((top)) + (((hygiene + guile) + . + #(syntax-object + case + ((top)) + (hygiene + guile)))))) (hygiene guile)) - #{k 30441}#)) + #{k 38347}#)) (cons '#(syntax-object begin ((top) @@ -25426,9 +22230,9 @@ #((top) (top) (top)) - #("i30344" - "i30345" - "i30346")) + #("i38235" + "i38236" + "i38237")) #(ribcage () () ()) #(ribcage #(f @@ -25437,76 +22241,95 @@ #((top) (top) (top)) - #("i30329" - "i30330" - "i30331")) + #("i38220" + "i38221" + "i38222")) #(ribcage #(e m1 m2) #((top) (top) (top)) - #("i30319" - "i30320" - "i30321")) + #("i38210" + "i38211" + "i38212")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("i30316"))) + #("i38207")) + #(ribcage + (case) + ((top)) + (((hygiene guile) + . + #(syntax-object + case + ((top)) + (hygiene + guile)))))) (hygiene guile)) - (cons #{e1 30442}# - #{e2 30443}#)))) - #{tmp 30437}#) + (cons #{e1 38348}# + #{e2 38349}#)))) + #{tmp 38343}#) (syntax-violation 'case "bad clause" - #{x 30370}# - #{clause 30428}#))))) - (let ((#{tmp 30451}# - (#{f 30425}# - (car #{clauses 30429}#) - (cdr #{clauses 30429}#)))) - (let ((#{tmp 30454}# + #{x 38261}# + #{clause 38334}#))))) + (let ((#{tmp 38357}# + (#{f 38331}# + (car #{clauses 38335}#) + (cdr #{clauses 38335}#)))) + (let ((#{tmp 38360}# ($sc-dispatch - #{clause 30428}# + #{clause 38334}# '(each-any any . each-any)))) - (if #{tmp 30454}# + (if #{tmp 38360}# (@apply - (lambda (#{k 30458}# - #{e1 30459}# - #{e2 30460}#) + (lambda (#{k 38364}# + #{e1 38365}# + #{e2 38366}#) (list '#(syntax-object if ((top) #(ribcage #(k e1 e2) #((top) (top) (top)) - #("i30360" - "i30361" - "i30362")) + #("i38251" + "i38252" + "i38253")) #(ribcage () () ()) #(ribcage #(rest) #((top)) - #("i30356")) + #("i38247")) #(ribcage () () ()) #(ribcage #(f clause clauses) #((top) (top) (top)) - #("i30329" - "i30330" - "i30331")) + #("i38220" + "i38221" + "i38222")) #(ribcage #(e m1 m2) #((top) (top) (top)) - #("i30319" - "i30320" - "i30321")) + #("i38210" + "i38211" + "i38212")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("i30316"))) + #("i38207")) + #(ribcage + (case) + ((top)) + (((hygiene guile) + . + #(syntax-object + case + ((top)) + (hygiene guile)))))) (hygiene guile)) (list '#(syntax-object memv @@ -25514,32 +22337,42 @@ #(ribcage #(k e1 e2) #((top) (top) (top)) - #("i30360" - "i30361" - "i30362")) + #("i38251" + "i38252" + "i38253")) #(ribcage () () ()) #(ribcage #(rest) #((top)) - #("i30356")) + #("i38247")) #(ribcage () () ()) #(ribcage #(f clause clauses) #((top) (top) (top)) - #("i30329" - "i30330" - "i30331")) + #("i38220" + "i38221" + "i38222")) #(ribcage #(e m1 m2) #((top) (top) (top)) - #("i30319" - "i30320" - "i30321")) + #("i38210" + "i38211" + "i38212")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("i30316"))) + #("i38207")) + #(ribcage + (case) + ((top)) + (((hygiene guile) + . + #(syntax-object + case + ((top)) + (hygiene + guile)))))) (hygiene guile)) '#(syntax-object t @@ -25547,32 +22380,42 @@ #(ribcage #(k e1 e2) #((top) (top) (top)) - #("i30360" - "i30361" - "i30362")) + #("i38251" + "i38252" + "i38253")) #(ribcage () () ()) #(ribcage #(rest) #((top)) - #("i30356")) + #("i38247")) #(ribcage () () ()) #(ribcage #(f clause clauses) #((top) (top) (top)) - #("i30329" - "i30330" - "i30331")) + #("i38220" + "i38221" + "i38222")) #(ribcage #(e m1 m2) #((top) (top) (top)) - #("i30319" - "i30320" - "i30321")) + #("i38210" + "i38211" + "i38212")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("i30316"))) + #("i38207")) + #(ribcage + (case) + ((top)) + (((hygiene guile) + . + #(syntax-object + case + ((top)) + (hygiene + guile)))))) (hygiene guile)) (list '#(syntax-object quote @@ -25582,9 +22425,9 @@ #((top) (top) (top)) - #("i30360" - "i30361" - "i30362")) + #("i38251" + "i38252" + "i38253")) #(ribcage () () @@ -25592,7 +22435,7 @@ #(ribcage #(rest) #((top)) - #("i30356")) + #("i38247")) #(ribcage () () @@ -25604,17 +22447,17 @@ #((top) (top) (top)) - #("i30329" - "i30330" - "i30331")) + #("i38220" + "i38221" + "i38222")) #(ribcage #(e m1 m2) #((top) (top) (top)) - #("i30319" - "i30320" - "i30321")) + #("i38210" + "i38211" + "i38212")) #(ribcage () () @@ -25622,232 +22465,415 @@ #(ribcage #(x) #((top)) - #("i30316"))) + #("i38207")) + #(ribcage + (case) + ((top)) + (((hygiene + guile) + . + #(syntax-object + case + ((top)) + (hygiene + guile)))))) (hygiene guile)) - #{k 30458}#)) + #{k 38364}#)) (cons '#(syntax-object begin ((top) #(ribcage #(k e1 e2) #((top) (top) (top)) - #("i30360" - "i30361" - "i30362")) + #("i38251" + "i38252" + "i38253")) #(ribcage () () ()) #(ribcage #(rest) #((top)) - #("i30356")) + #("i38247")) #(ribcage () () ()) #(ribcage #(f clause clauses) #((top) (top) (top)) - #("i30329" - "i30330" - "i30331")) + #("i38220" + "i38221" + "i38222")) #(ribcage #(e m1 m2) #((top) (top) (top)) - #("i30319" - "i30320" - "i30321")) + #("i38210" + "i38211" + "i38212")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("i30316"))) + #("i38207")) + #(ribcage + (case) + ((top)) + (((hygiene guile) + . + #(syntax-object + case + ((top)) + (hygiene + guile)))))) (hygiene guile)) - (cons #{e1 30459}# - #{e2 30460}#)) - #{tmp 30451}#)) - #{tmp 30454}#) + (cons #{e1 38365}# + #{e2 38366}#)) + #{tmp 38357}#)) + #{tmp 38360}#) (syntax-violation 'case "bad clause" - #{x 30370}# - #{clause 30428}#)))))))) - (#{f 30425}# #{m1 30377}# #{m2 30378}#)))) - (let ((#{body 30380}# #{tmp 30379}#)) + #{x 38261}# + #{clause 38334}#)))))))) + (#{f 38331}# #{m1 38268}# #{m2 38269}#)))) + (let ((#{body 38271}# #{tmp 38270}#)) (list '#(syntax-object let ((top) #(ribcage () () ()) - #(ribcage #(body) #((top)) #("i30327")) + #(ribcage #(body) #((top)) #("i38218")) #(ribcage #(e m1 m2) #((top) (top) (top)) - #("i30319" "i30320" "i30321")) + #("i38210" "i38211" "i38212")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i30316"))) + #(ribcage #(x) #((top)) #("i38207")) + #(ribcage + (case) + ((top)) + (((hygiene guile) + . + #(syntax-object + case + ((top)) + (hygiene guile)))))) (hygiene guile)) (list (list '#(syntax-object t ((top) #(ribcage () () ()) - #(ribcage #(body) #((top)) #("i30327")) + #(ribcage #(body) #((top)) #("i38218")) #(ribcage #(e m1 m2) #((top) (top) (top)) - #("i30319" "i30320" "i30321")) + #("i38210" "i38211" "i38212")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i30316"))) + #(ribcage #(x) #((top)) #("i38207")) + #(ribcage + (case) + ((top)) + (((hygiene guile) + . + #(syntax-object + case + ((top)) + (hygiene guile)))))) (hygiene guile)) - #{e 30376}#)) - #{body 30380}#)))) - #{tmp 30372}#) + #{e 38267}#)) + #{body 38271}#)))) + #{tmp 38263}#) (syntax-violation #f "source expression failed to match any pattern" - #{x 30370}#)))))) + #{x 38261}#)))))) (define make-variable-transformer - (lambda (#{proc 30478}#) - (if (procedure? #{proc 30478}#) + (lambda (#{proc 38385}#) + (if (procedure? #{proc 38385}#) (letrec* - ((#{trans 30479}# - (lambda (#{x 30485}#) - (#{proc 30478}# #{x 30485}#)))) + ((#{trans 38386}# + (lambda (#{x 38392}#) + (#{proc 38385}# #{x 38392}#)))) (begin (set-procedure-property! - #{trans 30479}# + #{trans 38386}# 'variable-transformer #t) - #{trans 30479}#)) + #{trans 38386}#)) (error "variable transformer not a procedure" - #{proc 30478}#)))) + #{proc 38385}#)))) (define identifier-syntax (make-syntax-transformer 'identifier-syntax 'macro - (lambda (#{x 30517}#) - (let ((#{tmp 30519}# - ($sc-dispatch #{x 30517}# '(_ any)))) - (if #{tmp 30519}# + (lambda (#{x 38425}#) + (let ((#{tmp 38427}# + ($sc-dispatch #{x 38425}# '(_ any)))) + (if #{tmp 38427}# (@apply - (lambda (#{e 30523}#) + (lambda (#{e 38431}#) (list '#(syntax-object lambda ((top) - #(ribcage #(e) #((top)) #("i30492")) + #(ribcage #(e) #((top)) #("i38400")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i30489"))) + #(ribcage #(x) #((top)) #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) '(#(syntax-object x ((top) - #(ribcage #(e) #((top)) #("i30492")) + #(ribcage #(e) #((top)) #("i38400")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i30489"))) + #(ribcage #(x) #((top)) #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile))) '#((#(syntax-object macro-type ((top) - #(ribcage #(e) #((top)) #("i30492")) + #(ribcage #(e) #((top)) #("i38400")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i30489"))) + #(ribcage #(x) #((top)) #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) . #(syntax-object identifier-syntax ((top) - #(ribcage #(e) #((top)) #("i30492")) + #(ribcage #(e) #((top)) #("i38400")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i30489"))) + #(ribcage #(x) #((top)) #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)))) (list '#(syntax-object syntax-case ((top) - #(ribcage #(e) #((top)) #("i30492")) + #(ribcage #(e) #((top)) #("i38400")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i30489"))) + #(ribcage #(x) #((top)) #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) '#(syntax-object x ((top) - #(ribcage #(e) #((top)) #("i30492")) + #(ribcage #(e) #((top)) #("i38400")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i30489"))) + #(ribcage #(x) #((top)) #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) '() (list '#(syntax-object id ((top) - #(ribcage #(e) #((top)) #("i30492")) + #(ribcage #(e) #((top)) #("i38400")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i30489"))) + #(ribcage #(x) #((top)) #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) '(#(syntax-object identifier? ((top) - #(ribcage #(e) #((top)) #("i30492")) + #(ribcage #(e) #((top)) #("i38400")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i30489"))) + #(ribcage #(x) #((top)) #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) (#(syntax-object syntax ((top) - #(ribcage #(e) #((top)) #("i30492")) + #(ribcage #(e) #((top)) #("i38400")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i30489"))) + #(ribcage #(x) #((top)) #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) #(syntax-object id ((top) - #(ribcage #(e) #((top)) #("i30492")) + #(ribcage #(e) #((top)) #("i38400")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i30489"))) + #(ribcage #(x) #((top)) #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)))) (list '#(syntax-object syntax ((top) - #(ribcage #(e) #((top)) #("i30492")) + #(ribcage #(e) #((top)) #("i38400")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i30489"))) + #(ribcage #(x) #((top)) #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) - #{e 30523}#)) + #{e 38431}#)) (list '(#(syntax-object _ ((top) - #(ribcage #(e) #((top)) #("i30492")) + #(ribcage #(e) #((top)) #("i38400")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i30489"))) + #(ribcage #(x) #((top)) #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) #(syntax-object x ((top) - #(ribcage #(e) #((top)) #("i30492")) + #(ribcage #(e) #((top)) #("i38400")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i30489"))) + #(ribcage #(x) #((top)) #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) #(syntax-object ... ((top) - #(ribcage #(e) #((top)) #("i30492")) + #(ribcage #(e) #((top)) #("i38400")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i30489"))) + #(ribcage #(x) #((top)) #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile))) (list '#(syntax-object syntax ((top) - #(ribcage #(e) #((top)) #("i30492")) + #(ribcage #(e) #((top)) #("i38400")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i30489"))) + #(ribcage #(x) #((top)) #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) - (cons #{e 30523}# + (cons #{e 38431}# '(#(syntax-object x ((top) #(ribcage #(e) #((top)) - #("i30492")) + #("i38400")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("i30489"))) + #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) #(syntax-object ... @@ -25855,55 +22881,82 @@ #(ribcage #(e) #((top)) - #("i30492")) + #("i38400")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("i30489"))) + #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile))))))))) - #{tmp 30519}#) - (let ((#{tmp 30524}# + #{tmp 38427}#) + (let ((#{tmp 38432}# ($sc-dispatch - #{x 30517}# + #{x 38425}# '(_ (any any) ((#(free-id #(syntax-object set! ((top) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i30489"))) + #(ribcage #(x) #((top)) #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile))) any any) any))))) - (if (if #{tmp 30524}# + (if (if #{tmp 38432}# (@apply - (lambda (#{id 30528}# - #{exp1 30529}# - #{var 30530}# - #{val 30531}# - #{exp2 30532}#) - (if (identifier? #{id 30528}#) - (identifier? #{var 30530}#) + (lambda (#{id 38436}# + #{exp1 38437}# + #{var 38438}# + #{val 38439}# + #{exp2 38440}#) + (if (identifier? #{id 38436}#) + (identifier? #{var 38438}#) #f)) - #{tmp 30524}#) + #{tmp 38432}#) #f) (@apply - (lambda (#{id 30533}# - #{exp1 30534}# - #{var 30535}# - #{val 30536}# - #{exp2 30537}#) + (lambda (#{id 38441}# + #{exp1 38442}# + #{var 38443}# + #{val 38444}# + #{exp2 38445}#) (list '#(syntax-object make-variable-transformer ((top) #(ribcage #(id exp1 var val exp2) #((top) (top) (top) (top) (top)) - #("i30507" "i30508" "i30509" "i30510" "i30511")) + #("i38415" "i38416" "i38417" "i38418" "i38419")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i30489"))) + #(ribcage #(x) #((top)) #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) (list '#(syntax-object lambda @@ -25911,13 +22964,22 @@ #(ribcage #(id exp1 var val exp2) #((top) (top) (top) (top) (top)) - #("i30507" - "i30508" - "i30509" - "i30510" - "i30511")) + #("i38415" + "i38416" + "i38417" + "i38418" + "i38419")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i30489"))) + #(ribcage #(x) #((top)) #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) '(#(syntax-object x @@ -25925,13 +22987,22 @@ #(ribcage #(id exp1 var val exp2) #((top) (top) (top) (top) (top)) - #("i30507" - "i30508" - "i30509" - "i30510" - "i30511")) + #("i38415" + "i38416" + "i38417" + "i38418" + "i38419")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i30489"))) + #(ribcage #(x) #((top)) #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile))) '#((#(syntax-object macro-type @@ -25939,13 +23010,22 @@ #(ribcage #(id exp1 var val exp2) #((top) (top) (top) (top) (top)) - #("i30507" - "i30508" - "i30509" - "i30510" - "i30511")) + #("i38415" + "i38416" + "i38417" + "i38418" + "i38419")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i30489"))) + #(ribcage #(x) #((top)) #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) . #(syntax-object @@ -25954,13 +23034,22 @@ #(ribcage #(id exp1 var val exp2) #((top) (top) (top) (top) (top)) - #("i30507" - "i30508" - "i30509" - "i30510" - "i30511")) + #("i38415" + "i38416" + "i38417" + "i38418" + "i38419")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i30489"))) + #(ribcage #(x) #((top)) #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)))) (list '#(syntax-object syntax-case @@ -25968,13 +23057,22 @@ #(ribcage #(id exp1 var val exp2) #((top) (top) (top) (top) (top)) - #("i30507" - "i30508" - "i30509" - "i30510" - "i30511")) + #("i38415" + "i38416" + "i38417" + "i38418" + "i38419")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i30489"))) + #(ribcage #(x) #((top)) #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) '#(syntax-object x @@ -25982,13 +23080,22 @@ #(ribcage #(id exp1 var val exp2) #((top) (top) (top) (top) (top)) - #("i30507" - "i30508" - "i30509" - "i30510" - "i30511")) + #("i38415" + "i38416" + "i38417" + "i38418" + "i38419")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i30489"))) + #(ribcage #(x) #((top)) #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) '(#(syntax-object set! @@ -25996,13 +23103,22 @@ #(ribcage #(id exp1 var val exp2) #((top) (top) (top) (top) (top)) - #("i30507" - "i30508" - "i30509" - "i30510" - "i30511")) + #("i38415" + "i38416" + "i38417" + "i38418" + "i38419")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i30489"))) + #(ribcage #(x) #((top)) #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile))) (list (list '#(syntax-object set! @@ -26014,19 +23130,28 @@ (top) (top) (top)) - #("i30507" - "i30508" - "i30509" - "i30510" - "i30511")) + #("i38415" + "i38416" + "i38417" + "i38418" + "i38419")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("i30489"))) + #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) - #{var 30535}# - #{val 30536}#) + #{var 38443}# + #{val 38444}#) (list '#(syntax-object syntax ((top) @@ -26037,19 +23162,28 @@ (top) (top) (top)) - #("i30507" - "i30508" - "i30509" - "i30510" - "i30511")) + #("i38415" + "i38416" + "i38417" + "i38418" + "i38419")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("i30489"))) + #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) - #{exp2 30537}#)) - (list (cons #{id 30533}# + #{exp2 38445}#)) + (list (cons #{id 38441}# '(#(syntax-object x ((top) @@ -26060,16 +23194,25 @@ (top) (top) (top)) - #("i30507" - "i30508" - "i30509" - "i30510" - "i30511")) + #("i38415" + "i38416" + "i38417" + "i38418" + "i38419")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("i30489"))) + #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) #(syntax-object ... @@ -26081,16 +23224,25 @@ (top) (top) (top)) - #("i30507" - "i30508" - "i30509" - "i30510" - "i30511")) + #("i38415" + "i38416" + "i38417" + "i38418" + "i38419")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("i30489"))) + #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)))) (list '#(syntax-object syntax @@ -26102,18 +23254,27 @@ (top) (top) (top)) - #("i30507" - "i30508" - "i30509" - "i30510" - "i30511")) + #("i38415" + "i38416" + "i38417" + "i38418" + "i38419")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("i30489"))) + #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) - (cons #{exp1 30534}# + (cons #{exp1 38442}# '(#(syntax-object x ((top) @@ -26128,16 +23289,26 @@ (top) (top) (top)) - #("i30507" - "i30508" - "i30509" - "i30510" - "i30511")) + #("i38415" + "i38416" + "i38417" + "i38418" + "i38419")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("i30489"))) + #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene + guile)))))) (hygiene guile)) #(syntax-object ... @@ -26153,18 +23324,28 @@ (top) (top) (top)) - #("i30507" - "i30508" - "i30509" - "i30510" - "i30511")) + #("i38415" + "i38416" + "i38417" + "i38418" + "i38419")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("i30489"))) + #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene + guile)))))) (hygiene guile)))))) - (list #{id 30533}# + (list #{id 38441}# (list '#(syntax-object identifier? ((top) @@ -26175,16 +23356,25 @@ (top) (top) (top)) - #("i30507" - "i30508" - "i30509" - "i30510" - "i30511")) + #("i38415" + "i38416" + "i38417" + "i38418" + "i38419")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("i30489"))) + #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) (list '#(syntax-object syntax @@ -26200,18 +23390,28 @@ (top) (top) (top)) - #("i30507" - "i30508" - "i30509" - "i30510" - "i30511")) + #("i38415" + "i38416" + "i38417" + "i38418" + "i38419")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("i30489"))) + #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene + guile)))))) (hygiene guile)) - #{id 30533}#)) + #{id 38441}#)) (list '#(syntax-object syntax ((top) @@ -26222,68 +23422,95 @@ (top) (top) (top)) - #("i30507" - "i30508" - "i30509" - "i30510" - "i30511")) + #("i38415" + "i38416" + "i38417" + "i38418" + "i38419")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("i30489"))) + #("i38397")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) - #{exp1 30534}#)))))) - #{tmp 30524}#) + #{exp1 38442}#)))))) + #{tmp 38432}#) (syntax-violation #f "source expression failed to match any pattern" - #{x 30517}#)))))))) + #{x 38425}#)))))))) (define define* (make-syntax-transformer 'define* 'macro - (lambda (#{x 30569}#) - (let ((#{tmp 30571}# + (lambda (#{x 38478}#) + (let ((#{tmp 38480}# ($sc-dispatch - #{x 30569}# + #{x 38478}# '(_ (any . any) any . each-any)))) - (if #{tmp 30571}# + (if #{tmp 38480}# (@apply - (lambda (#{id 30575}# - #{args 30576}# - #{b0 30577}# - #{b1 30578}#) + (lambda (#{id 38484}# + #{args 38485}# + #{b0 38486}# + #{b1 38487}#) (list '#(syntax-object define ((top) #(ribcage #(id args b0 b1) #((top) (top) (top) (top)) - #("i30551" "i30552" "i30553" "i30554")) + #("i38460" "i38461" "i38462" "i38463")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i30548"))) + #(ribcage #(x) #((top)) #("i38457")) + #(ribcage + (define*) + ((top)) + (((hygiene guile) + . + #(syntax-object + define* + ((top)) + (hygiene guile)))))) (hygiene guile)) - #{id 30575}# + #{id 38484}# (cons '#(syntax-object lambda* ((top) #(ribcage #(id args b0 b1) #((top) (top) (top) (top)) - #("i30551" "i30552" "i30553" "i30554")) + #("i38460" "i38461" "i38462" "i38463")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i30548"))) + #(ribcage #(x) #((top)) #("i38457")) + #(ribcage + (define*) + ((top)) + (((hygiene guile) + . + #(syntax-object + define* + ((top)) + (hygiene guile)))))) (hygiene guile)) - (cons #{args 30576}# - (cons #{b0 30577}# #{b1 30578}#))))) - #{tmp 30571}#) - (let ((#{tmp 30579}# - ($sc-dispatch #{x 30569}# '(_ any any)))) - (if (if #{tmp 30579}# + (cons #{args 38485}# + (cons #{b0 38486}# #{b1 38487}#))))) + #{tmp 38480}#) + (let ((#{tmp 38488}# + ($sc-dispatch #{x 38478}# '(_ any any)))) + (if (if #{tmp 38488}# (@apply - (lambda (#{id 30583}# #{val 30584}#) + (lambda (#{id 38492}# #{val 38493}#) (identifier? '#(syntax-object x @@ -26291,29 +23518,47 @@ #(ribcage #(id val) #((top) (top)) - #("i30561" "i30562")) + #("i38470" "i38471")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i30548"))) + #(ribcage #(x) #((top)) #("i38457")) + #(ribcage + (define*) + ((top)) + (((hygiene guile) + . + #(syntax-object + define* + ((top)) + (hygiene guile)))))) (hygiene guile)))) - #{tmp 30579}#) + #{tmp 38488}#) #f) (@apply - (lambda (#{id 30585}# #{val 30586}#) + (lambda (#{id 38494}# #{val 38495}#) (list '#(syntax-object define ((top) #(ribcage #(id val) #((top) (top)) - #("i30565" "i30566")) + #("i38474" "i38475")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("i30548"))) + #(ribcage #(x) #((top)) #("i38457")) + #(ribcage + (define*) + ((top)) + (((hygiene guile) + . + #(syntax-object + define* + ((top)) + (hygiene guile)))))) (hygiene guile)) - #{id 30585}# - #{val 30586}#)) - #{tmp 30579}#) + #{id 38494}# + #{val 38495}#)) + #{tmp 38488}#) (syntax-violation #f "source expression failed to match any pattern" - #{x 30569}#)))))))) + #{x 38478}#)))))))) diff --git a/module/ice-9/psyntax.scm b/module/ice-9/psyntax.scm index e522f5467..76edfb043 100644 --- a/module/ice-9/psyntax.scm +++ b/module/ice-9/psyntax.scm @@ -51,7 +51,7 @@ ;;; bound-identifier=? ;;; datum->syntax ;;; define-syntax -;;; fluid-let-syntax +;;; syntax-parameterize ;;; free-identifier=? ;;; generate-temporaries ;;; identifier? @@ -312,9 +312,9 @@ (lambda (source) (make-void source))) - (define build-application + (define build-call (lambda (source fun-exp arg-exps) - (make-application source fun-exp arg-exps))) + (make-call source fun-exp arg-exps))) (define build-conditional (lambda (source test-exp then-exp else-exp) @@ -401,12 +401,14 @@ (lambda (src req opt rest kw inits vars body else-case) (make-lambda-case src req opt rest kw inits vars body else-case))) + (define build-primcall + (lambda (src name args) + (make-primcall src name args))) + (define build-primref (lambda (src name) - (if (equal? (module-name (current-module)) '(guile)) - (make-toplevel-ref src name) - (make-module-ref src '(guile) name #f)))) - + (make-primitive-ref src name))) + (define (build-data src exp) (make-const src exp)) @@ -414,7 +416,7 @@ (lambda (src exps) (if (null? (cdr exps)) (car exps) - (make-sequence src exps)))) + (make-seq src (car exps) (build-sequence #f (cdr exps)))))) (define build-let (lambda (src ids vars val-exps body-exp) @@ -435,8 +437,8 @@ (make-letrec src #f (list f-name) (list f) (list proc) - (build-application src (build-lexical-reference 'fun src f-name f) - val-exps)))))) + (build-call src (build-lexical-reference 'fun src f-name f) + val-exps)))))) (define build-letrec (lambda (src in-order? ids vars val-exps body-exp) @@ -484,18 +486,20 @@ ;; global (assumed global variable) and displaced-lexical (see below) ;; do not show up in any environment; instead, they are fabricated by - ;; lookup when it finds no other bindings. + ;; resolve-identifier when it finds no other bindings. ;; <environment> ::= ((<label> . <binding>)*) ;; identifier bindings include a type and a value ;; <binding> ::= (macro . <procedure>) macros + ;; (syntax-parameter . (<procedure>)) syntax parameters ;; (core . <procedure>) core forms ;; (module-ref . <procedure>) @ or @@ ;; (begin) begin ;; (define) define ;; (define-syntax) define-syntax + ;; (define-syntax-parameter) define-syntax-parameter ;; (local-syntax . rec?) let-syntax/letrec-syntax ;; (eval-when) eval-when ;; (syntax . (<var> . <level>)) pattern variables @@ -505,11 +509,11 @@ ;; <level> ::= <nonnegative integer> ;; <var> ::= variable returned by build-lexical-var - ;; a macro is a user-defined syntactic-form. a core is a system-defined - ;; syntactic form. begin, define, define-syntax, and eval-when are - ;; treated specially since they are sensitive to whether the form is - ;; at top-level and (except for eval-when) can denote valid internal - ;; definitions. + ;; a macro is a user-defined syntactic-form. a core is a + ;; system-defined syntactic form. begin, define, define-syntax, + ;; define-syntax-parameter, and eval-when are treated specially + ;; since they are sensitive to whether the form is at top-level and + ;; (except for eval-when) can denote valid internal definitions. ;; a pattern variable is a variable introduced by syntax-case and can ;; be referenced only within a syntax form. @@ -561,22 +565,10 @@ (if (null? r) '() (let ((a (car r))) - (if (eq? (cadr a) 'macro) + (if (memq (cadr a) '(macro syntax-parameter)) (cons a (macros-only-env (cdr r))) (macros-only-env (cdr r))))))) - (define lookup - ;; x may be a label or a symbol - ;; although symbols are usually global, we check the environment first - ;; anyway because a temporary binding may have been established by - ;; fluid-let-syntax - (lambda (x r mod) - (cond - ((assq x r) => cdr) - ((symbol? x) - (or (get-global-definition-hook x mod) (make-binding 'global))) - (else (make-binding 'displaced-lexical))))) - (define global-extend (lambda (type sym val) (put-global-definition-hook sym type val))) @@ -736,62 +728,165 @@ (same-marks? (cdr x) (cdr y)))))) (define id-var-name - (lambda (id w) + ;; Syntax objects use wraps to associate names with marked + ;; identifiers. This function returns the name corresponding to + ;; the given identifier and wrap, or the original identifier if no + ;; corresponding name was found. + ;; + ;; The name may be a string created by gen-label, indicating a + ;; lexical binding, or another syntax object, indicating a + ;; reference to a top-level definition created during a previous + ;; macroexpansion. + ;; + ;; For lexical variables, finding a label simply amounts to + ;; looking for an entry with the same symbolic name and the same + ;; marks. Finding a toplevel definition is the same, except we + ;; also have to compare modules, hence the `mod' parameter. + ;; Instead of adding a separate entry in the ribcage for modules, + ;; which wouldn't be used for lexicals, we arrange for the entry + ;; for the name entry to be a pair with the module in its car, and + ;; the name itself in the cdr. So if the name that we find is a + ;; pair, we have to check modules. + ;; + ;; The identifer may be passed in wrapped or unwrapped. In any + ;; case, this routine returns either a symbol, a syntax object, or + ;; a string label. + ;; + (lambda (id w mod) (define-syntax-rule (first e) ;; Rely on Guile's multiple-values truncation. e) (define search - (lambda (sym subst marks) + (lambda (sym subst marks mod) (if (null? subst) (values #f marks) (let ((fst (car subst))) (if (eq? fst 'shift) - (search sym (cdr subst) (cdr marks)) + (search sym (cdr subst) (cdr marks) mod) (let ((symnames (ribcage-symnames fst))) (if (vector? symnames) - (search-vector-rib sym subst marks symnames fst) - (search-list-rib sym subst marks symnames fst)))))))) + (search-vector-rib sym subst marks symnames fst mod) + (search-list-rib sym subst marks symnames fst mod)))))))) (define search-list-rib - (lambda (sym subst marks symnames ribcage) + (lambda (sym subst marks symnames ribcage mod) (let f ((symnames symnames) (i 0)) (cond - ((null? symnames) (search sym (cdr subst) marks)) + ((null? symnames) (search sym (cdr subst) marks mod)) ((and (eq? (car symnames) sym) (same-marks? marks (list-ref (ribcage-marks ribcage) i))) - (values (list-ref (ribcage-labels ribcage) i) marks)) + (let ((n (list-ref (ribcage-labels ribcage) i))) + (if (pair? n) + (if (equal? mod (car n)) + (values (cdr n) marks) + (f (cdr symnames) (fx+ i 1))) + (values n marks)))) (else (f (cdr symnames) (fx+ i 1))))))) (define search-vector-rib - (lambda (sym subst marks symnames ribcage) + (lambda (sym subst marks symnames ribcage mod) (let ((n (vector-length symnames))) (let f ((i 0)) (cond - ((fx= i n) (search sym (cdr subst) marks)) + ((fx= i n) (search sym (cdr subst) marks mod)) ((and (eq? (vector-ref symnames i) sym) (same-marks? marks (vector-ref (ribcage-marks ribcage) i))) - (values (vector-ref (ribcage-labels ribcage) i) marks)) + (let ((n (vector-ref (ribcage-labels ribcage) i))) + (if (pair? n) + (if (equal? mod (car n)) + (values (cdr n) marks) + (f (fx+ i 1))) + (values n marks)))) (else (f (fx+ i 1)))))))) (cond ((symbol? id) - (or (first (search id (wrap-subst w) (wrap-marks w))) id)) + (or (first (search id (wrap-subst w) (wrap-marks w) mod)) id)) ((syntax-object? id) (let ((id (syntax-object-expression id)) - (w1 (syntax-object-wrap id))) + (w1 (syntax-object-wrap id)) + (mod (syntax-object-module id))) (let ((marks (join-marks (wrap-marks w) (wrap-marks w1)))) - (call-with-values (lambda () (search id (wrap-subst w) marks)) + (call-with-values (lambda () (search id (wrap-subst w) marks mod)) (lambda (new-id marks) (or new-id - (first (search id (wrap-subst w1) marks)) + (first (search id (wrap-subst w1) marks mod)) id)))))) (else (syntax-violation 'id-var-name "invalid id" id))))) + ;; Returns three values: binding type, binding value, the module (for + ;; resolving toplevel vars). + (define (resolve-identifier id w r mod resolve-syntax-parameters?) + (define (resolve-syntax-parameters b) + (if (and resolve-syntax-parameters? + (eq? (binding-type b) 'syntax-parameter)) + (or (assq-ref r (binding-value b)) + (make-binding 'macro (car (binding-value b)))) + b)) + (define (resolve-global var mod) + (let ((b (resolve-syntax-parameters + (or (get-global-definition-hook var mod) + (make-binding 'global))))) + (if (eq? (binding-type b) 'global) + (values 'global var mod) + (values (binding-type b) (binding-value b) mod)))) + (define (resolve-lexical label mod) + (let ((b (resolve-syntax-parameters + (or (assq-ref r label) + (make-binding 'displaced-lexical))))) + (values (binding-type b) (binding-value b) mod))) + (let ((n (id-var-name id w mod))) + (cond + ((syntax-object? n) + ;; Recursing allows syntax-parameterize to override + ;; macro-introduced syntax parameters. + (resolve-identifier n w r mod resolve-syntax-parameters?)) + ((symbol? n) + (resolve-global n (if (syntax-object? id) + (syntax-object-module id) + mod))) + ((string? n) + (resolve-lexical n (if (syntax-object? id) + (syntax-object-module id) + mod))) + (else + (error "unexpected id-var-name" id w n))))) + ;; free-id=? must be passed fully wrapped ids since (free-id=? x y) ;; may be true even if (free-id=? (wrap x w) (wrap y w)) is not. (define free-id=? (lambda (i j) - (and (eq? (id-sym-name i) (id-sym-name j)) ; accelerator - (eq? (id-var-name i empty-wrap) (id-var-name j empty-wrap))))) - + (let* ((mi (and (syntax-object? i) (syntax-object-module i))) + (mj (and (syntax-object? j) (syntax-object-module j))) + (ni (id-var-name i empty-wrap mi)) + (nj (id-var-name j empty-wrap mj))) + (define (id-module-binding id mod) + (module-variable + (if mod + ;; The normal case. + (resolve-module (cdr mod)) + ;; Either modules have not been booted, or we have a + ;; raw symbol coming in, which is possible. + (current-module)) + (id-sym-name id))) + (cond + ((syntax-object? ni) (free-id=? ni j)) + ((syntax-object? nj) (free-id=? i nj)) + ((symbol? ni) + ;; `i' is not lexically bound. Assert that `j' is free, + ;; and if so, compare their bindings, that they are either + ;; bound to the same variable, or both unbound and have + ;; the same name. + (and (eq? nj (id-sym-name j)) + (let ((bi (id-module-binding i mi))) + (if bi + (eq? bi (id-module-binding j mj)) + (and (not (id-module-binding j mj)) + (eq? ni nj)))) + (eq? (id-module-binding i mi) (id-module-binding j mj)))) + (else + ;; Otherwise `i' is bound, so check that `j' is bound, and + ;; bound to the same thing. + (equal? ni nj)))))) + ;; bound-id=? may be passed unwrapped (or partially wrapped) ids as ;; long as the missing portion of the wrap is common to both of the ids ;; since (bound-id=? x y) iff (bound-id=? (wrap x w) (wrap y w)) @@ -882,159 +977,171 @@ ;; (define expand-top-sequence (lambda (body r w s m esew mod) - (define (scan body r w s m esew mod exps) - (cond - ((null? body) - ;; in reversed order - exps) - (else + (let* ((r (cons '("placeholder" . (placeholder)) r)) + (ribcage (make-empty-ribcage)) + (w (make-wrap (wrap-marks w) (cons ribcage (wrap-subst w))))) + (define (record-definition! id var) + (let ((mod (cons 'hygiene (module-name (current-module))))) + ;; Ribcages map symbol+marks to names, mostly for + ;; resolving lexicals. Here to add a mapping for toplevel + ;; definitions we also need to match the module. So, we + ;; put it in the name instead, and make id-var-name handle + ;; the special case of names that are pairs. See the + ;; comments in id-var-name for more. + (extend-ribcage! ribcage id + (cons (syntax-object-module id) + (wrap var top-wrap mod))))) + (define (macro-introduced-identifier? id) + (not (equal? (wrap-marks (syntax-object-wrap id)) '(top)))) + (define (fresh-derived-name id orig-form) + (symbol-append + (syntax-object-expression id) + '- + (string->symbol + ;; FIXME: `hash' currently stops descending into nested + ;; data at some point, so it's less unique than we would + ;; like. Also this encodes hash values into the ABI of + ;; compiled modules; a problem? + (number->string + (hash (syntax->datum orig-form) most-positive-fixnum) + 16)))) + (define (parse body r w s m esew mod) + (let lp ((body body) (exps '())) + (if (null? body) + exps + (lp (cdr body) + (append (parse1 (car body) r w s m esew mod) + exps))))) + (define (parse1 x r w s m esew mod) (call-with-values (lambda () - (call-with-values - (lambda () - (let ((e (car body))) - (syntax-type e r w (or (source-annotation e) s) #f mod #f))) - (lambda (type value e w s mod) - (case type - ((begin-form) - (syntax-case e () - ((_) exps) - ((_ e1 e2 ...) - (scan #'(e1 e2 ...) r w s m esew mod exps)))) - ((local-syntax-form) - (expand-local-syntax value e r w s mod - (lambda (body r w s mod) - (scan body r w s m esew mod exps)))) - ((eval-when-form) - (syntax-case e () - ((_ (x ...) e1 e2 ...) - (let ((when-list (parse-when-list e #'(x ...))) - (body #'(e1 e2 ...))) - (cond - ((eq? m 'e) - (if (memq 'eval when-list) - (scan body r w s - (if (memq 'expand when-list) 'c&e 'e) - '(eval) - mod exps) - (begin - (if (memq 'expand when-list) - (top-level-eval-hook - (expand-top-sequence body r w s 'e '(eval) mod) - mod)) - (values exps)))) - ((memq 'load when-list) - (if (or (memq 'compile when-list) - (memq 'expand when-list) - (and (eq? m 'c&e) (memq 'eval when-list))) - (scan body r w s 'c&e '(compile load) mod exps) - (if (memq m '(c c&e)) - (scan body r w s 'c '(load) mod exps) - (values exps)))) - ((or (memq 'compile when-list) - (memq 'expand when-list) - (and (eq? m 'c&e) (memq 'eval when-list))) - (top-level-eval-hook - (expand-top-sequence body r w s 'e '(eval) mod) - mod) - (values exps)) - (else - (values exps))))))) - ((define-syntax-form) - (let ((n (id-var-name value w)) (r (macros-only-env r))) - (case m - ((c) - (if (memq 'compile esew) - (let ((e (expand-install-global n (expand e r w mod)))) - (top-level-eval-hook e mod) - (if (memq 'load esew) - (values (cons e exps)) - (values exps))) - (if (memq 'load esew) - (values (cons (expand-install-global n (expand e r w mod)) - exps)) - (values exps)))) - ((c&e) - (let ((e (expand-install-global n (expand e r w mod)))) - (top-level-eval-hook e mod) - (values (cons e exps)))) - (else - (if (memq 'eval esew) - (top-level-eval-hook - (expand-install-global n (expand e r w mod)) - mod)) - (values exps))))) - ((define-form) - (let* ((n (id-var-name value w)) - ;; Lookup the name in the module of the define form. - (type (binding-type (lookup n r mod)))) - (case type - ((global core macro module-ref) - ;; affect compile-time environment (once we have booted) - (if (and (memq m '(c c&e)) - (not (module-local-variable (current-module) n)) - (current-module)) - (let ((old (module-variable (current-module) n))) - ;; use value of the same-named imported variable, if - ;; any - (if (and (variable? old) (variable-bound? old)) - (module-define! (current-module) n (variable-ref old)) - (module-add! (current-module) n (make-undefined-variable))))) - (values - (cons - (if (eq? m 'c&e) - (let ((x (build-global-definition s n (expand e r w mod)))) - (top-level-eval-hook x mod) - x) - (lambda () - (build-global-definition s n (expand e r w mod)))) - exps))) - ((displaced-lexical) - (syntax-violation #f "identifier out of context" - e (wrap value w mod))) - (else - (syntax-violation #f "cannot define keyword at top level" - e (wrap value w mod)))))) - (else - (values (cons - (if (eq? m 'c&e) - (let ((x (expand-expr type value e r w s mod))) - (top-level-eval-hook x mod) - x) - (lambda () - (expand-expr type value e r w s mod))) - exps))))))) - (lambda (exps) - (scan (cdr body) r w s m esew mod exps)))))) - - (call-with-values (lambda () - (scan body r w s m esew mod '())) - (lambda (exps) + (syntax-type x r w (source-annotation x) ribcage mod #f)) + (lambda (type value e w s mod) + (case type + ((define-form) + (let* ((id (wrap value w mod)) + (label (gen-label)) + (var (if (macro-introduced-identifier? id) + (fresh-derived-name id x) + (syntax-object-expression id)))) + (record-definition! id var) + (list + (if (eq? m 'c&e) + (let ((x (build-global-definition s var (expand e r w mod)))) + (top-level-eval-hook x mod) + (lambda () x)) + (lambda () + (build-global-definition s var (expand e r w mod))))))) + ((define-syntax-form define-syntax-parameter-form) + (let* ((id (wrap value w mod)) + (label (gen-label)) + (var (if (macro-introduced-identifier? id) + (fresh-derived-name id x) + (syntax-object-expression id)))) + (record-definition! id var) + (case m + ((c) + (cond + ((memq 'compile esew) + (let ((e (expand-install-global var type (expand e r w mod)))) + (top-level-eval-hook e mod) + (if (memq 'load esew) + (list (lambda () e)) + '()))) + ((memq 'load esew) + (list (lambda () + (expand-install-global var type (expand e r w mod))))) + (else '()))) + ((c&e) + (let ((e (expand-install-global var type (expand e r w mod)))) + (top-level-eval-hook e mod) + (list (lambda () e)))) + (else + (if (memq 'eval esew) + (top-level-eval-hook + (expand-install-global var type (expand e r w mod)) + mod)) + '())))) + ((begin-form) + (syntax-case e () + ((_ e1 ...) + (parse #'(e1 ...) r w s m esew mod)))) + ((local-syntax-form) + (expand-local-syntax value e r w s mod + (lambda (forms r w s mod) + (parse forms r w s m esew mod)))) + ((eval-when-form) + (syntax-case e () + ((_ (x ...) e1 e2 ...) + (let ((when-list (parse-when-list e #'(x ...))) + (body #'(e1 e2 ...))) + (define (recurse m esew) + (parse body r w s m esew mod)) + (cond + ((eq? m 'e) + (if (memq 'eval when-list) + (recurse (if (memq 'expand when-list) 'c&e 'e) + '(eval)) + (begin + (if (memq 'expand when-list) + (top-level-eval-hook + (expand-top-sequence body r w s 'e '(eval) mod) + mod)) + '()))) + ((memq 'load when-list) + (if (or (memq 'compile when-list) + (memq 'expand when-list) + (and (eq? m 'c&e) (memq 'eval when-list))) + (recurse 'c&e '(compile load)) + (if (memq m '(c c&e)) + (recurse 'c '(load)) + '()))) + ((or (memq 'compile when-list) + (memq 'expand when-list) + (and (eq? m 'c&e) (memq 'eval when-list))) + (top-level-eval-hook + (expand-top-sequence body r w s 'e '(eval) mod) + mod) + '()) + (else + '())))))) + (else + (list + (if (eq? m 'c&e) + (let ((x (expand-expr type value e r w s mod))) + (top-level-eval-hook x mod) + (lambda () x)) + (lambda () + (expand-expr type value e r w s mod))))))))) + (let ((exps (map (lambda (x) (x)) + (reverse (parse body r w s m esew mod))))) (if (null? exps) (build-void s) - (build-sequence - s - (let lp ((in exps) (out '())) - (if (null? in) out - (let ((e (car in))) - (lp (cdr in) - (cons (if (procedure? e) (e) e) out))))))))))) + (build-sequence s exps)))))) (define expand-install-global - (lambda (name e) + (lambda (name type e) (build-global-definition no-source name - (build-application + (build-primcall no-source - (build-primref no-source 'make-syntax-transformer) - (list (build-data no-source name) - (build-data no-source 'macro) - e))))) - + 'make-syntax-transformer + (if (eq? type 'define-syntax-parameter-form) + (list (build-data no-source name) + (build-data no-source 'syntax-parameter) + (build-primcall no-source 'list (list e))) + (list (build-data no-source name) + (build-data no-source 'macro) + e)))))) + (define parse-when-list (lambda (e when-list) - ;; when-list is syntax'd version of list of situations + ;; `when-list' is syntax'd version of list of situations. We + ;; could match these keywords lexically, via free-id=?, but then + ;; we twingle the definition of eval-when to the bindings of + ;; eval, load, expand, and compile, which is totally unintended. + ;; So do a symbolic match instead. (let ((result (strip when-list empty-wrap))) (let lp ((l result)) (if (null? l) @@ -1057,6 +1164,7 @@ ;; begin none begin keyword ;; define none define keyword ;; define-syntax none define-syntax keyword + ;; define-syntax-parameter none define-syntax-parameter keyword ;; local-syntax rec? letrec-syntax/let-syntax keyword ;; eval-when none eval-when keyword ;; syntax level pattern variable @@ -1067,35 +1175,38 @@ ;; begin-form none begin expression ;; define-form id variable definition ;; define-syntax-form id syntax definition + ;; define-syntax-parameter-form id syntax parameter definition ;; local-syntax-form rec? syntax definition ;; eval-when-form none eval-when form ;; constant none self-evaluating datum ;; other none anything else ;; - ;; For define-form and define-syntax-form, e is the rhs expression. - ;; For all others, e is the entire form. w is the wrap for e. - ;; s is the source for the entire form. mod is the module for e. + ;; For definition forms (define-form, define-syntax-parameter-form, + ;; and define-syntax-form), e is the rhs expression. For all + ;; others, e is the entire form. w is the wrap for e. s is the + ;; source for the entire form. mod is the module for e. ;; - ;; syntax-type expands macros and unwraps as necessary to get to - ;; one of the forms above. It also parses define and define-syntax - ;; forms, although perhaps this should be done by the consumer. + ;; syntax-type expands macros and unwraps as necessary to get to one + ;; of the forms above. It also parses definition forms, although + ;; perhaps this should be done by the consumer. (define syntax-type (lambda (e r w s rib mod for-car?) (cond ((symbol? e) - (let* ((n (id-var-name e w)) - (b (lookup n r mod)) - (type (binding-type b))) - (case type - ((lexical) (values type (binding-value b) e w s mod)) - ((global) (values type n e w s mod)) - ((macro) - (if for-car? - (values type (binding-value b) e w s mod) - (syntax-type (expand-macro (binding-value b) e r w s rib mod) - r empty-wrap s rib mod #f))) - (else (values type (binding-value b) e w s mod))))) + (call-with-values (lambda () (resolve-identifier e w r mod #t)) + (lambda (type value mod*) + (case type + ((macro) + (if for-car? + (values type value e w s mod) + (syntax-type (expand-macro value e r w s rib mod) + r empty-wrap s rib mod #f))) + ((global) + ;; Toplevel definitions may resolve to bindings with + ;; different names or in different modules. + (values type value value w s mod*)) + (else (values type value e w s mod)))))) ((pair? e) (let ((first (car e))) (call-with-values @@ -1148,8 +1259,12 @@ (syntax-case e () ((_ name val) (id? #'name) - (values 'define-syntax-form #'name - #'val w s mod)))) + (values 'define-syntax-form #'name #'val w s mod)))) + ((define-syntax-parameter) + (syntax-case e () + ((_ name val) + (id? #'name) + (values 'define-syntax-parameter-form #'name #'val w s mod)))) (else (values 'call #f e w s mod))))))) ((syntax-object? e) @@ -1181,7 +1296,7 @@ (lambda (e r w s mod) (expand e r w mod)))) ((lexical-call) - (expand-application + (expand-call (let ((id (car e))) (build-lexical-reference 'fun (source-annotation id) (if (syntax-object? id) @@ -1190,7 +1305,7 @@ value)) e r w s mod)) ((global-call) - (expand-application + (expand-call (build-global-reference (source-annotation (car e)) (if (syntax-object? value) (syntax-object-expression value) @@ -1201,7 +1316,7 @@ e r w s mod)) ((constant) (build-data s (strip (source-wrap e w s mod) empty-wrap))) ((global) (build-global-reference s value mod)) - ((call) (expand-application (expand (car e) r w mod) e r w s mod)) + ((call) (expand-call (expand (car e) r w mod) e r w s mod)) ((begin-form) (syntax-case e () ((_ e1 e2 ...) (expand-sequence #'(e1 e2 ...) r w s mod)))) @@ -1214,7 +1329,7 @@ (if (memq 'eval when-list) (expand-sequence #'(e1 e2 ...) r w s mod) (expand-void)))))) - ((define-form define-syntax-form) + ((define-form define-syntax-form define-syntax-parameter-form) (syntax-violation #f "definition in expression context" e (wrap value w mod))) ((syntax) @@ -1226,12 +1341,12 @@ (else (syntax-violation #f "unexpected syntax" (source-wrap e w s mod)))))) - (define expand-application + (define expand-call (lambda (x e r w s mod) (syntax-case e () ((e0 e1 ...) - (build-application s x - (map (lambda (e) (expand e r w mod)) #'(e1 ...))))))) + (build-call s x + (map (lambda (e) (expand e r w mod)) #'(e1 ...))))))) ;; (What follows is my interpretation of what's going on here -- Andy) ;; @@ -1369,13 +1484,17 @@ (cons id var-ids) (cons var vars) (cons (cons er (wrap e w mod)) vals) (cons (make-binding 'lexical var) bindings))))) - ((define-syntax-form) + ((define-syntax-form define-syntax-parameter-form) (let ((id (wrap value w mod)) (label (gen-label))) (extend-ribcage! ribcage id label) (parse (cdr body) (cons id ids) (cons label labels) var-ids vars vals - (cons (make-binding 'macro (cons er (wrap e w mod))) + (cons (make-binding + (if (eq? type 'define-syntax-parameter-form) + 'syntax-parameter + 'macro) + (cons er (wrap e w mod))) bindings)))) ((begin-form) (syntax-case e () @@ -1410,7 +1529,7 @@ (let loop ((bs bindings) (er-cache #f) (r-cache #f)) (if (not (null? bs)) (let* ((b (car bs))) - (if (eq? (car b) 'macro) + (if (memq (car b) '(macro syntax-parameter)) (let* ((er (cadr b)) (r-cache (if (eq? er er-cache) @@ -1420,6 +1539,8 @@ (eval-local-transformer (expand (cddr b) r-cache empty-wrap mod) mod)) + (if (eq? (car b) 'syntax-parameter) + (set-cdr! b (list (cdr b)))) (loop (cdr bs) er r-cache)) (loop (cdr bs) er-cache r-cache))))) (set-cdr! r (extend-env labels bindings (cdr r))) @@ -1746,38 +1867,45 @@ (global-extend 'local-syntax 'letrec-syntax #t) (global-extend 'local-syntax 'let-syntax #f) - (global-extend 'core 'fluid-let-syntax - (lambda (e r w s mod) - (syntax-case e () - ((_ ((var val) ...) e1 e2 ...) - (valid-bound-ids? #'(var ...)) - (let ((names (map (lambda (x) (id-var-name x w)) #'(var ...)))) - (for-each - (lambda (id n) - (case (binding-type (lookup n r mod)) - ((displaced-lexical) - (syntax-violation 'fluid-let-syntax - "identifier out of context" - e - (source-wrap id w s mod))))) - #'(var ...) - names) - (expand-body - #'(e1 e2 ...) - (source-wrap e w s mod) - (extend-env - names - (let ((trans-r (macros-only-env r))) - (map (lambda (x) - (make-binding 'macro - (eval-local-transformer (expand x trans-r w mod) - mod))) - #'(val ...))) - r) - w - mod))) - (_ (syntax-violation 'fluid-let-syntax "bad syntax" - (source-wrap e w s mod)))))) + (global-extend + 'core 'syntax-parameterize + (lambda (e r w s mod) + (syntax-case e () + ((_ ((var val) ...) e1 e2 ...) + (valid-bound-ids? #'(var ...)) + (let ((names + (map (lambda (x) + (call-with-values + (lambda () (resolve-identifier x w r mod #f)) + (lambda (type value mod) + (case type + ((displaced-lexical) + (syntax-violation 'syntax-parameterize + "identifier out of context" + e + (source-wrap x w s mod))) + ((syntax-parameter) + value) + (else + (syntax-violation 'syntax-parameterize + "invalid syntax parameter" + e + (source-wrap x w s mod))))))) + #'(var ...))) + (bindings + (let ((trans-r (macros-only-env r))) + (map (lambda (x) + (make-binding + 'macro + (eval-local-transformer (expand x trans-r w mod) mod))) + #'(val ...))))) + (expand-body #'(e1 e2 ...) + (source-wrap e w s mod) + (extend-env names bindings r) + w + mod))) + (_ (syntax-violation 'syntax-parameterize "bad syntax" + (source-wrap e w s mod)))))) (global-extend 'core 'quote (lambda (e r w s mod) @@ -1786,167 +1914,166 @@ (_ (syntax-violation 'quote "bad syntax" (source-wrap e w s mod)))))) - (global-extend 'core 'syntax - (let () - (define gen-syntax - (lambda (src e r maps ellipsis? mod) - (if (id? e) - (let ((label (id-var-name e empty-wrap))) - ;; Mod does not matter, we are looking to see if - ;; the id is lexical syntax. - (let ((b (lookup label r mod))) - (if (eq? (binding-type b) 'syntax) - (call-with-values - (lambda () - (let ((var.lev (binding-value b))) - (gen-ref src (car var.lev) (cdr var.lev) maps))) - (lambda (var maps) (values `(ref ,var) maps))) - (if (ellipsis? e) - (syntax-violation 'syntax "misplaced ellipsis" src) - (values `(quote ,e) maps))))) - (syntax-case e () - ((dots e) - (ellipsis? #'dots) - (gen-syntax src #'e r maps (lambda (x) #f) mod)) - ((x dots . y) - ;; this could be about a dozen lines of code, except that we - ;; choose to handle #'(x ... ...) forms - (ellipsis? #'dots) - (let f ((y #'y) - (k (lambda (maps) - (call-with-values - (lambda () - (gen-syntax src #'x r - (cons '() maps) ellipsis? mod)) - (lambda (x maps) - (if (null? (car maps)) - (syntax-violation 'syntax "extra ellipsis" - src) - (values (gen-map x (car maps)) - (cdr maps)))))))) - (syntax-case y () - ((dots . y) - (ellipsis? #'dots) - (f #'y - (lambda (maps) - (call-with-values - (lambda () (k (cons '() maps))) - (lambda (x maps) - (if (null? (car maps)) - (syntax-violation 'syntax "extra ellipsis" src) - (values (gen-mappend x (car maps)) - (cdr maps)))))))) - (_ (call-with-values - (lambda () (gen-syntax src y r maps ellipsis? mod)) - (lambda (y maps) - (call-with-values - (lambda () (k maps)) - (lambda (x maps) - (values (gen-append x y) maps))))))))) - ((x . y) - (call-with-values - (lambda () (gen-syntax src #'x r maps ellipsis? mod)) - (lambda (x maps) - (call-with-values - (lambda () (gen-syntax src #'y r maps ellipsis? mod)) - (lambda (y maps) (values (gen-cons x y) maps)))))) - (#(e1 e2 ...) - (call-with-values - (lambda () - (gen-syntax src #'(e1 e2 ...) r maps ellipsis? mod)) - (lambda (e maps) (values (gen-vector e) maps)))) - (_ (values `(quote ,e) maps)))))) - - (define gen-ref - (lambda (src var level maps) - (if (fx= level 0) - (values var maps) - (if (null? maps) - (syntax-violation 'syntax "missing ellipsis" src) - (call-with-values - (lambda () (gen-ref src var (fx- level 1) (cdr maps))) - (lambda (outer-var outer-maps) - (let ((b (assq outer-var (car maps)))) - (if b - (values (cdr b) maps) - (let ((inner-var (gen-var 'tmp))) - (values inner-var - (cons (cons (cons outer-var inner-var) - (car maps)) - outer-maps))))))))))) - - (define gen-mappend - (lambda (e map-env) - `(apply (primitive append) ,(gen-map e map-env)))) - - (define gen-map - (lambda (e map-env) - (let ((formals (map cdr map-env)) - (actuals (map (lambda (x) `(ref ,(car x))) map-env))) - (cond - ((eq? (car e) 'ref) - ;; identity map equivalence: - ;; (map (lambda (x) x) y) == y - (car actuals)) - ((and-map - (lambda (x) (and (eq? (car x) 'ref) (memq (cadr x) formals))) - (cdr e)) - ;; eta map equivalence: - ;; (map (lambda (x ...) (f x ...)) y ...) == (map f y ...) - `(map (primitive ,(car e)) - ,@(map (let ((r (map cons formals actuals))) - (lambda (x) (cdr (assq (cadr x) r)))) - (cdr e)))) - (else `(map (lambda ,formals ,e) ,@actuals)))))) - - (define gen-cons - (lambda (x y) - (case (car y) - ((quote) - (if (eq? (car x) 'quote) - `(quote (,(cadr x) . ,(cadr y))) - (if (eq? (cadr y) '()) - `(list ,x) - `(cons ,x ,y)))) - ((list) `(list ,x ,@(cdr y))) - (else `(cons ,x ,y))))) - - (define gen-append - (lambda (x y) - (if (equal? y '(quote ())) - x - `(append ,x ,y)))) - - (define gen-vector - (lambda (x) - (cond - ((eq? (car x) 'list) `(vector ,@(cdr x))) - ((eq? (car x) 'quote) `(quote #(,@(cadr x)))) - (else `(list->vector ,x))))) - - - (define regen - (lambda (x) - (case (car x) - ((ref) (build-lexical-reference 'value no-source (cadr x) (cadr x))) - ((primitive) (build-primref no-source (cadr x))) - ((quote) (build-data no-source (cadr x))) - ((lambda) - (if (list? (cadr x)) - (build-simple-lambda no-source (cadr x) #f (cadr x) '() (regen (caddr x))) - (error "how did we get here" x))) - (else (build-application no-source - (build-primref no-source (car x)) - (map regen (cdr x))))))) - - (lambda (e r w s mod) - (let ((e (source-wrap e w s mod))) - (syntax-case e () - ((_ x) + (global-extend + 'core 'syntax + (let () + (define gen-syntax + (lambda (src e r maps ellipsis? mod) + (if (id? e) + (call-with-values (lambda () + (resolve-identifier e empty-wrap r mod #f)) + (lambda (type value mod) + (case type + ((syntax) + (call-with-values + (lambda () (gen-ref src (car value) (cdr value) maps)) + (lambda (var maps) + (values `(ref ,var) maps)))) + (else + (if (ellipsis? e) + (syntax-violation 'syntax "misplaced ellipsis" src) + (values `(quote ,e) maps)))))) + (syntax-case e () + ((dots e) + (ellipsis? #'dots) + (gen-syntax src #'e r maps (lambda (x) #f) mod)) + ((x dots . y) + ;; this could be about a dozen lines of code, except that we + ;; choose to handle #'(x ... ...) forms + (ellipsis? #'dots) + (let f ((y #'y) + (k (lambda (maps) + (call-with-values + (lambda () + (gen-syntax src #'x r + (cons '() maps) ellipsis? mod)) + (lambda (x maps) + (if (null? (car maps)) + (syntax-violation 'syntax "extra ellipsis" + src) + (values (gen-map x (car maps)) + (cdr maps)))))))) + (syntax-case y () + ((dots . y) + (ellipsis? #'dots) + (f #'y + (lambda (maps) (call-with-values - (lambda () (gen-syntax e #'x r '() ellipsis? mod)) - (lambda (e maps) (regen e)))) - (_ (syntax-violation 'syntax "bad `syntax' form" e))))))) + (lambda () (k (cons '() maps))) + (lambda (x maps) + (if (null? (car maps)) + (syntax-violation 'syntax "extra ellipsis" src) + (values (gen-mappend x (car maps)) + (cdr maps)))))))) + (_ (call-with-values + (lambda () (gen-syntax src y r maps ellipsis? mod)) + (lambda (y maps) + (call-with-values + (lambda () (k maps)) + (lambda (x maps) + (values (gen-append x y) maps))))))))) + ((x . y) + (call-with-values + (lambda () (gen-syntax src #'x r maps ellipsis? mod)) + (lambda (x maps) + (call-with-values + (lambda () (gen-syntax src #'y r maps ellipsis? mod)) + (lambda (y maps) (values (gen-cons x y) maps)))))) + (#(e1 e2 ...) + (call-with-values + (lambda () + (gen-syntax src #'(e1 e2 ...) r maps ellipsis? mod)) + (lambda (e maps) (values (gen-vector e) maps)))) + (_ (values `(quote ,e) maps)))))) + + (define gen-ref + (lambda (src var level maps) + (if (fx= level 0) + (values var maps) + (if (null? maps) + (syntax-violation 'syntax "missing ellipsis" src) + (call-with-values + (lambda () (gen-ref src var (fx- level 1) (cdr maps))) + (lambda (outer-var outer-maps) + (let ((b (assq outer-var (car maps)))) + (if b + (values (cdr b) maps) + (let ((inner-var (gen-var 'tmp))) + (values inner-var + (cons (cons (cons outer-var inner-var) + (car maps)) + outer-maps))))))))))) + + (define gen-mappend + (lambda (e map-env) + `(apply (primitive append) ,(gen-map e map-env)))) + + (define gen-map + (lambda (e map-env) + (let ((formals (map cdr map-env)) + (actuals (map (lambda (x) `(ref ,(car x))) map-env))) + (cond + ((eq? (car e) 'ref) + ;; identity map equivalence: + ;; (map (lambda (x) x) y) == y + (car actuals)) + ((and-map + (lambda (x) (and (eq? (car x) 'ref) (memq (cadr x) formals))) + (cdr e)) + ;; eta map equivalence: + ;; (map (lambda (x ...) (f x ...)) y ...) == (map f y ...) + `(map (primitive ,(car e)) + ,@(map (let ((r (map cons formals actuals))) + (lambda (x) (cdr (assq (cadr x) r)))) + (cdr e)))) + (else `(map (lambda ,formals ,e) ,@actuals)))))) + + (define gen-cons + (lambda (x y) + (case (car y) + ((quote) + (if (eq? (car x) 'quote) + `(quote (,(cadr x) . ,(cadr y))) + (if (eq? (cadr y) '()) + `(list ,x) + `(cons ,x ,y)))) + ((list) `(list ,x ,@(cdr y))) + (else `(cons ,x ,y))))) + + (define gen-append + (lambda (x y) + (if (equal? y '(quote ())) + x + `(append ,x ,y)))) + + (define gen-vector + (lambda (x) + (cond + ((eq? (car x) 'list) `(vector ,@(cdr x))) + ((eq? (car x) 'quote) `(quote #(,@(cadr x)))) + (else `(list->vector ,x))))) + + + (define regen + (lambda (x) + (case (car x) + ((ref) (build-lexical-reference 'value no-source (cadr x) (cadr x))) + ((primitive) (build-primref no-source (cadr x))) + ((quote) (build-data no-source (cadr x))) + ((lambda) + (if (list? (cadr x)) + (build-simple-lambda no-source (cadr x) #f (cadr x) '() (regen (caddr x))) + (error "how did we get here" x))) + (else (build-primcall no-source (car x) (map regen (cdr x))))))) + + (lambda (e r w s mod) + (let ((e (source-wrap e w s mod))) + (syntax-case e () + ((_ x) + (call-with-values + (lambda () (gen-syntax e #'x r '() ellipsis? mod)) + (lambda (e maps) (regen e)))) + (_ (syntax-violation 'syntax "bad `syntax' form" e))))))) (global-extend 'core 'lambda (lambda (e r w s mod) @@ -2081,58 +2208,53 @@ (_ (syntax-violation 'letrec* "bad letrec*" (source-wrap e w s mod)))))) - (global-extend 'core 'set! - (lambda (e r w s mod) - (syntax-case e () - ((_ id val) - (id? #'id) - (let ((n (id-var-name #'id w)) - ;; Lookup id in its module - (id-mod (if (syntax-object? #'id) - (syntax-object-module #'id) - mod))) - (let ((b (lookup n r id-mod))) - (case (binding-type b) - ((lexical) - (build-lexical-assignment s - (syntax->datum #'id) - (binding-value b) - (expand #'val r w mod))) - ((global) - (build-global-assignment s n (expand #'val r w mod) id-mod)) - ((macro) - (let ((p (binding-value b))) - (if (procedure-property p 'variable-transformer) - ;; As syntax-type does, call expand-macro with - ;; the mod of the expression. Hmm. - (expand (expand-macro p e r w s #f mod) r empty-wrap mod) - (syntax-violation 'set! "not a variable transformer" - (wrap e w mod) - (wrap #'id w id-mod))))) - ((displaced-lexical) - (syntax-violation 'set! "identifier out of context" - (wrap #'id w mod))) - (else (syntax-violation 'set! "bad set!" - (source-wrap e w s mod))))))) - ((_ (head tail ...) val) - (call-with-values - (lambda () (syntax-type #'head r empty-wrap no-source #f mod #t)) - (lambda (type value ee ww ss modmod) - (case type - ((module-ref) - (let ((val (expand #'val r w mod))) - (call-with-values (lambda () (value #'(head tail ...) r w)) - (lambda (e r w s* mod) - (syntax-case e () - (e (id? #'e) - (build-global-assignment s (syntax->datum #'e) - val mod))))))) - (else - (build-application s - (expand #'(setter head) r w mod) - (map (lambda (e) (expand e r w mod)) - #'(tail ... val)))))))) - (_ (syntax-violation 'set! "bad set!" (source-wrap e w s mod)))))) + (global-extend + 'core 'set! + (lambda (e r w s mod) + (syntax-case e () + ((_ id val) + (id? #'id) + (call-with-values + (lambda () (resolve-identifier #'id w r mod #t)) + (lambda (type value id-mod) + (case type + ((lexical) + (build-lexical-assignment s (syntax->datum #'id) value + (expand #'val r w mod))) + ((global) + (build-global-assignment s value (expand #'val r w mod) id-mod)) + ((macro) + (if (procedure-property value 'variable-transformer) + ;; As syntax-type does, call expand-macro with + ;; the mod of the expression. Hmm. + (expand (expand-macro value e r w s #f mod) r empty-wrap mod) + (syntax-violation 'set! "not a variable transformer" + (wrap e w mod) + (wrap #'id w id-mod)))) + ((displaced-lexical) + (syntax-violation 'set! "identifier out of context" + (wrap #'id w mod))) + (else + (syntax-violation 'set! "bad set!" (source-wrap e w s mod))))))) + ((_ (head tail ...) val) + (call-with-values + (lambda () (syntax-type #'head r empty-wrap no-source #f mod #t)) + (lambda (type value ee ww ss modmod) + (case type + ((module-ref) + (let ((val (expand #'val r w mod))) + (call-with-values (lambda () (value #'(head tail ...) r w)) + (lambda (e r w s* mod) + (syntax-case e () + (e (id? #'e) + (build-global-assignment s (syntax->datum #'e) + val mod))))))) + (else + (build-call s + (expand #'(setter head) r w mod) + (map (lambda (e) (expand e r w mod)) + #'(tail ... val)))))))) + (_ (syntax-violation 'set! "bad set!" (source-wrap e w s mod)))))) (global-extend 'module-ref '@ (lambda (e r w) @@ -2202,6 +2324,7 @@ (global-extend 'define 'define '()) (global-extend 'define-syntax 'define-syntax '()) + (global-extend 'define-syntax-parameter 'define-syntax-parameter '()) (global-extend 'eval-when 'eval-when '()) @@ -2280,20 +2403,21 @@ (lambda (pvars exp y r mod) (let ((ids (map car pvars)) (levels (map cdr pvars))) (let ((labels (gen-labels ids)) (new-vars (map gen-var ids))) - (build-application no-source - (build-primref no-source 'apply) - (list (build-simple-lambda no-source (map syntax->datum ids) #f new-vars '() - (expand exp - (extend-env - labels - (map (lambda (var level) - (make-binding 'syntax `(,var . ,level))) - new-vars - (map cdr pvars)) - r) - (make-binding-wrap ids labels empty-wrap) - mod)) - y)))))) + (build-primcall + no-source + 'apply + (list (build-simple-lambda no-source (map syntax->datum ids) #f new-vars '() + (expand exp + (extend-env + labels + (map (lambda (var level) + (make-binding 'syntax `(,var . ,level))) + new-vars + (map cdr pvars)) + r) + (make-binding-wrap ids labels empty-wrap) + mod)) + y)))))) (define gen-clause (lambda (x keys clauses r pat fender exp mod) @@ -2308,36 +2432,32 @@ (else (let ((y (gen-var 'tmp))) ;; fat finger binding and references to temp variable y - (build-application no-source - (build-simple-lambda no-source (list 'tmp) #f (list y) '() - (let ((y (build-lexical-reference 'value no-source - 'tmp y))) - (build-conditional no-source - (syntax-case fender () - (#t y) - (_ (build-conditional no-source - y - (build-dispatch-call pvars fender y r mod) - (build-data no-source #f)))) - (build-dispatch-call pvars exp y r mod) - (gen-syntax-case x keys clauses r mod)))) - (list (if (eq? p 'any) - (build-application no-source - (build-primref no-source 'list) - (list x)) - (build-application no-source - (build-primref no-source '$sc-dispatch) - (list x (build-data no-source p))))))))))))) + (build-call no-source + (build-simple-lambda no-source (list 'tmp) #f (list y) '() + (let ((y (build-lexical-reference 'value no-source + 'tmp y))) + (build-conditional no-source + (syntax-case fender () + (#t y) + (_ (build-conditional no-source + y + (build-dispatch-call pvars fender y r mod) + (build-data no-source #f)))) + (build-dispatch-call pvars exp y r mod) + (gen-syntax-case x keys clauses r mod)))) + (list (if (eq? p 'any) + (build-primcall no-source 'list (list x)) + (build-primcall no-source '$sc-dispatch + (list x (build-data no-source p))))))))))))) (define gen-syntax-case (lambda (x keys clauses r mod) (if (null? clauses) - (build-application no-source - (build-primref no-source 'syntax-violation) - (list (build-data no-source #f) - (build-data no-source - "source expression failed to match any pattern") - x)) + (build-primcall no-source 'syntax-violation + (list (build-data no-source #f) + (build-data no-source + "source expression failed to match any pattern") + x)) (syntax-case (car clauses) () ((pat exp) (if (and (id? #'pat) @@ -2347,18 +2467,18 @@ (expand #'exp r empty-wrap mod) (let ((labels (list (gen-label))) (var (gen-var #'pat))) - (build-application no-source - (build-simple-lambda - no-source (list (syntax->datum #'pat)) #f (list var) - '() - (expand #'exp - (extend-env labels - (list (make-binding 'syntax `(,var . 0))) - r) - (make-binding-wrap #'(pat) - labels empty-wrap) - mod)) - (list x)))) + (build-call no-source + (build-simple-lambda + no-source (list (syntax->datum #'pat)) #f (list var) + '() + (expand #'exp + (extend-env labels + (list (make-binding 'syntax `(,var . 0))) + r) + (make-binding-wrap #'(pat) + labels empty-wrap) + mod)) + (list x)))) (gen-clause x keys (cdr clauses) r #'pat #t #'exp mod))) ((pat fender exp) @@ -2375,14 +2495,14 @@ #'(key ...)) (let ((x (gen-var 'tmp))) ;; fat finger binding and references to temp variable x - (build-application s - (build-simple-lambda no-source (list 'tmp) #f (list x) '() - (gen-syntax-case (build-lexical-reference 'value no-source - 'tmp x) - #'(key ...) #'(m ...) - r - mod)) - (list (expand #'val r empty-wrap mod)))) + (build-call s + (build-simple-lambda no-source (list 'tmp) #f (list x) '() + (gen-syntax-case (build-lexical-reference 'value no-source + 'tmp x) + #'(key ...) #'(m ...) + r + mod)) + (list (expand #'val r empty-wrap mod)))) (syntax-violation 'syntax-case "invalid literals list" e)))))))) ;; The portable macroexpand seeds expand-top's mode m with 'e (for @@ -2630,7 +2750,7 @@ #((macro-type . syntax-rules) (patterns pattern ...)) (syntax-case x (k ...) - ((dummy . pattern) #'template) + ((_ . pattern) #'template) ...))) ((_ (k ...) docstring ((keyword . pattern) template) ...) (string? (syntax->datum #'docstring)) @@ -2640,7 +2760,7 @@ #((macro-type . syntax-rules) (patterns pattern ...)) (syntax-case x (k ...) - ((dummy . pattern) #'template) + ((_ . pattern) #'template) ...)))))) (define-syntax define-syntax-rule diff --git a/module/ice-9/weak-vector.scm b/module/ice-9/weak-vector.scm index 09e2e0a8d..31d79ec6f 100644 --- a/module/ice-9/weak-vector.scm +++ b/module/ice-9/weak-vector.scm @@ -1,6 +1,6 @@ ;;; installed-scm-file -;;;; Copyright (C) 2003, 2006 Free Software Foundation, Inc. +;;;; Copyright (C) 2003, 2006, 2011 Free Software Foundation, Inc. ;;;; ;;;; This library is free software; you can redistribute it and/or ;;;; modify it under the terms of the GNU Lesser General Public @@ -19,13 +19,8 @@ (define-module (ice-9 weak-vector) - :export (make-weak-vector list->weak-vector weak-vector weak-vector? - make-weak-key-alist-vector - make-weak-value-alist-vector - make-doubly-weak-alist-vector - weak-key-alist-vector? - weak-value-alist-vector? - doubly-weak-alist-vector?) ; C - ) + #:export (make-weak-vector list->weak-vector weak-vector weak-vector?)) -(%init-weaks-builtins) ; defined in libguile/weaks.c +(eval-when (load eval compile) + (load-extension (string-append "libguile-" (effective-version)) + "scm_init_weak_vector_builtins")) diff --git a/module/language/brainfuck/compile-tree-il.scm b/module/language/brainfuck/compile-tree-il.scm index 33d563490..f9dd036e8 100644 --- a/module/language/brainfuck/compile-tree-il.scm +++ b/module/language/brainfuck/compile-tree-il.scm @@ -1,6 +1,6 @@ ;;; Brainfuck for GNU Guile -;; Copyright (C) 2009 Free Software Foundation, Inc. +;; Copyright (C) 2009, 2011 Free Software Foundation, Inc. ;; This library is free software; you can redistribute it and/or ;; modify it under the terms of the GNU Lesser General Public @@ -94,7 +94,7 @@ (parse-tree-il `(let (pointer tape) (pointer tape) ((const 0) - (apply (primitive make-vector) (const ,tape-size) (const 0))) + (call (primitive make-vector) (const ,tape-size) (const 0))) ,(compile-body exp))) env env)) @@ -109,11 +109,11 @@ (cond ((null? in) ;; No more input, build our output. - (cond - ((null? out) '(void)) ; no output - ((null? (cdr out)) (car out)) ; single expression - (else `(begin ,@(reverse out)))) ; sequence - ) + (cond + ((null? out) '(void)) ; no output + ((null? (cdr out)) (car out)) ; single expression + (else `(begin ,@(reverse out)))) ; sequence + ) (else (pmatch (car in) @@ -121,34 +121,34 @@ ;; (set! pointer (+ pointer +-1)) ((<bf-move> ,dir) (emit `(set! (lexical pointer) - (apply (primitive +) (lexical pointer) (const ,dir))))) + (call (primitive +) (lexical pointer) (const ,dir))))) ;; Cell increment +- is done as: ;; (vector-set! tape pointer (+ (vector-ref tape pointer) +-1)) ((<bf-increment> ,inc) - (emit `(apply (primitive vector-set!) (lexical tape) (lexical pointer) - (apply (primitive +) - (apply (primitive vector-ref) - (lexical tape) (lexical pointer)) - (const ,inc))))) + (emit `(call (primitive vector-set!) (lexical tape) (lexical pointer) + (call (primitive +) + (call (primitive vector-ref) + (lexical tape) (lexical pointer)) + (const ,inc))))) ;; Output . is done by converting the cell's integer value to a ;; character first and then printing out this character: ;; (write-char (integer->char (vector-ref tape pointer))) ((<bf-print>) - (emit `(apply (primitive write-char) - (apply (primitive integer->char) - (apply (primitive vector-ref) - (lexical tape) (lexical pointer)))))) + (emit `(call (primitive write-char) + (call (primitive integer->char) + (call (primitive vector-ref) + (lexical tape) (lexical pointer)))))) ;; Input , is done similarly, read in a character, get its ASCII ;; code and store it into the current cell: ;; (vector-set! tape pointer (char->integer (read-char))) ((<bf-read>) - (emit `(apply (primitive vector-set!) - (lexical tape) (lexical pointer) - (apply (primitive char->integer) - (apply (primitive read-char)))))) + (emit `(call (primitive vector-set!) + (lexical tape) (lexical pointer) + (call (primitive char->integer) + (call (primitive read-char)))))) ;; For loops [...] we use a letrec construction to execute the body until ;; the current cell gets zero. The body is compiled via a recursive call @@ -171,14 +171,14 @@ ((lambda () (lambda-case ((() #f #f #f () ()) - (if (apply (primitive =) - (apply (primitive vector-ref) - (lexical tape) (lexical pointer)) - (const 0)) + (if (call (primitive =) + (call (primitive vector-ref) + (lexical tape) (lexical pointer)) + (const 0)) (void) (begin ,(compile-body body) - (apply (lexical ,iterate))))) + (call (lexical ,iterate))))) #f))) - (apply (lexical ,iterate)))))) + (call (lexical ,iterate)))))) (else (error "unknown brainfuck instruction" (car in)))))))) diff --git a/module/language/ecmascript/compile-tree-il.scm b/module/language/ecmascript/compile-tree-il.scm index a2401f442..0914f920a 100644 --- a/module/language/ecmascript/compile-tree-il.scm +++ b/module/language/ecmascript/compile-tree-il.scm @@ -32,7 +32,7 @@ (-> (@ '(language ecmascript impl) 'sym))) (define-syntax-rule (@impl sym arg ...) - (-> (apply (@implv sym) arg ...))) + (-> (call (@implv sym) arg ...))) (define (empty-lexical-environment) '()) @@ -95,23 +95,23 @@ (this (@impl get-this)) ((+ ,a) - (-> (apply (-> (primitive '+)) - (@impl ->number (comp a e)) - (-> (const 0))))) + (-> (call (-> (primitive '+)) + (@impl ->number (comp a e)) + (-> (const 0))))) ((- ,a) - (-> (apply (-> (primitive '-)) (-> (const 0)) (comp a e)))) + (-> (call (-> (primitive '-)) (-> (const 0)) (comp a e)))) ((~ ,a) (@impl bitwise-not (comp a e))) ((! ,a) (@impl logical-not (comp a e))) ((+ ,a ,b) - (-> (apply (-> (primitive '+)) (comp a e) (comp b e)))) + (-> (call (-> (primitive '+)) (comp a e) (comp b e)))) ((- ,a ,b) - (-> (apply (-> (primitive '-)) (comp a e) (comp b e)))) + (-> (call (-> (primitive '-)) (comp a e) (comp b e)))) ((/ ,a ,b) - (-> (apply (-> (primitive '/)) (comp a e) (comp b e)))) + (-> (call (-> (primitive '/)) (comp a e) (comp b e)))) ((* ,a ,b) - (-> (apply (-> (primitive '*)) (comp a e) (comp b e)))) + (-> (call (-> (primitive '*)) (comp a e) (comp b e)))) ((% ,a ,b) (@impl mod (comp a e) (comp b e))) ((<< ,a ,b) @@ -119,27 +119,27 @@ ((>> ,a ,b) (@impl shift (comp a e) (comp `(- ,b) e))) ((< ,a ,b) - (-> (apply (-> (primitive '<)) (comp a e) (comp b e)))) + (-> (call (-> (primitive '<)) (comp a e) (comp b e)))) ((<= ,a ,b) - (-> (apply (-> (primitive '<=)) (comp a e) (comp b e)))) + (-> (call (-> (primitive '<=)) (comp a e) (comp b e)))) ((> ,a ,b) - (-> (apply (-> (primitive '>)) (comp a e) (comp b e)))) + (-> (call (-> (primitive '>)) (comp a e) (comp b e)))) ((>= ,a ,b) - (-> (apply (-> (primitive '>=)) (comp a e) (comp b e)))) + (-> (call (-> (primitive '>=)) (comp a e) (comp b e)))) ((in ,a ,b) (@impl has-property? (comp a e) (comp b e))) ((== ,a ,b) - (-> (apply (-> (primitive 'equal?)) (comp a e) (comp b e)))) + (-> (call (-> (primitive 'equal?)) (comp a e) (comp b e)))) ((!= ,a ,b) - (-> (apply (-> (primitive 'not)) - (-> (apply (-> (primitive 'equal?)) - (comp a e) (comp b e)))))) + (-> (call (-> (primitive 'not)) + (-> (call (-> (primitive 'equal?)) + (comp a e) (comp b e)))))) ((=== ,a ,b) - (-> (apply (-> (primitive 'eqv?)) (comp a e) (comp b e)))) + (-> (call (-> (primitive 'eqv?)) (comp a e) (comp b e)))) ((!== ,a ,b) - (-> (apply (-> (primitive 'not)) - (-> (apply (-> (primitive 'eqv?)) - (comp a e) (comp b e)))))) + (-> (call (-> (primitive 'not)) + (-> (call (-> (primitive 'eqv?)) + (comp a e) (comp b e)))))) ((& ,a ,b) (@impl band (comp a e) (comp b e))) ((^ ,a ,b) @@ -168,9 +168,9 @@ (begin1 (comp `(ref ,foo) e) (lambda (var) (-> (set! (lookup foo e) - (-> (apply (-> (primitive '+)) - (-> (lexical var var)) - (-> (const 1))))))))) + (-> (call (-> (primitive '+)) + (-> (lexical var var)) + (-> (const 1))))))))) ((postinc (pref ,obj ,prop)) (let1 (comp obj e) (lambda (objvar) @@ -181,9 +181,9 @@ (@impl pput (-> (lexical objvar objvar)) (-> (const prop)) - (-> (apply (-> (primitive '+)) - (-> (lexical tmpvar tmpvar)) - (-> (const 1)))))))))) + (-> (call (-> (primitive '+)) + (-> (lexical tmpvar tmpvar)) + (-> (const 1)))))))))) ((postinc (aref ,obj ,prop)) (let1 (comp obj e) (lambda (objvar) @@ -196,16 +196,16 @@ (@impl pput (-> (lexical objvar objvar)) (-> (lexical propvar propvar)) - (-> (apply (-> (primitive '+)) - (-> (lexical tmpvar tmpvar)) - (-> (const 1)))))))))))) + (-> (call (-> (primitive '+)) + (-> (lexical tmpvar tmpvar)) + (-> (const 1)))))))))))) ((postdec (ref ,foo)) (begin1 (comp `(ref ,foo) e) (lambda (var) (-> (set (lookup foo e) - (-> (apply (-> (primitive '-)) - (-> (lexical var var)) - (-> (const 1))))))))) + (-> (call (-> (primitive '-)) + (-> (lexical var var)) + (-> (const 1))))))))) ((postdec (pref ,obj ,prop)) (let1 (comp obj e) (lambda (objvar) @@ -216,9 +216,9 @@ (@impl pput (-> (lexical objvar objvar)) (-> (const prop)) - (-> (apply (-> (primitive '-)) - (-> (lexical tmpvar tmpvar)) - (-> (const 1)))))))))) + (-> (call (-> (primitive '-)) + (-> (lexical tmpvar tmpvar)) + (-> (const 1)))))))))) ((postdec (aref ,obj ,prop)) (let1 (comp obj e) (lambda (objvar) @@ -238,18 +238,18 @@ (let ((v (lookup foo e))) (-> (begin (-> (set! v - (-> (apply (-> (primitive '+)) - v - (-> (const 1)))))) + (-> (call (-> (primitive '+)) + v + (-> (const 1)))))) v)))) ((preinc (pref ,obj ,prop)) (let1 (comp obj e) (lambda (objvar) - (begin1 (-> (apply (-> (primitive '+)) - (@impl pget - (-> (lexical objvar objvar)) - (-> (const prop))) - (-> (const 1)))) + (begin1 (-> (call (-> (primitive '+)) + (@impl pget + (-> (lexical objvar objvar)) + (-> (const prop))) + (-> (const 1)))) (lambda (tmpvar) (@impl pput (-> (lexical objvar objvar)) (-> (const prop)) @@ -259,11 +259,11 @@ (lambda (objvar) (let1 (comp prop e) (lambda (propvar) - (begin1 (-> (apply (-> (primitive '+)) - (@impl pget - (-> (lexical objvar objvar)) - (-> (lexical propvar propvar))) - (-> (const 1)))) + (begin1 (-> (call (-> (primitive '+)) + (@impl pget + (-> (lexical objvar objvar)) + (-> (lexical propvar propvar))) + (-> (const 1)))) (lambda (tmpvar) (@impl pput (-> (lexical objvar objvar)) @@ -273,18 +273,18 @@ (let ((v (lookup foo e))) (-> (begin (-> (set! v - (-> (apply (-> (primitive '-)) + (-> (call (-> (primitive '-)) v (-> (const 1)))))) v)))) ((predec (pref ,obj ,prop)) (let1 (comp obj e) (lambda (objvar) - (begin1 (-> (apply (-> (primitive '-)) - (@impl pget - (-> (lexical objvar objvar)) - (-> (const prop))) - (-> (const 1)))) + (begin1 (-> (call (-> (primitive '-)) + (@impl pget + (-> (lexical objvar objvar)) + (-> (const prop))) + (-> (const 1)))) (lambda (tmpvar) (@impl pput (-> (lexical objvar objvar)) @@ -295,11 +295,11 @@ (lambda (objvar) (let1 (comp prop e) (lambda (propvar) - (begin1 (-> (apply (-> (primitive '-)) - (@impl pget - (-> (lexical objvar objvar)) - (-> (lexical propvar propvar))) - (-> (const 1)))) + (begin1 (-> (call (-> (primitive '-)) + (@impl pget + (-> (lexical objvar objvar)) + (-> (lexical propvar propvar))) + (-> (const 1)))) (lambda (tmpvar) (@impl pput (-> (lexical objvar objvar)) @@ -337,7 +337,7 @@ (-> (lambda '() `(lambda-case ((() #f #f #f () ()) - (apply ,(@impl pget obj prop) ,@args))))))) + (call ,(@impl pget obj prop) ,@args))))))) ((call (pref ,obj ,prop) ,args) (comp `(call/this ,(comp obj e) ,(-> (const prop)) @@ -349,25 +349,25 @@ ,@(map (lambda (x) (comp x e)) args)) e)) ((call ,proc ,args) - `(apply ,(comp proc e) - ,@(map (lambda (x) (comp x e)) args))) + `(call ,(comp proc e) + ,@(map (lambda (x) (comp x e)) args))) ((return ,expr) - (-> (apply (-> (primitive 'return)) - (comp expr e)))) + (-> (call (-> (primitive 'return)) + (comp expr e)))) ((array . ,args) - `(apply ,(@implv new-array) - ,@(map (lambda (x) (comp x e)) args))) + `(call ,(@implv new-array) + ,@(map (lambda (x) (comp x e)) args))) ((object . ,args) - `(apply ,(@implv new-object) - ,@(map (lambda (x) - (pmatch x - ((,prop ,val) - (-> (apply (-> (primitive 'cons)) - (-> (const prop)) - (comp val e)))) - (else - (error "bad prop-val pair" x)))) - args))) + `(call ,(@implv new-object) + ,@(map (lambda (x) + (pmatch x + ((,prop ,val) + (-> (call (-> (primitive 'cons)) + (-> (const prop)) + (comp val e)))) + (else + (error "bad prop-val pair" x)))) + args))) ((pref ,obj ,prop) (@impl pget (comp obj e) @@ -442,14 +442,14 @@ `((() #f #f #f () ()) ,(-> (begin (comp statement e) - (-> (apply (-> (lexical '%continue %continue))))))))))) + (-> (call (-> (lexical '%continue %continue))))))))))) (-> (lambda '() (-> (lambda-case `((() #f #f #f () ()) ,(-> (if (@impl ->boolean (comp test e)) - (-> (apply (-> (lexical '%loop %loop)))) + (-> (call (-> (lexical '%loop %loop)))) (@implv *undefined*))))))))) - (-> (apply (-> (lexical '%loop %loop))))))))) + (-> (call (-> (lexical '%loop %loop))))))))) ((while ,test ,statement) (let ((%continue (gensym "%continue "))) (let ((e (econs '%continue %continue e))) @@ -459,9 +459,9 @@ `((() #f #f #f () ()) ,(-> (if (@impl ->boolean (comp test e)) (-> (begin (comp statement e) - (-> (apply (-> (lexical '%continue %continue)))))) + (-> (call (-> (lexical '%continue %continue)))))) (@implv *undefined*))))))))) - (-> (apply (-> (lexical '%continue %continue))))))))) + (-> (call (-> (lexical '%continue %continue))))))))) ((for ,init ,test ,inc ,statement) (let ((%continue (gensym "%continue "))) @@ -475,10 +475,10 @@ (comp 'true e)) (-> (begin (comp statement e) (comp (or inc '(begin)) e) - (-> (apply (-> (lexical '%continue %continue)))))) + (-> (call (-> (lexical '%continue %continue)))))) (@implv *undefined*))))))))) (-> (begin (comp (or init '(begin)) e) - (-> (apply (-> (lexical '%continue %continue))))))))))) + (-> (call (-> (lexical '%continue %continue))))))))))) ((for-in ,var ,object ,statement) (let ((%enum (gensym "%enum ")) @@ -498,9 +498,9 @@ ,(-> (const 'pop)))) e) (comp statement e) - (-> (apply (-> (lexical '%continue %continue)))))) + (-> (call (-> (lexical '%continue %continue)))))) (@implv *undefined*))))))))) - (-> (apply (-> (lexical '%continue %continue))))))))) + (-> (call (-> (lexical '%continue %continue))))))))) ((block ,x) (comp x e)) diff --git a/module/language/elisp/compile-tree-il.scm b/module/language/elisp/compile-tree-il.scm index 0df21c7e6..e1d75ba7a 100644 --- a/module/language/elisp/compile-tree-il.scm +++ b/module/language/elisp/compile-tree-il.scm @@ -1,6 +1,6 @@ ;;; Guile Emacs Lisp -;; Copyright (C) 2009, 2010 Free Software Foundation, Inc. +;; Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc. ;; This program is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by @@ -109,7 +109,7 @@ ;;; Build a call to a primitive procedure nicely. (define (call-primitive loc sym . args) - (make-application loc (make-primitive-ref loc sym) args)) + (make-primcall loc sym args)) ;;; Error reporting routine for syntax/compilation problems or build ;;; code for a runtime-error output. @@ -118,9 +118,8 @@ (apply error args)) (define (runtime-error loc msg . args) - (make-application loc - (make-primitive-ref loc 'error) - (cons (make-const loc msg) args))) + (make-primcall loc 'error + (cons (make-const loc msg) args))) ;;; Generate code to ensure a global symbol is there for further use of ;;; a given symbol. In general during the compilation, those needed are @@ -129,13 +128,13 @@ ;;; this routine. (define (generate-ensure-global loc sym module) - (make-application loc - (make-module-ref loc runtime 'ensure-fluid! #t) - (list (make-const loc module) - (make-const loc sym)))) + (make-call loc + (make-module-ref loc runtime 'ensure-fluid! #t) + (list (make-const loc module) + (make-const loc sym)))) (define (ensuring-globals loc bindings body) - (make-sequence + (list->seq loc `(,@(map-globals-needed (fluid-ref bindings) (lambda (mod sym) @@ -151,12 +150,11 @@ (call-primitive loc 'with-fluids* - (make-application loc - (make-primitive-ref loc 'list) - (map (lambda (sym) - (make-module-ref loc module sym #t)) - syms)) - (make-application loc (make-primitive-ref loc 'list) vals) + (make-primcall loc 'list + (map (lambda (sym) + (make-module-ref loc module sym #t)) + syms)) + (make-primcall loc 'list vals) (make-lambda loc '() (make-lambda-case #f '() #f #f #f '() '() body #f)))) @@ -204,7 +202,7 @@ sym module (lambda () - (make-application + (make-call loc (make-module-ref loc runtime 'set-variable! #t) (list (make-const loc module) (make-const loc sym) value))) @@ -288,7 +286,7 @@ (map (lambda (el) (compile-expr (cdr el))) for))) (make-body (lambda () - (make-sequence loc (map compile-expr body))))) + (list->seq loc (map compile-expr body))))) (if (null? lexical) (let-dynamic loc (map car dynamic) module (make-values dynamic) (make-body)) @@ -332,7 +330,7 @@ (map car bind)) (let iterate ((tail bind)) (if (null? tail) - (make-sequence loc (map compile-expr body)) + (list->seq loc (map compile-expr body)) (let ((sym (caar tail)) (value (compile-expr (cdar tail)))) (if (bind-lexically? sym module) @@ -502,36 +500,35 @@ (map (lambda (x) (nil-value loc)) optional) all-syms (let ((compiled-body - (make-sequence loc (map compile-expr body)))) - (make-sequence + (list->seq loc (map compile-expr body)))) + (make-seq loc - (list - (if rest - (make-conditional - loc - (call-primitive loc - 'null? - (make-lexical-ref loc - rest - the-rest-sym)) - (make-lexical-set loc - rest - the-rest-sym - (nil-value loc)) - (make-void loc)) + (if rest + (make-conditional + loc + (call-primitive loc + 'null? + (make-lexical-ref loc + rest + the-rest-sym)) + (make-lexical-set loc + rest + the-rest-sym + (nil-value loc)) (make-void loc)) - (if (null? dynamic) - compiled-body - (let-dynamic loc - dynamic - value-slot - (map (lambda (name-sym) - (make-lexical-ref - loc - (car name-sym) - (cdr name-sym))) - all-dyn-pairs) - compiled-body))))) + (make-void loc)) + (if (null? dynamic) + compiled-body + (let-dynamic loc + dynamic + value-slot + (map (lambda (name-sym) + (make-lexical-ref + loc + (car name-sym) + (cdr name-sym))) + all-dyn-pairs) + compiled-body)))) #f))))))))) ;;; Handle the common part of defconst and defvar, that is, checking for @@ -623,7 +620,7 @@ (report-error loc "invalid symbol list" syms)) (let ((old (fluid-ref fluid)) (make-body (lambda () - (make-sequence loc (map compile-expr body))))) + (list->seq loc (map compile-expr body))))) (if (eq? old 'all) (make-body) (let ((new (if (eq? syms 'all) @@ -635,7 +632,7 @@ ;;; Special operators (defspecial progn (loc args) - (make-sequence loc (map compile-expr args))) + (list->seq loc (map compile-expr args))) (defspecial if (loc args) (pmatch args @@ -645,53 +642,51 @@ (compile-expr then) (if (null? else) (nil-value loc) - (make-sequence loc - (map compile-expr else))))))) + (list->seq loc (map compile-expr else))))))) (defspecial defconst (loc args) (pmatch args ((,sym ,value . ,doc) (if (handle-var-def loc sym doc) - (make-sequence loc - (list (set-variable! loc - sym - value-slot - (compile-expr value)) - (make-const loc sym))))))) + (make-seq loc + (set-variable! loc + sym + value-slot + (compile-expr value)) + (make-const loc sym)))))) (defspecial defvar (loc args) (pmatch args ((,sym) (make-const loc sym)) ((,sym ,value . ,doc) (if (handle-var-def loc sym doc) - (make-sequence + (make-seq loc - (list + (make-conditional + loc (make-conditional loc - (make-conditional + (call-primitive loc - (call-primitive - loc - 'module-bound? - (call-primitive loc - 'resolve-interface - (make-const loc value-slot)) - (make-const loc sym)) + 'module-bound? (call-primitive loc - 'fluid-bound? - (make-module-ref loc value-slot sym #t)) - (make-const loc #f)) - (make-void loc) - (set-variable! loc sym value-slot (compile-expr value))) - (make-const loc sym))))))) + 'resolve-interface + (make-const loc value-slot)) + (make-const loc sym)) + (call-primitive loc + 'fluid-bound? + (make-module-ref loc value-slot sym #t)) + (make-const loc #f)) + (make-void loc) + (set-variable! loc sym value-slot (compile-expr value))) + (make-const loc sym)))))) (defspecial setq (loc args) (define (car* x) (if (null? x) '() (car x))) (define (cdr* x) (if (null? x) '() (cdr x))) (define (cadr* x) (car* (cdr* x))) (define (cddr* x) (cdr* (cdr* x))) - (make-sequence + (list->seq loc (let loop ((args args) (last (nil-value loc))) (if (null? args) @@ -779,13 +774,12 @@ ((,condition . ,body) (let* ((itersym (gensym)) (compiled-body (map compile-expr body)) - (iter-call (make-application loc - (make-lexical-ref loc - 'iterate - itersym) - (list))) - (full-body (make-sequence loc - `(,@compiled-body ,iter-call))) + (iter-call (make-call loc + (make-lexical-ref loc + 'iterate + itersym) + (list))) + (full-body (list->seq loc `(,@compiled-body ,iter-call))) (lambda-body (make-conditional loc (compile-expr condition) full-body @@ -821,19 +815,16 @@ (if (not (symbol? name)) (report-error loc "expected symbol as macro name" name) (let* ((tree-il - (make-sequence + (make-seq loc - (list - (set-variable! - loc - name - function-slot - (make-application - loc - (make-module-ref loc '(guile) 'cons #t) - (list (make-const loc 'macro) - (compile-lambda loc args body)))) - (make-const loc name))))) + (set-variable! + loc + name + function-slot + (make-primcall loc 'cons + (list (make-const loc 'macro) + (compile-lambda loc args body)))) + (make-const loc name)))) (compile (ensuring-globals loc bindings-data tree-il) #:from 'tree-il #:to 'value) @@ -844,14 +835,14 @@ ((,name ,args . ,body) (if (not (symbol? name)) (report-error loc "expected symbol as function name" name) - (make-sequence loc - (list (set-variable! loc - name - function-slot - (compile-lambda loc - args - body)) - (make-const loc name))))))) + (make-seq loc + (set-variable! loc + name + function-slot + (compile-lambda loc + args + body)) + (make-const loc name)))))) (defspecial #{`}# (loc args) (pmatch args @@ -876,13 +867,13 @@ => (lambda (macro-function) (compile-expr (apply macro-function arguments)))) (else - (make-application loc - (if (symbol? operator) - (reference-variable loc - operator - function-slot) - (compile-expr operator)) - (map compile-expr arguments)))))) + (make-call loc + (if (symbol? operator) + (reference-variable loc + operator + function-slot) + (compile-expr operator)) + (map compile-expr arguments)))))) ;;; Compile a symbol expression. This is a variable reference or maybe ;;; some special value like nil. diff --git a/module/language/tree-il.scm b/module/language/tree-il.scm index 1d391c4e1..69af8d65a 100644 --- a/module/language/tree-il.scm +++ b/module/language/tree-il.scm @@ -34,8 +34,9 @@ <toplevel-set> toplevel-set? make-toplevel-set toplevel-set-src toplevel-set-name toplevel-set-exp <toplevel-define> toplevel-define? make-toplevel-define toplevel-define-src toplevel-define-name toplevel-define-exp <conditional> conditional? make-conditional conditional-src conditional-test conditional-consequent conditional-alternate - <application> application? make-application application-src application-proc application-args - <sequence> sequence? make-sequence sequence-src sequence-exps + <call> call? make-call call-src call-proc call-args + <primcall> primcall? make-primcall primcall-src primcall-name primcall-args + <seq> seq? make-seq seq-head seq-tail <lambda> lambda? make-lambda lambda-src lambda-meta lambda-body <lambda-case> lambda-case? make-lambda-case lambda-case-src lambda-case-req lambda-case-opt lambda-case-rest lambda-case-kw @@ -45,13 +46,15 @@ <letrec> letrec? make-letrec letrec-src letrec-in-order? letrec-names letrec-gensyms letrec-vals letrec-body <fix> fix? make-fix fix-src fix-names fix-gensyms fix-vals fix-body <let-values> let-values? make-let-values let-values-src let-values-exp let-values-body - <dynwind> dynwind? make-dynwind dynwind-src dynwind-winder dynwind-body dynwind-unwinder + <dynwind> dynwind? make-dynwind dynwind-src dynwind-winder dynwind-pre dynwind-body dynwind-post dynwind-unwinder <dynlet> dynlet? make-dynlet dynlet-src dynlet-fluids dynlet-vals dynlet-body <dynref> dynref? make-dynref dynref-src dynref-fluid <dynset> dynset? make-dynset dynset-src dynset-fluid dynset-exp <prompt> prompt? make-prompt prompt-src prompt-tag prompt-body prompt-handler <abort> abort? make-abort abort-src abort-tag abort-args abort-tail + list->seq + parse-tree-il unparse-tree-il tree-il->scheme @@ -118,8 +121,9 @@ ;; (<toplevel-set> name exp) ;; (<toplevel-define> name exp) ;; (<conditional> test consequent alternate) - ;; (<application> proc args) - ;; (<sequence> exps) + ;; (<call> proc args) + ;; (<primcall> name args) + ;; (<seq> head tail) ;; (<lambda> meta body) ;; (<lambda-case> req opt rest kw inits gensyms body alternate) ;; (<let> names gensyms vals body) @@ -129,7 +133,7 @@ (define-type (<tree-il> #:common-slots (src) #:printer print-tree-il) (<fix> names gensyms vals body) (<let-values> exp body) - (<dynwind> winder body unwinder) + (<dynwind> winder pre body post unwinder) (<dynref> fluid) (<dynset> fluid exp) (<prompt> tag body handler) @@ -137,6 +141,14 @@ +;; A helper. +(define (list->seq loc exps) + (if (null? (cdr exps)) + (car exps) + (make-seq loc (car exps) (list->seq #f (cdr exps))))) + + + (define (location x) (and (pair? x) (let ((props (source-properties x))) @@ -149,8 +161,11 @@ ((void) (make-void loc)) - ((apply ,proc . ,args) - (make-application loc (retrans proc) (map retrans args))) + ((call ,proc . ,args) + (make-call loc (retrans proc) (map retrans args))) + + ((primcall ,name . ,args) + (make-primcall loc name (map retrans args))) ((if ,test ,consequent ,alternate) (make-conditional loc (retrans test) (retrans consequent) (retrans alternate))) @@ -209,8 +224,12 @@ ((const ,exp) (make-const loc exp)) + ((seq ,head ,tail) + (make-seq loc (retrans head) (retrans tail))) + + ;; Convenience. ((begin . ,exps) - (make-sequence loc (map retrans exps))) + (list->seq loc (map retrans exps))) ((let ,names ,gensyms ,vals ,body) (make-let loc names gensyms (map retrans vals) (retrans body))) @@ -227,8 +246,10 @@ ((let-values ,exp ,body) (make-let-values loc (retrans exp) (retrans body))) - ((dynwind ,winder ,body ,unwinder) - (make-dynwind loc (retrans winder) (retrans body) (retrans unwinder))) + ((dynwind ,winder ,pre ,body ,post ,unwinder) + (make-dynwind loc (retrans winder) (retrans pre) + (retrans body) + (retrans post) (retrans unwinder))) ((dynlet ,fluids ,vals ,body) (make-dynlet loc (map retrans fluids) (map retrans vals) (retrans body))) @@ -253,8 +274,11 @@ ((<void>) '(void)) - ((<application> proc args) - `(apply ,(unparse-tree-il proc) ,@(map unparse-tree-il args))) + ((<call> proc args) + `(call ,(unparse-tree-il proc) ,@(map unparse-tree-il args))) + + ((<primcall> name args) + `(primcall ,name ,@(map unparse-tree-il args))) ((<conditional> test consequent alternate) `(if ,(unparse-tree-il test) ,(unparse-tree-il consequent) ,(unparse-tree-il alternate))) @@ -294,9 +318,9 @@ ((<const> exp) `(const ,exp)) - ((<sequence> exps) - `(begin ,@(map unparse-tree-il exps))) - + ((<seq> head tail) + `(seq ,(unparse-tree-il head) ,(unparse-tree-il tail))) + ((<let> names gensyms vals body) `(let ,names ,gensyms ,(map unparse-tree-il vals) ,(unparse-tree-il body))) @@ -310,9 +334,10 @@ ((<let-values> exp body) `(let-values ,(unparse-tree-il exp) ,(unparse-tree-il body))) - ((<dynwind> winder body unwinder) - `(dynwind ,(unparse-tree-il winder) ,(unparse-tree-il body) - ,(unparse-tree-il unwinder))) + ((<dynwind> winder pre body post unwinder) + `(dynwind ,(unparse-tree-il winder) ,(unparse-tree-il pre) + ,(unparse-tree-il body) + ,(unparse-tree-il post) ,(unparse-tree-il unwinder))) ((<dynlet> fluids vals body) `(dynlet ,(map unparse-tree-il fluids) ,(map unparse-tree-il vals) @@ -336,9 +361,12 @@ ((<void>) '(if #f #f)) - ((<application> proc args) + ((<call> proc args) `(,(tree-il->scheme proc) ,@(map tree-il->scheme args))) + ((<primcall> name args) + `(,name ,@(map tree-il->scheme args))) + ((<conditional> test consequent alternate) (if (void? alternate) `(if ,(tree-il->scheme test) ,(tree-il->scheme consequent)) @@ -433,8 +461,14 @@ exp (list 'quote exp))) - ((<sequence> exps) - `(begin ,@(map tree-il->scheme exps))) + ((<seq> head tail) + `(begin ,(tree-il->scheme head) + ,@(unfold (lambda (x) (not (seq? x))) + (lambda (x) (tree-il->scheme (seq-head x))) + seq-tail + tail + (lambda (x) + (list (tree-il->scheme x)))))) ((<let> gensyms vals body) `(let ,(map list gensyms (map tree-il->scheme vals)) ,(tree-il->scheme body))) @@ -453,7 +487,7 @@ `(call-with-values (lambda () ,(tree-il->scheme exp)) ,(tree-il->scheme (make-lambda #f '() body)))) - ((<dynwind> body winder unwinder) + ((<dynwind> winder body unwinder) `(dynamic-wind ,(tree-il->scheme winder) (lambda () ,(tree-il->scheme body)) ,(tree-il->scheme unwinder))) @@ -478,7 +512,8 @@ ((<abort> tag args tail) - `(apply abort ,(tree-il->scheme tag) ,@(map tree-il->scheme args) + `(apply abort-to-prompt + ,(tree-il->scheme tag) ,@(map tree-il->scheme args) ,(tree-il->scheme tail))))) @@ -489,7 +524,7 @@ invoked as `(PROC TREE SEED)', where TREE is the sub-tree or leaf considered and SEED is the current result, intially seeded with SEED. This is an implementation of `foldts' as described by Andy Wingo in -``Applications of fold to XML transformation''." +``Calls of fold to XML transformation''." (let loop ((tree tree) (result seed)) (if (or (null? tree) (pair? tree)) @@ -507,10 +542,12 @@ This is an implementation of `foldts' as described by Andy Wingo in (up tree (loop alternate (loop consequent (loop test (down tree result)))))) - ((<application> proc args) + ((<call> proc args) (up tree (loop (cons proc args) (down tree result)))) - ((<sequence> exps) - (up tree (loop exps (down tree result)))) + ((<primcall> name args) + (up tree (loop args (down tree result)))) + ((<seq> head tail) + (up tree (loop tail (loop head (down tree result))))) ((<lambda> body) (up tree (loop body (down tree result)))) ((<lambda-case> inits body alternate) @@ -532,10 +569,13 @@ This is an implementation of `foldts' as described by Andy Wingo in (down tree result))))) ((<let-values> exp body) (up tree (loop body (loop exp (down tree result))))) - ((<dynwind> body winder unwinder) + ((<dynwind> winder pre body post unwinder) (up tree (loop unwinder - (loop winder - (loop body (down tree result)))))) + (loop post + (loop body + (loop pre + (loop winder + (down tree result)))))))) ((<dynlet> fluids vals body) (up tree (loop body (loop vals @@ -578,11 +618,14 @@ This is an implementation of `foldts' as described by Andy Wingo in (let*-values (((seed ...) (foldts test seed ...)) ((seed ...) (foldts consequent seed ...))) (foldts alternate seed ...))) - ((<application> proc args) + ((<call> proc args) (let-values (((seed ...) (foldts proc seed ...))) (fold-values foldts args seed ...))) - ((<sequence> exps) - (fold-values foldts exps seed ...)) + ((<primcall> name args) + (fold-values foldts args seed ...)) + ((<seq> head tail) + (let-values (((seed ...) (foldts head seed ...))) + (foldts tail seed ...))) ((<lambda> body) (foldts body seed ...)) ((<lambda-case> inits body alternate) @@ -603,9 +646,11 @@ This is an implementation of `foldts' as described by Andy Wingo in ((<let-values> exp body) (let*-values (((seed ...) (foldts exp seed ...))) (foldts body seed ...))) - ((<dynwind> body winder unwinder) - (let*-values (((seed ...) (foldts body seed ...)) - ((seed ...) (foldts winder seed ...))) + ((<dynwind> winder pre body post unwinder) + (let*-values (((seed ...) (foldts winder seed ...)) + ((seed ...) (foldts pre seed ...)) + ((seed ...) (foldts body seed ...)) + ((seed ...) (foldts post seed ...))) (foldts unwinder seed ...))) ((<dynlet> fluids vals body) (let*-values (((seed ...) (fold-values foldts fluids seed ...)) @@ -631,9 +676,12 @@ This is an implementation of `foldts' as described by Andy Wingo in (define (post-order! f x) (let lp ((x x)) (record-case x - ((<application> proc args) - (set! (application-proc x) (lp proc)) - (set! (application-args x) (map lp args))) + ((<call> proc args) + (set! (call-proc x) (lp proc)) + (set! (call-args x) (map lp args))) + + ((<primcall> name args) + (set! (primcall-args x) (map lp args))) ((<conditional> test consequent alternate) (set! (conditional-test x) (lp test)) @@ -661,9 +709,10 @@ This is an implementation of `foldts' as described by Andy Wingo in (if alternate (set! (lambda-case-alternate x) (lp alternate)))) - ((<sequence> exps) - (set! (sequence-exps x) (map lp exps))) - + ((<seq> head tail) + (set! (seq-head x) (lp head)) + (set! (seq-tail x) (lp tail))) + ((<let> gensyms vals body) (set! (let-vals x) (map lp vals)) (set! (let-body x) (lp body))) @@ -680,9 +729,11 @@ This is an implementation of `foldts' as described by Andy Wingo in (set! (let-values-exp x) (lp exp)) (set! (let-values-body x) (lp body))) - ((<dynwind> body winder unwinder) - (set! (dynwind-body x) (lp body)) + ((<dynwind> winder pre body post unwinder) (set! (dynwind-winder x) (lp winder)) + (set! (dynwind-pre x) (lp pre)) + (set! (dynwind-body x) (lp body)) + (set! (dynwind-post x) (lp post)) (set! (dynwind-unwinder x) (lp unwinder))) ((<dynlet> fluids vals body) @@ -715,9 +766,12 @@ This is an implementation of `foldts' as described by Andy Wingo in (let lp ((x x)) (let ((x (or (f x) x))) (record-case x - ((<application> proc args) - (set! (application-proc x) (lp proc)) - (set! (application-args x) (map lp args))) + ((<call> proc args) + (set! (call-proc x) (lp proc)) + (set! (call-args x) (map lp args))) + + ((<primcall> name args) + (set! (primcall-args x) (map lp args))) ((<conditional> test consequent alternate) (set! (conditional-test x) (lp test)) @@ -744,9 +798,10 @@ This is an implementation of `foldts' as described by Andy Wingo in (set! (lambda-case-body x) (lp body)) (if alternate (set! (lambda-case-alternate x) (lp alternate)))) - ((<sequence> exps) - (set! (sequence-exps x) (map lp exps))) - + ((<seq> head tail) + (set! (seq-head x) (lp head)) + (set! (seq-tail x) (lp tail))) + ((<let> vals body) (set! (let-vals x) (map lp vals)) (set! (let-body x) (lp body))) @@ -763,9 +818,11 @@ This is an implementation of `foldts' as described by Andy Wingo in (set! (let-values-exp x) (lp exp)) (set! (let-values-body x) (lp body))) - ((<dynwind> body winder unwinder) - (set! (dynwind-body x) (lp body)) + ((<dynwind> winder pre body post unwinder) (set! (dynwind-winder x) (lp winder)) + (set! (dynwind-pre x) (lp pre)) + (set! (dynwind-body x) (lp body)) + (set! (dynwind-post x) (lp post)) (set! (dynwind-unwinder x) (lp unwinder))) ((<dynlet> fluids vals body) diff --git a/module/language/tree-il/analyze.scm b/module/language/tree-il/analyze.scm index 990994a1e..d6502a65f 100644 --- a/module/language/tree-il/analyze.scm +++ b/module/language/tree-il/analyze.scm @@ -179,10 +179,13 @@ (analyze! x new-proc (append labels labels-in-proc) #t #f)) (define (recur x new-proc) (analyze! x new-proc '() tail? #f)) (record-case x - ((<application> proc args) + ((<call> proc args) (apply lset-union eq? (step-tail-call proc args) (map step args))) + ((<primcall> args) + (apply lset-union eq? (map step args))) + ((<conditional> test consequent alternate) (lset-union eq? (step test) (step-tail consequent) (step-tail alternate))) @@ -221,13 +224,8 @@ ((<toplevel-define> exp) (step exp)) - ((<sequence> exps) - (let lp ((exps exps) (ret '())) - (cond ((null? exps) '()) - ((null? (cdr exps)) - (lset-union eq? ret (step-tail (car exps)))) - (else - (lp (cdr exps) (lset-union eq? ret (step (car exps)))))))) + ((<seq> head tail) + (lset-union eq? (step head) (step-tail tail))) ((<lambda> body) ;; order is important here @@ -338,8 +336,10 @@ ((<let-values> exp body) (lset-union eq? (step exp) (step body))) - ((<dynwind> body winder unwinder) - (lset-union eq? (step body) (step winder) (step unwinder))) + ((<dynwind> winder pre body post unwinder) + (lset-union eq? (step winder) (step pre) + (step body) + (step post) (step unwinder))) ((<dynlet> fluids vals body) (apply lset-union eq? (step body) (map step (append fluids vals)))) @@ -365,9 +365,12 @@ (define (allocate! x proc n) (define (recur y) (allocate! y proc n)) (record-case x - ((<application> proc args) + ((<call> proc args) (apply max (recur proc) (map recur args))) + ((<primcall> args) + (apply max n (map recur args))) + ((<conditional> test consequent alternate) (max (recur test) (recur consequent) (recur alternate))) @@ -383,8 +386,9 @@ ((<toplevel-define> exp) (recur exp)) - ((<sequence> exps) - (apply max (map recur exps))) + ((<seq> head tail) + (max (recur head) + (recur tail))) ((<lambda> body) ;; allocate closure vars in order @@ -507,8 +511,10 @@ ((<let-values> exp body) (max (recur exp) (recur body))) - ((<dynwind> body winder unwinder) - (max (recur body) (recur winder) (recur unwinder))) + ((<dynwind> winder pre body post unwinder) + (max (recur winder) (recur pre) + (recur body) + (recur post) (recur unwinder))) ((<dynlet> fluids vals body) (apply max (recur body) (map recur (append fluids vals)))) @@ -864,7 +870,7 @@ accurate information is missing from a given `tree-il' element." (defs toplevel-info-defs)) ;; (VARIABLE-NAME ...) (define (goops-toplevel-definition proc args env) - ;; If application of PROC to ARGS is a GOOPS top-level definition, return + ;; If call of PROC to ARGS is a GOOPS top-level definition, return ;; the name of the variable being defined; otherwise return #f. This ;; assumes knowledge of the current implementation of `define-class' et al. (define (toplevel-define-arg args) @@ -925,7 +931,7 @@ accurate information is missing from a given `tree-il' element." (make-toplevel-info (vhash-delq name refs) (vhash-consq name #t defs))) - ((<application> proc args) + ((<call> proc args) ;; Check for a dynamic top-level definition, as is ;; done by code expanded from GOOPS macros. (let ((name (goops-toplevel-definition proc args @@ -963,12 +969,12 @@ accurate information is missing from a given `tree-il' element." (define-record-type <arity-info> (make-arity-info toplevel-calls lexical-lambdas toplevel-lambdas) arity-info? - (toplevel-calls toplevel-procedure-calls) ;; ((NAME . APPLICATION) ...) + (toplevel-calls toplevel-procedure-calls) ;; ((NAME . CALL) ...) (lexical-lambdas lexical-lambdas) ;; ((GENSYM . DEFINITION) ...) (toplevel-lambdas toplevel-lambdas)) ;; ((NAME . DEFINITION) ...) -(define (validate-arity proc application lexical?) - ;; Validate the argument count of APPLICATION, a tree-il application of +(define (validate-arity proc call lexical?) + ;; Validate the argument count of CALL, a tree-il call of ;; PROC, emitting a warning in case of argument count mismatch. (define (filter-keyword-args keywords allow-other-keys? args) @@ -1028,8 +1034,8 @@ accurate information is missing from a given `tree-il' element." (else (values #f #f)))))))) - (let ((args (application-args application)) - (src (tree-il-src application))) + (let ((args (call-args call)) + (src (tree-il-src call))) (call-with-values (lambda () (arities proc)) (lambda (name arities) (define matches? @@ -1116,7 +1122,7 @@ accurate information is missing from a given `tree-il' element." ((<fix> gensyms vals) (fold extend info gensyms vals)) - ((<application> proc args src) + ((<call> proc args src) (record-case proc ((<lambda> body) (validate-arity proc x #t) @@ -1176,9 +1182,9 @@ accurate information is missing from a given `tree-il' element." (let ((toplevel-calls (toplevel-procedure-calls result)) (toplevel-lambdas (toplevel-lambdas result))) (vlist-for-each - (lambda (name+application) - (let* ((name (car name+application)) - (application (cdr name+application)) + (lambda (name+call) + (let* ((name (car name+call)) + (call (cdr name+call)) (proc (or (and=> (vhash-assq name toplevel-lambdas) cdr) (and (module? env) @@ -1193,7 +1199,7 @@ accurate information is missing from a given `tree-il' element." (module-ref env name)))) proc))) (if (or (lambda? proc*) (procedure? proc*)) - (validate-arity proc* application (lambda? proc*))))) + (validate-arity proc* call (lambda? proc*))))) toplevel-calls))) (make-arity-info vlist-null vlist-null vlist-null))) @@ -1344,7 +1350,7 @@ accurate information is missing from a given `tree-il' element." (match x (($ <const> _ exp) exp) - (($ <application> _ + (($ <call> _ (or ($ <toplevel-ref> _ '_) ($ <module-ref> _ '_)) (($ <const> _ (and (? string?) fmt)))) ;; Gettexted literals, like `(_ "foo")'. @@ -1401,7 +1407,7 @@ accurate information is missing from a given `tree-il' element." (false-if-exception (module-ref env name)))) (match x - (($ <application> src ($ <toplevel-ref> _ name) args) + (($ <call> src ($ <toplevel-ref> _ name) args) (let ((proc (resolve-toplevel name))) (and (or (eq? proc format) (eq? proc (@ (ice-9 format) format))) diff --git a/module/language/tree-il/canonicalize.scm b/module/language/tree-il/canonicalize.scm index 04f561282..27d72956f 100644 --- a/module/language/tree-il/canonicalize.scm +++ b/module/language/tree-il/canonicalize.scm @@ -36,16 +36,6 @@ (post-order! (lambda (x) (match x - (($ <sequence> src (tail)) - tail) - (($ <sequence> src exps) - (and (any sequence? exps) - (make-sequence src - (append-map (lambda (x) - (if (sequence? x) - (sequence-exps x) - (list x))) - exps)))) (($ <let> src () () () body) body) (($ <letrec> src _ () () () body) @@ -65,7 +55,7 @@ (else #f))) (define (thunk-application? x) (match x - (($ <application> _ + (($ <call> _ ($ <lambda> _ _ ($ <lambda-case> _ () #f #f #f)) ()) #t) (_ #f))) @@ -73,7 +63,7 @@ (define thunk (make-lambda #f '() (make-lambda-case #f '() #f #f #f '() '() body #f))) - (make-application #f thunk '())) + (make-call #f thunk '())) ;; This code has a nasty job to do: to ensure that either the ;; handler is escape-only, or the body is the application of a diff --git a/module/language/tree-il/compile-glil.scm b/module/language/tree-il/compile-glil.scm index de55026ab..31e9a70b5 100644 --- a/module/language/tree-il/compile-glil.scm +++ b/module/language/tree-il/compile-glil.scm @@ -115,6 +115,9 @@ ((class-of . 1) . class-of) ((@slot-ref . 2) . slot-ref) ((@slot-set! . 3) . slot-set) + ((string-length . 1) . string-length) + ((string-ref . 2) . string-ref) + ((vector-length . 1) . vector-length) ((vector-ref . 2) . vector-ref) ((vector-set! . 3) . vector-set) ((variable-ref . 1) . variable-ref) @@ -268,200 +271,12 @@ (emit-code src (make-glil-const exp)))) (maybe-emit-return)) - ;; FIXME: should represent sequence as exps tail - ((<sequence> exps) - (let lp ((exps exps)) - (if (null? (cdr exps)) - (comp-tail (car exps)) - (begin - (comp-drop (car exps)) - (lp (cdr exps)))))) - - ((<application> src proc args) - ;; FIXME: need a better pattern-matcher here + ((<seq> head tail) + (comp-drop head) + (comp-tail tail)) + + ((<call> src proc args) (cond - ((and (primitive-ref? proc) - (eq? (primitive-ref-name proc) '@apply) - (>= (length args) 1)) - (let ((proc (car args)) - (args (cdr args))) - (cond - ((and (primitive-ref? proc) (eq? (primitive-ref-name proc) 'values) - (not (eq? context 'push)) (not (eq? context 'vals))) - ;; tail: (lambda () (apply values '(1 2))) - ;; drop: (lambda () (apply values '(1 2)) 3) - ;; push: (lambda () (list (apply values '(10 12)) 1)) - (case context - ((drop) (for-each comp-drop args) (maybe-emit-return)) - ((tail) - (for-each comp-push args) - (emit-code src (make-glil-call 'return/values* (length args)))))) - - (else - (case context - ((tail) - (comp-push proc) - (for-each comp-push args) - (emit-code src (make-glil-call 'tail-apply (1+ (length args))))) - ((push) - (emit-code src (make-glil-call 'new-frame 0)) - (comp-push proc) - (for-each comp-push args) - (emit-code src (make-glil-call 'apply (1+ (length args)))) - (maybe-emit-return)) - ((vals) - (comp-vals - (make-application src (make-primitive-ref #f 'apply) - (cons proc args)) - MVRA) - (maybe-emit-return)) - ((drop) - ;; Well, shit. The proc might return any number of - ;; values (including 0), since it's in a drop context, - ;; yet apply does not create a MV continuation. So we - ;; mv-call out to our trampoline instead. - (comp-drop - (make-application src (make-primitive-ref #f 'apply) - (cons proc args))) - (maybe-emit-return))))))) - - ((and (primitive-ref? proc) (eq? (primitive-ref-name proc) 'values)) - ;; tail: (lambda () (values '(1 2))) - ;; drop: (lambda () (values '(1 2)) 3) - ;; push: (lambda () (list (values '(10 12)) 1)) - ;; vals: (let-values (((a b ...) (values 1 2 ...))) ...) - (case context - ((drop) (for-each comp-drop args) (maybe-emit-return)) - ((push) - (case (length args) - ((0) - ;; FIXME: This is surely an error. We need to add a - ;; values-mismatch warning pass. - (emit-code src (make-glil-call 'new-frame 0)) - (comp-push proc) - (emit-code src (make-glil-call 'call 0)) - (maybe-emit-return)) - ((1) - (comp-push (car args))) - (else - ;; Taking advantage of unspecified order of evaluation of - ;; arguments. - (for-each comp-drop (cdr args)) - (comp-push (car args))))) - ((vals) - (for-each comp-push args) - (emit-code #f (make-glil-const (length args))) - (emit-branch src 'br MVRA)) - ((tail) - (for-each comp-push args) - (emit-code src (let ((len (length args))) - (if (= len 1) - (make-glil-call 'return 1) - (make-glil-call 'return/values len))))))) - - ((and (primitive-ref? proc) - (eq? (primitive-ref-name proc) '@call-with-values) - (= (length args) 2)) - ;; CONSUMER - ;; PRODUCER - ;; (mv-call MV) - ;; ([tail]-call 1) - ;; goto POST - ;; MV: [tail-]call/nargs - ;; POST: (maybe-drop) - (case context - ((vals) - ;; Fall back. - (comp-vals - (make-application src (make-primitive-ref #f 'call-with-values) - args) - MVRA) - (maybe-emit-return)) - (else - (let ((MV (make-label)) (POST (make-label)) - (producer (car args)) (consumer (cadr args))) - (if (not (eq? context 'tail)) - (emit-code src (make-glil-call 'new-frame 0))) - (comp-push consumer) - (emit-code src (make-glil-call 'new-frame 0)) - (comp-push producer) - (emit-code src (make-glil-mv-call 0 MV)) - (case context - ((tail) (emit-code src (make-glil-call 'tail-call 1))) - (else (emit-code src (make-glil-call 'call 1)) - (emit-branch #f 'br POST))) - (emit-label MV) - (case context - ((tail) (emit-code src (make-glil-call 'tail-call/nargs 0))) - (else (emit-code src (make-glil-call 'call/nargs 0)) - (emit-label POST) - (if (eq? context 'drop) - (emit-code #f (make-glil-call 'drop 1))) - (maybe-emit-return))))))) - - ((and (primitive-ref? proc) - (eq? (primitive-ref-name proc) '@call-with-current-continuation) - (= (length args) 1)) - (case context - ((tail) - (comp-push (car args)) - (emit-code src (make-glil-call 'tail-call/cc 1))) - ((vals) - (comp-vals - (make-application - src (make-primitive-ref #f 'call-with-current-continuation) - args) - MVRA) - (maybe-emit-return)) - ((push) - (comp-push (car args)) - (emit-code src (make-glil-call 'call/cc 1)) - (maybe-emit-return)) - ((drop) - ;; Crap. Just like `apply' in drop context. - (comp-drop - (make-application - src (make-primitive-ref #f 'call-with-current-continuation) - args)) - (maybe-emit-return)))) - - ;; A hack for variable-set, the opcode for which takes its args - ;; reversed, relative to the variable-set! function - ((and (primitive-ref? proc) - (eq? (primitive-ref-name proc) 'variable-set!) - (= (length args) 2)) - (comp-push (cadr args)) - (comp-push (car args)) - (emit-code src (make-glil-call 'variable-set 2)) - (case context - ((tail push vals) (emit-code #f (make-glil-void)))) - (maybe-emit-return)) - - ((and (primitive-ref? proc) - (or (hash-ref *primcall-ops* - (cons (primitive-ref-name proc) (length args))) - (hash-ref *primcall-ops* (primitive-ref-name proc)))) - => (lambda (op) - (for-each comp-push args) - (emit-code src (make-glil-call op (length args))) - (case (instruction-pushes op) - ((0) - (case context - ((tail push vals) (emit-code #f (make-glil-void)))) - (maybe-emit-return)) - ((1) - (case context - ((drop) (emit-code #f (make-glil-call 'drop 1)))) - (maybe-emit-return)) - ((-1) - ;; A control instruction, like return/values. Here we - ;; just have to hope that the author of the tree-il - ;; knew what they were doing. - *unspecified*) - (else - (error "bad primitive op: too many pushes" - op (instruction-pushes op)))))) - ;; call to the same lambda-case in tail position ((and (lexical-ref? proc) self-label (eq? (lexical-ref-gensym proc) self-label) @@ -543,6 +358,158 @@ (emit-branch #f 'br RA) (emit-label POST))))))))) + ((<primcall> src name args) + (pmatch (cons name args) + ((@apply ,proc . ,args) + (cond + ((and (primitive-ref? proc) (eq? (primitive-ref-name proc) 'values) + (not (eq? context 'push)) (not (eq? context 'vals))) + ;; tail: (lambda () (apply values '(1 2))) + ;; drop: (lambda () (apply values '(1 2)) 3) + ;; push: (lambda () (list (apply values '(10 12)) 1)) + (case context + ((drop) (for-each comp-drop args) (maybe-emit-return)) + ((tail) + (for-each comp-push args) + (emit-code src (make-glil-call 'return/values* (length args)))))) + + (else + (case context + ((tail) + (comp-push proc) + (for-each comp-push args) + (emit-code src (make-glil-call 'tail-apply (1+ (length args))))) + ((push) + (emit-code src (make-glil-call 'new-frame 0)) + (comp-push proc) + (for-each comp-push args) + (emit-code src (make-glil-call 'apply (1+ (length args)))) + (maybe-emit-return)) + (else + (comp-tail (make-primcall src 'apply (cons proc args)))))))) + + ((values . _) + ;; tail: (lambda () (values '(1 2))) + ;; drop: (lambda () (values '(1 2)) 3) + ;; push: (lambda () (list (values '(10 12)) 1)) + ;; vals: (let-values (((a b ...) (values 1 2 ...))) ...) + (case context + ((drop) (for-each comp-drop args) (maybe-emit-return)) + ((push) + (case (length args) + ((0) + ;; FIXME: This is surely an error. We need to add a + ;; values-mismatch warning pass. + (comp-push (make-call src (make-primitive-ref #f 'values) + '()))) + ((1) + (comp-push (car args))) + (else + ;; Taking advantage of unspecified order of evaluation of + ;; arguments. + (for-each comp-drop (cdr args)) + (comp-push (car args))))) + ((vals) + (for-each comp-push args) + (emit-code #f (make-glil-const (length args))) + (emit-branch src 'br MVRA)) + ((tail) + (for-each comp-push args) + (emit-code src (let ((len (length args))) + (if (= len 1) + (make-glil-call 'return 1) + (make-glil-call 'return/values len))))))) + + ((@call-with-values ,producer ,consumer) + ;; CONSUMER + ;; PRODUCER + ;; (mv-call MV) + ;; ([tail]-call 1) + ;; goto POST + ;; MV: [tail-]call/nargs + ;; POST: (maybe-drop) + (case context + ((vals) + ;; Fall back. + (comp-tail (make-primcall src 'call-with-values args))) + (else + (let ((MV (make-label)) (POST (make-label))) + (if (not (eq? context 'tail)) + (emit-code src (make-glil-call 'new-frame 0))) + (comp-push consumer) + (emit-code src (make-glil-call 'new-frame 0)) + (comp-push producer) + (emit-code src (make-glil-mv-call 0 MV)) + (case context + ((tail) (emit-code src (make-glil-call 'tail-call 1))) + (else (emit-code src (make-glil-call 'call 1)) + (emit-branch #f 'br POST))) + (emit-label MV) + (case context + ((tail) (emit-code src (make-glil-call 'tail-call/nargs 0))) + (else (emit-code src (make-glil-call 'call/nargs 0)) + (emit-label POST) + (if (eq? context 'drop) + (emit-code #f (make-glil-call 'drop 1))) + (maybe-emit-return))))))) + + ((@call-with-current-continuation ,proc) + (case context + ((tail) + (comp-push proc) + (emit-code src (make-glil-call 'tail-call/cc 1))) + ((vals) + (comp-vals + (make-primcall src 'call-with-current-continuation args) + MVRA) + (maybe-emit-return)) + ((push) + (comp-push proc) + (emit-code src (make-glil-call 'call/cc 1)) + (maybe-emit-return)) + ((drop) + ;; Fall back. + (comp-tail + (make-primcall src 'call-with-current-continuation args))))) + + ;; A hack for variable-set, the opcode for which takes its args + ;; reversed, relative to the variable-set! function + ((variable-set! ,var ,val) + (comp-push val) + (comp-push var) + (emit-code src (make-glil-call 'variable-set 2)) + (case context + ((tail push vals) (emit-code #f (make-glil-void)))) + (maybe-emit-return)) + + (else + (cond + ((or (hash-ref *primcall-ops* (cons name (length args))) + (hash-ref *primcall-ops* name)) + => (lambda (op) + (for-each comp-push args) + (emit-code src (make-glil-call op (length args))) + (case (instruction-pushes op) + ((0) + (case context + ((tail push vals) (emit-code #f (make-glil-void)))) + (maybe-emit-return)) + ((1) + (case context + ((drop) (emit-code #f (make-glil-call 'drop 1)))) + (maybe-emit-return)) + ((-1) + ;; A control instruction, like return/values. Here we + ;; just have to hope that the author of the tree-il + ;; knew what they were doing. + *unspecified*) + (else + (error "bad primitive op: too many pushes" + op (instruction-pushes op)))))) + (else + ;; Fall back to the normal compilation strategy. + (comp-tail (make-call src (make-primitive-ref #f name) args))))))) + ((<conditional> src test consequent alternate) ;; TEST ;; (br-if-not L1) @@ -551,54 +518,33 @@ ;; L1: alternate ;; L2: (let ((L1 (make-label)) (L2 (make-label))) - ;; need a pattern matcher (record-case test - ((<application> proc args) - (record-case proc - ((<primitive-ref> name) - (let ((len (length args))) - (cond - - ((and (eq? name 'eq?) (= len 2)) - (comp-push (car args)) - (comp-push (cadr args)) - (emit-branch src 'br-if-not-eq L1)) - - ((and (eq? name 'null?) (= len 1)) - (comp-push (car args)) - (emit-branch src 'br-if-not-null L1)) - - ((and (eq? name 'not) (= len 1)) - (let ((app (car args))) - (record-case app - ((<application> proc args) - (let ((len (length args))) - (record-case proc - ((<primitive-ref> name) - (cond - - ((and (eq? name 'eq?) (= len 2)) - (comp-push (car args)) - (comp-push (cadr args)) - (emit-branch src 'br-if-eq L1)) - - ((and (eq? name 'null?) (= len 1)) - (comp-push (car args)) - (emit-branch src 'br-if-null L1)) - - (else - (comp-push app) - (emit-branch src 'br-if L1)))) - (else - (comp-push app) - (emit-branch src 'br-if L1))))) - (else - (comp-push app) - (emit-branch src 'br-if L1))))) - - (else - (comp-push test) - (emit-branch src 'br-if-not L1))))) + ((<primcall> name args) + (pmatch (cons name args) + ((eq? ,a ,b) + (comp-push a) + (comp-push b) + (emit-branch src 'br-if-not-eq L1)) + ((null? ,x) + (comp-push x) + (emit-branch src 'br-if-not-null L1)) + ((not ,x) + (record-case x + ((<primcall> name args) + (pmatch (cons name args) + ((eq? ,a ,b) + (comp-push a) + (comp-push b) + (emit-branch src 'br-if-eq L1)) + ((null? ,x) + (comp-push x) + (emit-branch src 'br-if-null L1)) + (else + (comp-push x) + (emit-branch src 'br-if L1)))) + (else + (comp-push x) + (emit-branch src 'br-if L1)))) (else (comp-push test) (emit-branch src 'br-if-not L1)))) @@ -975,10 +921,10 @@ ;; to have body's return value(s) on the stack while the unwinder runs, ;; then proceed with returning or dropping or what-have-you, interacting ;; with RA and MVRA. What have you, I say. - ((<dynwind> src body winder unwinder) + ((<dynwind> src winder pre body post unwinder) (comp-push winder) (comp-push unwinder) - (comp-drop (make-application src winder '())) + (comp-drop pre) (emit-code #f (make-glil-call 'wind 2)) (case context @@ -987,14 +933,14 @@ (comp-vals body MV) ;; one value: unwind... (emit-code #f (make-glil-call 'unwind 0)) - (comp-drop (make-application src unwinder '())) + (comp-drop post) ;; ...and return the val (emit-code #f (make-glil-call 'return 1)) (emit-label MV) ;; multiple values: unwind... (emit-code #f (make-glil-call 'unwind 0)) - (comp-drop (make-application src unwinder '())) + (comp-drop post) ;; and return the values. (emit-code #f (make-glil-call 'return/nvalues 1)))) @@ -1003,7 +949,7 @@ (comp-push body) ;; and unwind, leaving the val on the stack (emit-code #f (make-glil-call 'unwind 0)) - (comp-drop (make-application src unwinder '()))) + (comp-drop post)) ((vals) (let ((MV (make-label))) @@ -1014,7 +960,7 @@ (emit-label MV) ;; multiple values: unwind... (emit-code #f (make-glil-call 'unwind 0)) - (comp-drop (make-application src unwinder '())) + (comp-drop post) ;; and goto the MVRA. (emit-branch #f 'br MVRA))) @@ -1022,7 +968,7 @@ ;; compile body, discarding values. then unwind... (comp-drop body) (emit-code #f (make-glil-call 'unwind 0)) - (comp-drop (make-application src unwinder '())) + (comp-drop post) ;; and fall through, or goto RA if there is one. (if RA (emit-branch #f 'br RA))))) diff --git a/module/language/tree-il/debug.scm b/module/language/tree-il/debug.scm index 78f132416..a32fc4153 100644 --- a/module/language/tree-il/debug.scm +++ b/module/language/tree-il/debug.scm @@ -215,9 +215,11 @@ (for-each (cut visit <> env) fluids) (for-each (cut visit <> env) vals) (visit body env)))) - (($ <dynwind> src winder body unwinder) + (($ <dynwind> src winder pre body post unwinder) (visit winder env) + (visit pre env) (visit body env) + (visit post env) (visit unwinder env)) (($ <dynref> src fluid) (visit fluid env)) @@ -228,21 +230,24 @@ (visit condition env) (visit subsequent env) (visit alternate env)) - (($ <application> src proc args) + (($ <primcall> src name args) (cond + ((not (symbol? name)) + (error "expected symbolic operator" exp)) ((not (list? args)) (error "expected list of args" args)) (else - (visit proc env) (for-each (cut visit <> env) args)))) - (($ <sequence> src exps) + (($ <call> src proc args) (cond - ((not (list? exps)) - (error "expected list of exps" exp)) - ((null? exps) - (error "expected more than one exp" exp)) + ((not (list? args)) + (error "expected list of args" args)) (else - (for-each (cut visit <> env) exps)))) + (visit proc env) + (for-each (cut visit <> env) args)))) + (($ <seq> src head tail) + (visit head env) + (visit tail env)) (($ <prompt> src tag body handler) (visit tag env) (visit body env) diff --git a/module/language/tree-il/fix-letrec.scm b/module/language/tree-il/fix-letrec.scm index 3d7db27a8..2a18342d3 100644 --- a/module/language/tree-il/fix-letrec.scm +++ b/module/language/tree-il/fix-letrec.scm @@ -41,12 +41,11 @@ (and (simple-expression? test bound-vars simple-primitive?) (simple-expression? consequent bound-vars simple-primitive?) (simple-expression? alternate bound-vars simple-primitive?))) - ((<sequence> exps) - (and-map (lambda (x) (simple-expression? x bound-vars simple-primitive?)) - exps)) - ((<application> proc args) - (and (primitive-ref? proc) - (simple-primitive? (primitive-ref-name proc)) + ((<seq> head tail) + (and (simple-expression? head bound-vars simple-primitive?) + (simple-expression? tail bound-vars simple-primitive?))) + ((<primcall> name args) + (and (simple-primitive? name) ;; FIXME: check arity? (and-map (lambda (x) (simple-expression? x bound-vars simple-primitive?)) @@ -191,7 +190,7 @@ ;; expression, called for effect. ((<lexical-set> gensym exp) (if (memq gensym unref) - (make-sequence #f (list exp (make-void #f))) + (make-seq #f exp (make-void #f)) x)) ((<letrec> src in-order? names gensyms vals body) @@ -219,7 +218,7 @@ ;; Bind lambdas using the fixpoint operator. (make-fix src (map cadr l) (map car l) (map caddr l) - (make-sequence + (list->seq src (append ;; The right-hand-sides of the unreferenced @@ -246,7 +245,7 @@ (let ((tmps (map (lambda (x) (gensym)) c))) (make-let #f (map cadr c) tmps (map caddr c) - (make-sequence + (list->seq #f (map (lambda (x tmp) (make-lexical-set @@ -263,7 +262,7 @@ (let ((u (lookup unref)) (l (lookup lambda*)) (c (lookup complex))) - (make-sequence + (list->seq src (append ;; unreferenced bindings, called for effect. diff --git a/module/language/tree-il/peval.scm b/module/language/tree-il/peval.scm index 634c6c91c..85865717c 100644 --- a/module/language/tree-il/peval.scm +++ b/module/language/tree-il/peval.scm @@ -348,18 +348,15 @@ top-level bindings from ENV and return the resulting expression." (define local-toplevel-env ;; The top-level environment of the module being compiled. - (match exp - (($ <toplevel-define> _ name) - (vhash-consq name #t env)) - (($ <sequence> _ exps) - (fold (lambda (x r) - (match x - (($ <toplevel-define> _ name) - (vhash-consq name #t r)) - (_ r))) - env - exps)) - (_ env))) + (let () + (define (env-folder x env) + (match x + (($ <toplevel-define> _ name) + (vhash-consq name #t env)) + (($ <seq> _ head tail) + (env-folder tail (env-folder head env))) + (_ env))) + (env-folder exp vlist-null))) (define (local-toplevel? name) (vhash-assq name local-toplevel-env)) @@ -427,12 +424,11 @@ top-level bindings from ENV and return the resulting expression." (match values ((single) single) ; 1 value ((_ ...) ; 0, or 2 or more values - (make-application src (make-primitive-ref src 'values) - values)))) + (make-primcall src 'values values)))) (define (fold-constants src name args ctx) (define (residualize-call) - (make-application src (make-primitive-ref #f name) args)) + (make-primcall src name args)) (cond ((every const? args) (let-values (((success? values) @@ -474,13 +470,12 @@ top-level bindings from ENV and return the resulting expression." ($ <dynset>)) ; (and (= (length names) 1) (make-let src names gensyms (list exp) body))) - (($ <application> src - ($ <primitive-ref> _ (? singly-valued-primitive? name))) + (($ <primcall> src (? singly-valued-primitive? name)) (and (= (length names) 1) (make-let src names gensyms (list exp) body))) ;; Statically-known number of values. - (($ <application> src ($ <primitive-ref> _ 'values) vals) + (($ <primcall> src 'values vals) (and (= (length names) (length vals)) (make-let src names gensyms vals body))) @@ -488,7 +483,8 @@ top-level bindings from ENV and return the resulting expression." (($ <conditional>) #f) ;; Bail on other applications. - (($ <application>) #f) + (($ <call>) #f) + (($ <primcall>) #f) ;; Bail on prompt and abort. (($ <prompt>) #f) @@ -514,20 +510,17 @@ top-level bindings from ENV and return the resulting expression." (make-let-values src exp (make-lambda-case src2 req opt rest kw inits gensyms body #f))))) - (($ <dynwind> src winder body unwinder) + (($ <dynwind> src winder pre body post unwinder) (let ((body (loop body))) (and body - (make-dynwind src winder body unwinder)))) + (make-dynwind src winder pre body post unwinder)))) (($ <dynlet> src fluids vals body) (let ((body (loop body))) (and body (make-dynlet src fluids vals body)))) - (($ <sequence> src exps) - (match exps - ((head ... tail) - (let ((tail (loop tail))) - (and tail - (make-sequence src (append head (list tail))))))))))) + (($ <seq> src head tail) + (let ((tail (loop tail))) + (and tail (make-seq src head tail))))))) (define (constant-expression? x) ;; Return true if X is constant, for the purposes of copying or @@ -548,16 +541,17 @@ top-level bindings from ENV and return the resulting expression." (($ <primitive-ref>) #t) (($ <conditional> _ condition subsequent alternate) (and (loop condition) (loop subsequent) (loop alternate))) - (($ <application> _ ($ <primitive-ref> _ name) args) + (($ <primcall> _ name args) (and (effect-free-primitive? name) (not (constructor-primitive? name)) - (not (accessor-primitive? name)) (types-check? name args) - (every loop args))) - (($ <application> _ ($ <lambda> _ _ body) args) + (if (accessor-primitive? name) + (every const? args) + (every loop args)))) + (($ <call> _ ($ <lambda> _ _ body) args) (and (loop body) (every loop args))) - (($ <sequence> _ exps) - (every loop exps)) + (($ <seq> _ head tail) + (and (loop head) (loop tail))) (($ <let> _ _ syms vals body) (and (not (any assigned-lexical? syms)) (every loop vals) (loop body))) @@ -606,7 +600,7 @@ top-level bindings from ENV and return the resulting expression." (if (null? effects) body (let ((effect-vals (map operand-residual-value effects))) - (make-sequence #f (reverse (cons body effect-vals))))))) + (list->seq #f (reverse (cons body effect-vals))))))) (if (null? values) body (let ((values (reverse values))) @@ -791,7 +785,7 @@ top-level bindings from ENV and return the resulting expression." (let ((exp (for-effect exp))) (if (void? exp) exp - (make-sequence src (list exp (make-void #f))))) + (make-seq src exp (make-void #f)))) (begin (set-operand-residualize?! op #t) (make-lexical-set src name (operand-sym op) (for-value exp)))))) @@ -805,14 +799,14 @@ top-level bindings from ENV and return the resulting expression." (body (loop body env counter ctx))) (cond ((const? body) - (for-tail (make-sequence src (append vals (list body))))) + (for-tail (list->seq src (append vals (list body))))) ((and (lexical-ref? body) (memq (lexical-ref-gensym body) new)) (let ((sym (lexical-ref-gensym body)) (pairs (map cons new vals))) ;; (let ((x foo) (y bar) ...) x) => (begin bar ... foo) (for-tail - (make-sequence + (list->seq src (append (map cdr (alist-delete sym pairs eq?)) (list (assq-ref pairs sym))))))) @@ -869,40 +863,10 @@ top-level bindings from ENV and return the resulting expression." (else #f))) (_ #f)) (make-let-values lv-src producer (for-tail consumer))))) - (($ <dynwind> src winder body unwinder) - (let ((pre (for-value winder)) - (body (for-tail body)) - (post (for-value unwinder))) - (cond - ((not (constant-expression? pre)) - (cond - ((not (constant-expression? post)) - (let ((pre-sym (gensym "pre ")) (post-sym (gensym "post "))) - (record-new-temporary! 'pre pre-sym 1) - (record-new-temporary! 'post post-sym 1) - (make-let src '(pre post) (list pre-sym post-sym) (list pre post) - (make-dynwind src - (make-lexical-ref #f 'pre pre-sym) - body - (make-lexical-ref #f 'post post-sym))))) - (else - (let ((pre-sym (gensym "pre "))) - (record-new-temporary! 'pre pre-sym 1) - (make-let src '(pre) (list pre-sym) (list pre) - (make-dynwind src - (make-lexical-ref #f 'pre pre-sym) - body - post)))))) - ((not (constant-expression? post)) - (let ((post-sym (gensym "post "))) - (record-new-temporary! 'post post-sym 1) - (make-let src '(post) (list post-sym) (list post) - (make-dynwind src - pre - body - (make-lexical-ref #f 'post post-sym))))) - (else - (make-dynwind src pre body post))))) + (($ <dynwind> src winder pre body post unwinder) + (make-dynwind src (for-value winder) (for-effect pre) + (for-tail body) + (for-effect post) (for-value unwinder))) (($ <dynlet> src fluids vals body) (make-dynlet src (map for-value fluids) (map for-value vals) (for-tail body))) @@ -911,12 +875,7 @@ top-level bindings from ENV and return the resulting expression." (($ <dynset> src fluid exp) (make-dynset src (for-value fluid) (for-value exp))) (($ <toplevel-ref> src (? effect-free-primitive? name)) - (if (local-toplevel? name) - exp - (let ((exp (resolve-primitives! exp cenv))) - (if (primitive-ref? exp) - (for-tail exp) - exp)))) + exp) (($ <toplevel-ref>) ;; todo: open private local bindings. exp) @@ -951,122 +910,159 @@ top-level bindings from ENV and return the resulting expression." (make-conditional src condition (for-tail subsequent) (for-tail alternate))))) - (($ <application> src - ($ <primitive-ref> _ '@call-with-values) + (($ <primcall> src '@call-with-values (producer ($ <lambda> _ _ (and consumer ;; No optional or kwargs. ($ <lambda-case> _ req #f rest #f () gensyms body #f))))) - (for-tail (make-let-values src (make-application src producer '()) + (for-tail (make-let-values src (make-call src producer '()) consumer))) - (($ <application> src orig-proc orig-args) + (($ <primcall> src 'dynamic-wind (w thunk u)) + (for-tail + (cond + ((not (constant-expression? w)) + (cond + ((not (constant-expression? u)) + (let ((w-sym (gensym "w ")) (u-sym (gensym "u "))) + (record-new-temporary! 'w w-sym 2) + (record-new-temporary! 'u u-sym 2) + (make-let src '(w u) (list w-sym u-sym) (list w u) + (make-dynwind + src + (make-lexical-ref #f 'w w-sym) + (make-call #f (make-lexical-ref #f 'w w-sym) '()) + (make-call #f thunk '()) + (make-call #f (make-lexical-ref #f 'u u-sym) '()) + (make-lexical-ref #f 'u u-sym))))) + (else + (let ((w-sym (gensym "w "))) + (record-new-temporary! 'w w-sym 2) + (make-let src '(w) (list w-sym) (list w) + (make-dynwind + src + (make-lexical-ref #f 'w w-sym) + (make-call #f (make-lexical-ref #f 'w w-sym) '()) + (make-call #f thunk '()) + (make-call #f u '()) + u)))))) + ((not (constant-expression? u)) + (let ((u-sym (gensym "u "))) + (record-new-temporary! 'u u-sym 2) + (make-let src '(u) (list u-sym) (list u) + (make-dynwind + src + w + (make-call #f w '()) + (make-call #f thunk '()) + (make-call #f (make-lexical-ref #f 'u u-sym) '()) + (make-lexical-ref #f 'u u-sym))))) + (else + (make-dynwind src w (make-call #f w '()) (make-call #f thunk '()) + (make-call #f u '()) u))))) + + (($ <primcall> src (? constructor-primitive? name) args) + (cond + ((and (memq ctx '(effect test)) + (match (cons name args) + ((or ('cons _ _) + ('list . _) + ('vector . _) + ('make-prompt-tag) + ('make-prompt-tag ($ <const> _ (? string?)))) + #t) + (_ #f))) + ;; Some expressions can be folded without visiting the + ;; arguments for value. + (let ((res (if (eq? ctx 'effect) + (make-void #f) + (make-const #f #t)))) + (for-tail (list->seq src (append args (list res)))))) + (else + (match (cons name (map for-value args)) + (('cons x ($ <const> _ ())) + (make-primcall src 'list (list x))) + (('cons x ($ <primcall> _ 'list elts)) + (make-primcall src 'list (cons x elts))) + ((name . args) + (make-primcall src name args)))))) + + (($ <primcall> src (? accessor-primitive? name) args) + (match (cons name (map for-value args)) + ;; FIXME: these for-tail recursions could take place outside + ;; an effort counter. + (('car ($ <primcall> src 'cons (head tail))) + (for-tail (make-seq src tail head))) + (('cdr ($ <primcall> src 'cons (head tail))) + (for-tail (make-seq src head tail))) + (('car ($ <primcall> src 'list (head . tail))) + (for-tail (list->seq src (append tail (list head))))) + (('cdr ($ <primcall> src 'list (head . tail))) + (for-tail (make-seq src head (make-primcall #f 'list tail)))) + + (('car ($ <const> src (head . tail))) + (for-tail (make-const src head))) + (('cdr ($ <const> src (head . tail))) + (for-tail (make-const src tail))) + (((or 'memq 'memv) k ($ <const> _ (elts ...))) + ;; FIXME: factor + (case ctx + ((effect) + (for-tail + (make-seq src k (make-void #f)))) + ((test) + (cond + ((const? k) + ;; A shortcut. The `else' case would handle it, but + ;; this way is faster. + (let ((member (case name ((memq) memq) ((memv) memv)))) + (make-const #f (and (member (const-exp k) elts) #t)))) + ((null? elts) + (for-tail + (make-seq src k (make-const #f #f)))) + (else + (let ((t (gensym "t ")) + (eq (if (eq? name 'memq) 'eq? 'eqv?))) + (record-new-temporary! 't t (length elts)) + (for-tail + (make-let + src (list 't) (list t) (list k) + (let lp ((elts elts)) + (define test + (make-primcall #f eq + (list (make-lexical-ref #f 't t) + (make-const #f (car elts))))) + (if (null? (cdr elts)) + test + (make-conditional src test + (make-const #f #t) + (lp (cdr elts))))))))))) + (else + (cond + ((const? k) + (let ((member (case name ((memq) memq) ((memv) memv)))) + (make-const #f (member (const-exp k) elts)))) + ((null? elts) + (for-tail (make-seq src k (make-const #f #f)))) + (else + (make-primcall src name (list k (make-const #f elts)))))))) + ((name . args) + (fold-constants src name args ctx)))) + + (($ <primcall> src (? effect-free-primitive? name) args) + (fold-constants src name (map for-value args) ctx)) + + (($ <primcall> src name args) + (make-primcall src name (map for-value args))) + + (($ <call> src orig-proc orig-args) ;; todo: augment the global env with specialized functions (let ((proc (visit orig-proc 'operator))) (match proc - (($ <primitive-ref> _ (? constructor-primitive? name)) - (cond - ((and (memq ctx '(effect test)) - (match (cons name orig-args) - ((or ('cons _ _) - ('list . _) - ('vector . _) - ('make-prompt-tag) - ('make-prompt-tag ($ <const> _ (? string?)))) - #t) - (_ #f))) - ;; Some expressions can be folded without visiting the - ;; arguments for value. - (let ((res (if (eq? ctx 'effect) - (make-void #f) - (make-const #f #t)))) - (for-tail (make-sequence src (append orig-args (list res)))))) - (else - (match (cons name (map for-value orig-args)) - (('cons head tail) - (match tail - (($ <const> src ()) - (make-application src (make-primitive-ref #f 'list) - (list head))) - (($ <application> src ($ <primitive-ref> _ 'list) elts) - (make-application src (make-primitive-ref #f 'list) - (cons head elts))) - (_ (make-application src proc (list head tail))))) - ((_ . args) - (make-application src proc args)))))) - (($ <primitive-ref> _ (? accessor-primitive? name)) - (match (cons name (map for-value orig-args)) - ;; FIXME: these for-tail recursions could take place outside - ;; an effort counter. - (('car ($ <application> src ($ <primitive-ref> _ 'cons) (head tail))) - (for-tail (make-sequence src (list tail head)))) - (('cdr ($ <application> src ($ <primitive-ref> _ 'cons) (head tail))) - (for-tail (make-sequence src (list head tail)))) - (('car ($ <application> src ($ <primitive-ref> _ 'list) (head . tail))) - (for-tail (make-sequence src (append tail (list head))))) - (('cdr ($ <application> src ($ <primitive-ref> _ 'list) (head . tail))) - (for-tail (make-sequence - src - (list head - (make-application - src (make-primitive-ref #f 'list) tail))))) - - (('car ($ <const> src (head . tail))) - (for-tail (make-const src head))) - (('cdr ($ <const> src (head . tail))) - (for-tail (make-const src tail))) - (((or 'memq 'memv) k ($ <const> _ (elts ...))) - ;; FIXME: factor - (case ctx - ((effect) - (for-tail - (make-sequence src (list k (make-void #f))))) - ((test) - (cond - ((const? k) - ;; A shortcut. The `else' case would handle it, but - ;; this way is faster. - (let ((member (case name ((memq) memq) ((memv) memv)))) - (make-const #f (and (member (const-exp k) elts) #t)))) - ((null? elts) - (for-tail - (make-sequence src (list k (make-const #f #f))))) - (else - (let ((t (gensym "t ")) - (eq (if (eq? name 'memq) 'eq? 'eqv?))) - (record-new-temporary! 't t (length elts)) - (for-tail - (make-let - src (list 't) (list t) (list k) - (let lp ((elts elts)) - (define test - (make-application - #f (make-primitive-ref #f eq) - (list (make-lexical-ref #f 't t) - (make-const #f (car elts))))) - (if (null? (cdr elts)) - test - (make-conditional src test - (make-const #f #t) - (lp (cdr elts))))))))))) - (else - (cond - ((const? k) - (let ((member (case name ((memq) memq) ((memv) memv)))) - (make-const #f (member (const-exp k) elts)))) - ((null? elts) - (for-tail (make-sequence src (list k (make-const #f #f))))) - (else - (make-application src proc (list k (make-const #f elts)))))))) - ((_ . args) - (or (fold-constants src name args ctx) - (make-application src proc args))))) - (($ <primitive-ref> _ (? effect-free-primitive? name)) - (let ((args (map for-value orig-args))) - (or (fold-constants src name args ctx) - (make-application src proc args)))) + (($ <primitive-ref> _ name) + (for-tail (make-primcall src name orig-args))) (($ <lambda> _ _ ($ <lambda-case> _ req opt #f #f inits gensyms body #f)) ;; Simple case: no rest, no keyword arguments. @@ -1078,8 +1074,7 @@ top-level bindings from ENV and return the resulting expression." (cond ((or (< nargs nreq) (> nargs (+ nreq nopt))) ;; An error, or effecting arguments. - (make-application src (for-call orig-proc) - (map for-value orig-args))) + (make-call src (for-call orig-proc) (map for-value orig-args))) ((or (and=> (find-counter key counter) counter-recursive?) (lambda? orig-proc)) ;; A recursive call, or a lambda in the operator @@ -1116,8 +1111,8 @@ top-level bindings from ENV and return the resulting expression." (let/ec k (define (abort) (log 'inline-abort exp) - (k (make-application src (for-call orig-proc) - (map for-value orig-args)))) + (k (make-call src (for-call orig-proc) + (map for-value orig-args)))) (define new-counter (cond ;; These first two cases will transfer effort @@ -1153,8 +1148,7 @@ top-level bindings from ENV and return the resulting expression." (log 'inline-end result exp) result))))) (_ - (make-application src (for-call orig-proc) - (map for-value orig-args)))))) + (make-call src (for-call orig-proc) (map for-value orig-args)))))) (($ <lambda> src meta body) (case ctx ((effect) (make-void #f)) @@ -1179,24 +1173,17 @@ top-level bindings from ENV and return the resulting expression." new (loop body env counter ctx) (and alt (for-tail alt))))) - (($ <sequence> src exps) - (let lp ((exps exps) (effects '())) - (match exps - ((last) - (if (null? effects) - (for-tail last) - (make-sequence - src - (reverse (cons (for-tail last) effects))))) - ((head . rest) - (let ((head (for-effect head))) - (cond - ((sequence? head) - (lp (append (sequence-exps head) rest) effects)) - ((void? head) - (lp rest effects)) - (else - (lp rest (cons head effects))))))))) + (($ <seq> src head tail) + (let ((head (for-effect head)) + (tail (for-tail tail))) + (if (void? head) + tail + (make-seq src + (if (and (seq? head) + (void? (seq-tail head))) + (seq-head head) + head) + tail)))) (($ <prompt> src tag body handler) (define (singly-used-definition x) (cond @@ -1208,8 +1195,7 @@ top-level bindings from ENV and return the resulting expression." (singly-used-definition (visit-operand x counter 'value 10 10)))) (else x))) (match (singly-used-definition tag) - (($ <application> _ ($ <primitive-ref> _ 'make-prompt-tag) - (or () ((? constant-expression?)))) + (($ <primcall> _ 'make-prompt-tag (or () ((? constant-expression?)))) ;; There is no way that an <abort> could know the tag ;; for this <prompt>, so we can elide the <prompt> ;; entirely. diff --git a/module/language/tree-il/primitives.scm b/module/language/tree-il/primitives.scm index f7bb5cab2..8e9d2eb6e 100644 --- a/module/language/tree-il/primitives.scm +++ b/module/language/tree-il/primitives.scm @@ -60,7 +60,7 @@ caaaar caaadr caadar caaddr cadaar cadadr caddar cadddr cdaaar cdaadr cdadar cdaddr cddaar cddadr cdddar cddddr - vector-ref vector-set! + vector-length vector-ref vector-set! variable-ref variable-set! variable-bound? @@ -141,7 +141,7 @@ + * - / 1- 1+ quotient remainder modulo not pair? null? list? symbol? vector? struct? string? - string-length + string-length vector-length ;; These all should get expanded out by expand-primitives!. caar cadr cdar cddr caaar caadr cadar caddr cdaar cdadr cddar cdddr @@ -232,12 +232,25 @@ (hashq-ref *singly-valued-primitive-table* prim)) (define (resolve-primitives! x mod) + (define local-definitions + (make-hash-table)) + + (let collect-local-definitions ((x x)) + (record-case x + ((<toplevel-define> name) + (hashq-set! local-definitions name #t)) + ((<seq> head tail) + (collect-local-definitions head) + (collect-local-definitions tail)) + (else #f))) + (post-order! (lambda (x) (record-case x ((<toplevel-ref> src name) - (and=> (hashq-ref *interesting-primitive-vars* - (module-variable mod name)) + (and=> (and (not (hashq-ref local-definitions name)) + (hashq-ref *interesting-primitive-vars* + (module-variable mod name))) (lambda (name) (make-primitive-ref src name)))) ((<module-ref> src mod name public?) ;; for the moment, we're disabling primitive resolution for @@ -247,6 +260,9 @@ (and=> (hashq-ref *interesting-primitive-vars* (module-variable m name)) (lambda (name) (make-primitive-ref src name)))))) + ((<call> src proc args) + (and (primitive-ref? proc) + (make-primcall src (primitive-ref-name proc) args))) (else #f))) x)) @@ -258,11 +274,9 @@ (pre-order! (lambda (x) (record-case x - ((<application> src proc args) - (and (primitive-ref? proc) - (let ((expand (hashq-ref *primitive-expand-table* - (primitive-ref-name proc)))) - (and expand (apply expand src args))))) + ((<primcall> src name args) + (let ((expand (hashq-ref *primitive-expand-table* name))) + (and expand (apply expand src args)))) (else #f))) x)) @@ -278,8 +292,8 @@ (lp (cdr in) (cons (if (eq? (caar in) 'quote) `(make-const src ,@(cdar in)) - `(make-application src (make-primitive-ref src ',(caar in)) - ,(inline-args (cdar in)))) + `(make-primcall src ',(caar in) + ,(inline-args (cdar in)))) out))) ((symbol? (car in)) ;; assume it's locally bound @@ -297,8 +311,8 @@ ,(consequent then) ,(consequent else))) (else - `(make-application src (make-primitive-ref src ',(car exp)) - ,(inline-args (cdr exp)))))) + `(make-primcall src ',(car exp) + ,(inline-args (cdr exp)))))) ((symbol? exp) ;; assume locally bound exp) @@ -470,25 +484,6 @@ (bytevector-ieee-double-native-set! vec (* i 8) x)) (hashq-set! *primitive-expand-table* - 'dynamic-wind - (case-lambda - ((src pre thunk post) - (let ((PRE (gensym " pre")) - (THUNK (gensym " thunk")) - (POST (gensym " post"))) - (make-let - src - '(pre thunk post) - (list PRE THUNK POST) - (list pre thunk post) - (make-dynwind - src - (make-lexical-ref #f 'pre PRE) - (make-application #f (make-lexical-ref #f 'thunk THUNK) '()) - (make-lexical-ref #f 'post POST))))) - (else #f))) - -(hashq-set! *primitive-expand-table* '@dynamic-wind (case-lambda ((src pre expr post) @@ -502,7 +497,9 @@ (make-dynwind src (make-lexical-ref #f 'pre PRE) + (make-call #f (make-lexical-ref #f 'pre PRE) '()) expr + (make-call #f (make-lexical-ref #f 'post POST) '()) (make-lexical-ref #f 'post POST))))))) (hashq-set! *primitive-expand-table* @@ -528,9 +525,9 @@ ;; trickery here. (make-lambda-case (tree-il-src handler) '() #f 'args #f '() (list args-sym) - (make-application #f (make-primitive-ref #f 'apply) - (list handler - (make-lexical-ref #f 'args args-sym))) + (make-primcall #f 'apply + (list handler + (make-lexical-ref #f 'args args-sym))) #f)))) (else #f))) @@ -544,14 +541,14 @@ ((lambda? handler) (let ((args-sym (gensym))) (make-prompt - src tag (make-application #f thunk '()) + src tag (make-call #f thunk '()) ;; If handler itself is a lambda, the inliner can do some ;; trickery here. (make-lambda-case (tree-il-src handler) '() #f 'args #f '() (list args-sym) - (make-application #f (make-primitive-ref #f 'apply) - (list handler - (make-lexical-ref #f 'args args-sym))) + (make-primcall #f 'apply + (list handler + (make-lexical-ref #f 'args args-sym))) #f)))) (else #f))) (else #f))) diff --git a/module/language/tree-il/spec.scm b/module/language/tree-il/spec.scm index 38e6d311c..3ad372709 100644 --- a/module/language/tree-il/spec.scm +++ b/module/language/tree-il/spec.scm @@ -1,6 +1,6 @@ ;;; Tree Intermediate Language -;; Copyright (C) 2009, 2010 Free Software Foundation, Inc. +;; Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc. ;;;; This library is free software; you can redistribute it and/or ;;;; modify it under the terms of the GNU Lesser General Public @@ -33,7 +33,9 @@ (pmatch exps (() (make-void #f)) ((,x) x) - (else (make-sequence #f exps)))) + ((,x . ,rest) + (make-seq #f x (join rest env))) + (else (error "what!" exps env)))) (define-language tree-il #:title "Tree Intermediate Language" diff --git a/module/oop/goops.scm b/module/oop/goops.scm index e4424f382..cd811b3bb 100644 --- a/module/oop/goops.scm +++ b/module/oop/goops.scm @@ -26,54 +26,112 @@ ;;;; (define-module (oop goops) - :use-module (srfi srfi-1) - :export-syntax (define-class class standard-define-class - define-generic define-accessor define-method - define-extended-generic define-extended-generics - method) - :export (is-a? class-of - ensure-metaclass ensure-metaclass-with-supers - make-class - make-generic ensure-generic - make-extended-generic - make-accessor ensure-accessor - add-method! - class-slot-ref class-slot-set! slot-unbound slot-missing - slot-definition-name slot-definition-options - slot-definition-allocation - slot-definition-getter slot-definition-setter - slot-definition-accessor - slot-definition-init-value slot-definition-init-form - slot-definition-init-thunk slot-definition-init-keyword - slot-init-function class-slot-definition - method-source - compute-cpl compute-std-cpl compute-get-n-set compute-slots - compute-getter-method compute-setter-method - allocate-instance initialize make-instance make - no-next-method no-applicable-method no-method - change-class update-instance-for-different-class - shallow-clone deep-clone - class-redefinition - apply-generic apply-method apply-methods - compute-applicable-methods %compute-applicable-methods - method-more-specific? sort-applicable-methods - class-subclasses class-methods - goops-error - min-fixnum max-fixnum - ;;; *fixme* Should go into goops.c - instance? slot-ref-using-class - slot-set-using-class! slot-bound-using-class? - slot-exists-using-class? slot-ref slot-set! slot-bound? - class-name class-direct-supers class-direct-subclasses - class-direct-methods class-direct-slots class-precedence-list - class-slots - generic-function-name - generic-function-methods method-generic-function - method-specializers method-formals - primitive-generic-generic enable-primitive-generic! - method-procedure accessor-method-slot-definition - slot-exists? make find-method get-keyword) - :no-backtrace) + #:use-module (srfi srfi-1) + #:export-syntax (define-class class standard-define-class + define-generic define-accessor define-method + define-extended-generic define-extended-generics + method) + #:export ( ;; The root of everything. + <top> + <class> <object> + + ;; Slot types. + <foreign-slot> <protected-slot> <hidden-slot> <opaque-slot> + <read-only-slot> <self-slot> <protected-opaque-slot> + <protected-hidden-slot> <protected-read-only-slot> + <scm-slot> <int-slot> <float-slot> <double-slot> + + ;; Methods are implementations of generic functions. + <method> <accessor-method> + + ;; Applicable objects, either procedures or applicable structs. + <procedure-class> <applicable> + <procedure> <primitive-generic> + + ;; Applicable structs. + <applicable-struct-class> + <applicable-struct> + <generic> <extended-generic> + <generic-with-setter> <extended-generic-with-setter> + <accessor> <extended-accessor> + + ;; Types with their own allocated typecodes. + <boolean> <char> <list> <pair> <null> <string> <symbol> + <vector> <bytevector> <uvec> <foreign> <hashtable> + <fluid> <dynamic-state> <frame> <objcode> <vm> <vm-continuation> + + ;; Numbers. + <number> <complex> <real> <integer> <fraction> + + ;; Unknown. + <unknown> + + ;; Particular SMOB data types. All SMOB types have + ;; corresponding classes, which may be obtained via class-of, + ;; once you have an instance. Perhaps FIXME to provide a + ;; smob-type-name->class procedure. + <arbiter> <promise> <thread> <mutex> <condition-variable> + <regexp> <hook> <bitvector> <random-state> <async> + <directory> <keyword> <array> <character-set> + <dynamic-object> <guardian> <macro> + + ;; Modules. + <module> + + ;; Ports. + <port> <input-port> <output-port> <input-output-port> + + ;; Like SMOB types, all port types have their own classes, + ;; which can be accessed via `class-of' once you have an + ;; instance. Here we export bindings just for file ports. + <file-port> + <file-input-port> <file-output-port> <file-input-output-port> + + is-a? class-of + ensure-metaclass ensure-metaclass-with-supers + make-class + make-generic ensure-generic + make-extended-generic + make-accessor ensure-accessor + add-method! + class-slot-ref class-slot-set! slot-unbound slot-missing + slot-definition-name slot-definition-options + slot-definition-allocation + + slot-definition-getter slot-definition-setter + slot-definition-accessor + slot-definition-init-value slot-definition-init-form + slot-definition-init-thunk slot-definition-init-keyword + slot-init-function class-slot-definition + method-source + compute-cpl compute-std-cpl compute-get-n-set compute-slots + compute-getter-method compute-setter-method + allocate-instance initialize make-instance make + no-next-method no-applicable-method no-method + change-class update-instance-for-different-class + shallow-clone deep-clone + class-redefinition + apply-generic apply-method apply-methods + compute-applicable-methods %compute-applicable-methods + method-more-specific? sort-applicable-methods + class-subclasses class-methods + goops-error + min-fixnum max-fixnum + +;;; *fixme* Should go into goops.c + instance? slot-ref-using-class + slot-set-using-class! slot-bound-using-class? + slot-exists-using-class? slot-ref slot-set! slot-bound? + class-name class-direct-supers class-direct-subclasses + class-direct-methods class-direct-slots class-precedence-list + class-slots + generic-function-name + generic-function-methods method-generic-function + method-specializers method-formals + primitive-generic-generic enable-primitive-generic! + method-procedure accessor-method-slot-definition + slot-exists? make find-method get-keyword) + #:no-backtrace) (define *goops-module* (current-module)) @@ -97,6 +155,7 @@ (oop goops compile)) +;; FIXME: deprecate. (eval-when (eval load compile) (define min-fixnum (- (expt 2 29))) (define max-fixnum (- (expt 2 29) 1))) @@ -815,6 +874,20 @@ ;;; Handling of duplicate bindings in the module system ;;; +(define (find-subclass super name) + (let lp ((classes (class-direct-subclasses super))) + (cond + ((null? classes) + (error "class not found" name)) + ((and (slot-bound? (car classes) 'name) + (eq? (class-name (car classes)) name)) + (car classes)) + (else + (lp (cdr classes)))))) + +;; A record type. +(define <module> (find-subclass <top> '<module>)) + (define-method (merge-generics (module <module>) (name <symbol>) (int1 <module>) @@ -1660,3 +1733,34 @@ ;; Tell C code that the main bulk of Goops has been loaded (%goops-loaded) + + + + +;;; +;;; {SMOB and port classes} +;;; + +(define <arbiter> (find-subclass <top> '<arbiter>)) +(define <promise> (find-subclass <top> '<promise>)) +(define <thread> (find-subclass <top> '<thread>)) +(define <mutex> (find-subclass <top> '<mutex>)) +(define <condition-variable> (find-subclass <top> '<condition-variable>)) +(define <regexp> (find-subclass <top> '<regexp>)) +(define <hook> (find-subclass <top> '<hook>)) +(define <bitvector> (find-subclass <top> '<bitvector>)) +(define <random-state> (find-subclass <top> '<random-state>)) +(define <async> (find-subclass <top> '<async>)) +(define <directory> (find-subclass <top> '<directory>)) +(define <keyword> (find-subclass <top> '<keyword>)) +(define <array> (find-subclass <top> '<array>)) +(define <character-set> (find-subclass <top> '<character-set>)) +(define <dynamic-object> (find-subclass <top> '<dynamic-object>)) +(define <guardian> (find-subclass <applicable> '<guardian>)) +(define <macro> (find-subclass <top> '<macro>)) + +(define (define-class-subtree class) + (define! (class-name class) class) + (for-each define-class-subtree (class-direct-subclasses class))) + +(define-class-subtree (find-subclass <port> '<file-port>)) diff --git a/module/srfi/srfi-35.scm b/module/srfi/srfi-35.scm index d2b9c9420..8f86bce57 100644 --- a/module/srfi/srfi-35.scm +++ b/module/srfi/srfi-35.scm @@ -48,14 +48,14 @@ ;; The vtable of all condition types. ;; vtable fields: vtable, self, printer ;; user fields: id, parent, all-field-names - (make-vtable-vtable "prprpr" 0 - (lambda (ct port) - (if (eq? ct %condition-type-vtable) - (display "#<condition-type-vtable>") - (format port "#<condition-type ~a ~a>" - (condition-type-id ct) - (number->string (object-address ct) - 16)))))) + (let ((s (make-vtable (string-append standard-vtable-fields "prprpr") + (lambda (ct port) + (format port "#<condition-type ~a ~a>" + (condition-type-id ct) + (number->string (object-address ct) + 16)))))) + (set-struct-vtable-name! s 'condition-type) + s)) (define (%make-condition-type layout id parent all-fields) (let ((struct (make-struct %condition-type-vtable 0 diff --git a/module/system/foreign.scm b/module/system/foreign.scm index 37f9b41ac..e6e965545 100644 --- a/module/system/foreign.scm +++ b/module/system/foreign.scm @@ -192,10 +192,6 @@ which does the reverse. PRINT must name a user-defined object printer." ;; PTR1 == PTR2 <-> (eq? (wrap PTR1) (wrap PTR2)). (let ((ptr->obj (make-weak-value-hash-table 3000))) (lambda (ptr) - ;; XXX: We can't use `hash-create-handle!' + - ;; `set-cdr!' here because the former would create a - ;; weak-cdr pair but the latter wouldn't register a - ;; disappearing link (see `scm_hash_fn_set_x'.) (or (hash-ref ptr->obj ptr) (let ((o (%wrap ptr))) (hash-set! ptr->obj ptr o) diff --git a/test-suite/standalone/test-num2integral.c b/test-suite/standalone/test-num2integral.c index 6a44fb75a..d210a1982 100644 --- a/test-suite/standalone/test-num2integral.c +++ b/test-suite/standalone/test-num2integral.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1999,2000,2001,2003,2004, 2006, 2008, 2010 Free Software Foundation, Inc. +/* Copyright (C) 1999,2000,2001,2003,2004, 2006, 2008, 2010, 2011 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -24,6 +24,7 @@ #include <stdio.h> #include <assert.h> +#include <limits.h> SCM out_of_range_handler (void *data, SCM key, SCM args); SCM call_num2long_long_body (void *data); @@ -33,7 +34,8 @@ SCM call_num2ulong_long_body (void *data); SCM out_of_range_handler (void *data, SCM key, SCM args) { - assert (scm_equal_p (key, scm_from_locale_symbol ("out-of-range"))); + assert (scm_is_true + (scm_equal_p (key, scm_from_locale_symbol ("out-of-range")))); return SCM_BOOL_T; } @@ -55,14 +57,14 @@ static void test_long_long () { { - SCM n = scm_from_long_long (SCM_I_LLONG_MIN); + SCM n = scm_from_long_long (LLONG_MIN); long long result = scm_to_long_long(n); - assert (result == SCM_I_LLONG_MIN); + assert (result == LLONG_MIN); } /* LLONG_MIN - 1 */ { - SCM n = scm_difference (scm_from_long_long (SCM_I_LLONG_MIN), scm_from_int (1)); + SCM n = scm_difference (scm_from_long_long (LLONG_MIN), scm_from_int (1)); SCM caught = scm_internal_catch (SCM_BOOL_T, call_num2long_long_body, &n, out_of_range_handler, NULL); assert (scm_is_true (caught)); @@ -70,8 +72,8 @@ test_long_long () /* SCM_I_LLONG_MIN + SCM_I_LLONG_MIN/2 */ { - SCM n = scm_sum (scm_from_long_long (SCM_I_LLONG_MIN), - scm_from_long_long (SCM_I_LLONG_MIN / 2)); + SCM n = scm_sum (scm_from_long_long (LLONG_MIN), + scm_from_long_long (LLONG_MIN / 2)); SCM caught = scm_internal_catch (SCM_BOOL_T, call_num2long_long_body, &n, out_of_range_handler, NULL); assert (scm_is_true (caught)); @@ -79,7 +81,7 @@ test_long_long () /* SCM_I_LLONG_MAX + 1 */ { - SCM n = scm_sum (scm_from_long_long (SCM_I_LLONG_MAX), scm_from_int (1)); + SCM n = scm_sum (scm_from_long_long (LLONG_MAX), scm_from_int (1)); SCM caught = scm_internal_catch (SCM_BOOL_T, call_num2long_long_body, &n, out_of_range_handler, NULL); assert (scm_is_true (caught)); @@ -107,9 +109,9 @@ static void test_ulong_long () { { - SCM n = scm_from_ulong_long (SCM_I_ULLONG_MAX); + SCM n = scm_from_ulong_long (ULLONG_MAX); unsigned long long result = scm_to_ulong_long(n); - assert (result == SCM_I_ULLONG_MAX); + assert (result == ULLONG_MAX); } /* -1 */ @@ -122,7 +124,7 @@ test_ulong_long () /* SCM_I_ULLONG_MAX + 1 */ { - SCM n = scm_sum (scm_from_ulong_long (SCM_I_ULLONG_MAX), scm_from_int (1)); + SCM n = scm_sum (scm_from_ulong_long (ULLONG_MAX), scm_from_int (1)); SCM caught = scm_internal_catch (SCM_BOOL_T, call_num2ulong_long_body, &n, out_of_range_handler, NULL); assert (scm_is_true (caught)); diff --git a/test-suite/standalone/test-scm-spawn-thread.c b/test-suite/standalone/test-scm-spawn-thread.c index b632ab0fe..aa790cdbb 100644 --- a/test-suite/standalone/test-scm-spawn-thread.c +++ b/test-suite/standalone/test-scm-spawn-thread.c @@ -48,7 +48,7 @@ inner_main (void *data) thread = scm_spawn_thread (thread_main, 0, thread_handler, 0); timeout = scm_from_unsigned_integer (time (NULL) + 10); - return (void *) scm_join_thread_timed (thread, timeout, SCM_BOOL_F); + return SCM2PTR (scm_join_thread_timed (thread, timeout, SCM_BOOL_F)); } diff --git a/test-suite/tests/r6rs-records-syntactic.test b/test-suite/tests/r6rs-records-syntactic.test index 9f9d37368..edc88aa72 100644 --- a/test-suite/tests/r6rs-records-syntactic.test +++ b/test-suite/tests/r6rs-records-syntactic.test @@ -30,12 +30,14 @@ (define-record-type simple-rtd) (define-record-type (specified-rtd specified-rtd-constructor specified-rtd-predicate)) -(define-record-type parent-rtd (fields x y)) +;; Can't be named as `parent-rtd', as that shadows the `parent-rtd' +;; literal. +(define-record-type *parent-rtd (fields x y)) (define-record-type child-parent-rtd-rtd - (parent-rtd (record-type-descriptor parent-rtd) - (record-constructor-descriptor parent-rtd)) + (parent-rtd (record-type-descriptor *parent-rtd) + (record-constructor-descriptor *parent-rtd)) (fields z)) -(define-record-type child-parent-rtd (parent parent-rtd) (fields z)) +(define-record-type child-parent-rtd (parent *parent-rtd) (fields z)) (define-record-type mutable-fields-rtd (fields (mutable mutable-bar) (mutable mutable-baz mutable-baz-accessor mutable-baz-mutator))) @@ -69,10 +71,10 @@ (defined? 'specified-rtd-constructor))) (pass-if "parent-rtd clause includes specified parent" - (eq? (record-type-parent child-parent-rtd-rtd) parent-rtd)) + (eq? (record-type-parent child-parent-rtd-rtd) *parent-rtd)) (pass-if "parent clause includes specified parent" - (eq? (record-type-parent child-parent-rtd) parent-rtd)) + (eq? (record-type-parent child-parent-rtd) *parent-rtd)) (pass-if "protocol clause includes specified protocol" (let ((protocol-record (make-protocol-rtd 1 2))) diff --git a/test-suite/tests/regexp.test b/test-suite/tests/regexp.test index f405df493..832542edc 100644 --- a/test-suite/tests/regexp.test +++ b/test-suite/tests/regexp.test @@ -145,6 +145,8 @@ (with-latin1-locale body ...) (begin body ...))))) +(define char-code-limit 256) + (with-test-prefix "regexp-quote" (pass-if-exception "no args" exception:wrong-num-args diff --git a/test-suite/tests/syntax.test b/test-suite/tests/syntax.test index f6eb28a67..f53d196d5 100644 --- a/test-suite/tests/syntax.test +++ b/test-suite/tests/syntax.test @@ -795,7 +795,73 @@ (pass-if-syntax-error "(define)" exception:generic-syncase-error (eval '(define) - (interaction-environment))))) + (interaction-environment)))) + + (pass-if "module scoping" + (equal? + (eval + '(begin + (define-module (top-level-define/module-scoping-1) + #:export (define-10)) + (define-syntax-rule (define-10 name) + (begin + (define t 10) + (define (name) t))) + (define-module (top-level-define/module-scoping-2) + #:use-module (top-level-define/module-scoping-1)) + (define-10 foo) + (foo)) + (current-module)) + 10)) + + (pass-if "module scoping, same symbolic name" + (equal? + (eval + '(begin + (define-module (top-level-define/module-scoping-3)) + (define a 10) + (define-module (top-level-define/module-scoping-4) + #:use-module (top-level-define/module-scoping-3)) + (define a (@@ (top-level-define/module-scoping-3) a)) + a) + (current-module)) + 10)) + + (pass-if "module scoping, introduced names" + (equal? + (eval + '(begin + (define-module (top-level-define/module-scoping-5) + #:export (define-constant)) + (define-syntax-rule (define-constant name val) + (begin + (define t val) + (define (name) t))) + (define-module (top-level-define/module-scoping-6) + #:use-module (top-level-define/module-scoping-5)) + (define-constant foo 10) + (define-constant bar 20) + (foo)) + (current-module)) + 10)) + + (pass-if "module scoping, duplicate introduced name" + (equal? + (eval + '(begin + (define-module (top-level-define/module-scoping-7) + #:export (define-constant)) + (define-syntax-rule (define-constant name val) + (begin + (define t val) + (define (name) t))) + (define-module (top-level-define/module-scoping-8) + #:use-module (top-level-define/module-scoping-7)) + (define-constant foo 10) + (define-constant foo 20) + (foo)) + (current-module)) + 20))) (with-test-prefix "internal define" diff --git a/test-suite/tests/tree-il.test b/test-suite/tests/tree-il.test index 5e02bd175..8d125f52b 100644 --- a/test-suite/tests/tree-il.test +++ b/test-suite/tests/tree-il.test @@ -74,12 +74,9 @@ (@@ (language tree-il optimize) peval)) (define-syntax pass-if-peval - (syntax-rules (resolve-primitives) + (syntax-rules () ((_ in pat) (pass-if-peval in pat - (compile 'in #:from 'scheme #:to 'tree-il))) - ((_ resolve-primitives in pat) - (pass-if-peval in pat (expand-primitives! (resolve-primitives! (compile 'in #:from 'scheme #:to 'tree-il) @@ -116,15 +113,15 @@ (begin (void) (const 1)) (program () (std-prelude 0 0 #f) (label _) (const 1) (call return 1))) (assert-tree-il->glil - (apply (primitive +) (void) (const 1)) + (primcall + (void) (const 1)) (program () (std-prelude 0 0 #f) (label _) (void) (call add1 1) (call return 1)))) (with-test-prefix "application" (assert-tree-il->glil - (apply (toplevel foo) (const 1)) + (call (toplevel foo) (const 1)) (program () (std-prelude 0 0 #f) (label _) (toplevel ref foo) (const 1) (call tail-call 1))) (assert-tree-il->glil - (begin (apply (toplevel foo) (const 1)) (void)) + (begin (call (toplevel foo) (const 1)) (void)) (program () (std-prelude 0 0 #f) (label _) (call new-frame 0) (toplevel ref foo) (const 1) (mv-call 1 ,l1) (call drop 1) (branch br ,l2) (label ,l3) (mv-bind 0 #f) @@ -132,7 +129,7 @@ (void) (call return 1)) (and (eq? l1 l3) (eq? l2 l4))) (assert-tree-il->glil - (apply (toplevel foo) (apply (toplevel bar))) + (call (toplevel foo) (call (toplevel bar))) (program () (std-prelude 0 0 #f) (label _) (toplevel ref foo) (call new-frame 0) (toplevel ref bar) (call call 0) (call tail-call 1)))) @@ -151,7 +148,7 @@ (eq? l1 l3) (eq? l2 l4)) (assert-tree-il->glil - (apply (primitive null?) (if (toplevel foo) (const 1) (const 2))) + (primcall null? (if (toplevel foo) (const 1) (const 2))) (program () (std-prelude 0 0 #f) (label _) (toplevel ref foo) (branch br-if-not ,l1) (const 1) (branch br ,l2) (label ,l3) (const 2) (label ,l4) @@ -168,7 +165,7 @@ (program () (std-prelude 0 0 #f) (label _) (const #f) (call return 1))) (assert-tree-il->glil - (apply (primitive null?) (primitive +)) + (primcall null? (primitive +)) (program () (std-prelude 0 0 #f) (label _) (toplevel ref +) (call null? 1) (call return 1)))) @@ -188,7 +185,7 @@ (unbind))) (assert-tree-il->glil without-partial-evaluation - (let (x) (y) ((const 1)) (apply (primitive null?) (lexical x y))) + (let (x) (y) ((const 1)) (primcall null? (lexical x y))) (program () (std-prelude 0 1 #f) (label _) (const 1) (bind (x #f 0)) (lexical #t #f set 0) (lexical #t #f ref 0) (call null? 1) (call return 1) @@ -198,7 +195,7 @@ (assert-tree-il->glil ;; unreferenced sets may be optimized away -- make sure they are ref'd (let (x) (y) ((const 1)) - (set! (lexical x y) (apply (primitive 1+) (lexical x y)))) + (set! (lexical x y) (primcall 1+ (lexical x y)))) (program () (std-prelude 0 1 #f) (label _) (const 1) (bind (x #t 0)) (lexical #t #t box 0) (lexical #t #t ref 0) (call add1 1) (lexical #t #t set 0) @@ -207,7 +204,7 @@ (assert-tree-il->glil (let (x) (y) ((const 1)) - (begin (set! (lexical x y) (apply (primitive 1+) (lexical x y))) + (begin (set! (lexical x y) (primcall 1+ (lexical x y))) (lexical x y))) (program () (std-prelude 0 1 #f) (label _) (const 1) (bind (x #t 0)) (lexical #t #t box 0) @@ -217,8 +214,8 @@ (assert-tree-il->glil (let (x) (y) ((const 1)) - (apply (primitive null?) - (set! (lexical x y) (apply (primitive 1+) (lexical x y))))) + (primcall null? + (set! (lexical x y) (primcall 1+ (lexical x y))))) (program () (std-prelude 0 1 #f) (label _) (const 1) (bind (x #t 0)) (lexical #t #t box 0) (lexical #t #t ref 0) (call add1 1) (lexical #t #t set 0) (void) @@ -239,7 +236,7 @@ (const #f) (call return 1))) (assert-tree-il->glil - (apply (primitive null?) (@ (foo) bar)) + (primcall null? (@ (foo) bar)) (program () (std-prelude 0 0 #f) (label _) (module public ref (foo) bar) (call null? 1) (call return 1))) @@ -257,7 +254,7 @@ (const #f) (call return 1))) (assert-tree-il->glil - (apply (primitive null?) (@@ (foo) bar)) + (primcall null? (@@ (foo) bar)) (program () (std-prelude 0 0 #f) (label _) (module private ref (foo) bar) (call null? 1) (call return 1)))) @@ -276,7 +273,7 @@ (const #f) (call return 1))) (assert-tree-il->glil - (apply (primitive null?) (set! (@ (foo) bar) (const 2))) + (primcall null? (set! (@ (foo) bar) (const 2))) (program () (std-prelude 0 0 #f) (label _) (const 2) (module public set (foo) bar) (void) (call null? 1) (call return 1))) @@ -294,7 +291,7 @@ (const #f) (call return 1))) (assert-tree-il->glil - (apply (primitive null?) (set! (@@ (foo) bar) (const 2))) + (primcall null? (set! (@@ (foo) bar) (const 2))) (program () (std-prelude 0 0 #f) (label _) (const 2) (module private set (foo) bar) (void) (call null? 1) (call return 1)))) @@ -313,7 +310,7 @@ (const #f) (call return 1))) (assert-tree-il->glil - (apply (primitive null?) (toplevel bar)) + (primcall null? (toplevel bar)) (program () (std-prelude 0 0 #f) (label _) (toplevel ref bar) (call null? 1) (call return 1)))) @@ -332,7 +329,7 @@ (const #f) (call return 1))) (assert-tree-il->glil - (apply (primitive null?) (set! (toplevel bar) (const 2))) + (primcall null? (set! (toplevel bar) (const 2))) (program () (std-prelude 0 0 #f) (label _) (const 2) (toplevel set bar) (void) (call null? 1) (call return 1)))) @@ -351,7 +348,7 @@ (const #f) (call return 1))) (assert-tree-il->glil - (apply (primitive null?) (define bar (const 2))) + (primcall null? (define bar (const 2))) (program () (std-prelude 0 0 #f) (label _) (const 2) (toplevel define bar) (void) (call null? 1) (call return 1)))) @@ -369,7 +366,7 @@ (assert-tree-il->glil ;; This gets simplified by `peval'. - (apply (primitive null?) (const 2)) + (primcall null? (const 2)) (program () (std-prelude 0 0 #f) (label _) (const #f) (call return 1)))) @@ -377,7 +374,7 @@ ;; simple bindings -> let (assert-tree-il->glil without-partial-evaluation (letrec (x y) (x1 y1) ((const 10) (const 20)) - (apply (toplevel foo) (lexical x x1) (lexical y y1))) + (call (toplevel foo) (lexical x x1) (lexical y y1))) (program () (std-prelude 0 2 #f) (label _) (const 10) (const 20) (bind (x #f 0) (y #f 1)) @@ -389,8 +386,8 @@ ;; complex bindings -> box and set! within let (assert-tree-il->glil without-partial-evaluation - (letrec (x y) (x1 y1) ((apply (toplevel foo)) (apply (toplevel bar))) - (apply (primitive +) (lexical x x1) (lexical y y1))) + (letrec (x y) (x1 y1) ((call (toplevel foo)) (call (toplevel bar))) + (primcall + (lexical x x1) (lexical y y1))) (program () (std-prelude 0 4 #f) (label _) (void) (void) ;; what are these? (bind (x #t 0) (y #t 1)) @@ -407,8 +404,8 @@ ;; complex bindings in letrec* -> box and set! in order (assert-tree-il->glil without-partial-evaluation - (letrec* (x y) (x1 y1) ((apply (toplevel foo)) (apply (toplevel bar))) - (apply (primitive +) (lexical x x1) (lexical y y1))) + (letrec* (x y) (x1 y1) ((call (toplevel foo)) (call (toplevel bar))) + (primcall + (lexical x x1) (lexical y y1))) (program () (std-prelude 0 2 #f) (label _) (void) (void) ;; what are these? (bind (x #t 0) (y #t 1)) @@ -527,27 +524,27 @@ (assert-tree-il->glil ;; This gets simplified by `peval'. - (apply (primitive null?) (begin (const #f) (const 2))) + (primcall null? (begin (const #f) (const 2))) (program () (std-prelude 0 0 #f) (label _) (const #f) (call return 1)))) (with-test-prefix "values" (assert-tree-il->glil - (apply (primitive values) - (apply (primitive values) (const 1) (const 2))) + (primcall values + (primcall values (const 1) (const 2))) (program () (std-prelude 0 0 #f) (label _) (const 1) (call return 1))) (assert-tree-il->glil - (apply (primitive values) - (apply (primitive values) (const 1) (const 2)) - (const 3)) + (primcall values + (primcall values (const 1) (const 2)) + (const 3)) (program () (std-prelude 0 0 #f) (label _) (const 1) (const 3) (call return/values 2))) (assert-tree-il->glil - (apply (primitive +) - (apply (primitive values) (const 1) (const 2))) + (primcall + + (primcall values (const 1) (const 2))) (program () (std-prelude 0 0 #f) (label _) (const 1) (call return 1)))) @@ -589,10 +586,10 @@ (with-test-prefix "apply" (assert-tree-il->glil - (apply (primitive @apply) (toplevel foo) (toplevel bar)) + (primcall @apply (toplevel foo) (toplevel bar)) (program () (std-prelude 0 0 #f) (label _) (toplevel ref foo) (toplevel ref bar) (call tail-apply 2))) (assert-tree-il->glil - (begin (apply (primitive @apply) (toplevel foo) (toplevel bar)) (void)) + (begin (primcall @apply (toplevel foo) (toplevel bar)) (void)) (program () (std-prelude 0 0 #f) (label _) (call new-frame 0) (toplevel ref apply) (toplevel ref foo) (toplevel ref bar) (mv-call 2 ,l1) (call drop 1) (branch br ,l2) (label ,l3) (mv-bind 0 #f) @@ -600,7 +597,7 @@ (void) (call return 1)) (and (eq? l1 l3) (eq? l2 l4))) (assert-tree-il->glil - (apply (toplevel foo) (apply (toplevel @apply) (toplevel bar) (toplevel baz))) + (call (toplevel foo) (call (toplevel @apply) (toplevel bar) (toplevel baz))) (program () (std-prelude 0 0 #f) (label _) (toplevel ref foo) (call new-frame 0) (toplevel ref bar) (toplevel ref baz) (call apply 2) @@ -608,10 +605,10 @@ (with-test-prefix "call/cc" (assert-tree-il->glil - (apply (primitive @call-with-current-continuation) (toplevel foo)) + (primcall @call-with-current-continuation (toplevel foo)) (program () (std-prelude 0 0 #f) (label _) (toplevel ref foo) (call tail-call/cc 1))) (assert-tree-il->glil - (begin (apply (primitive @call-with-current-continuation) (toplevel foo)) (void)) + (begin (primcall @call-with-current-continuation (toplevel foo)) (void)) (program () (std-prelude 0 0 #f) (label _) (call new-frame 0) (toplevel ref call-with-current-continuation) (toplevel ref foo) (mv-call 1 ,l1) (call drop 1) (branch br ,l2) (label ,l3) (mv-bind 0 #f) @@ -619,8 +616,8 @@ (void) (call return 1)) (and (eq? l1 l3) (eq? l2 l4))) (assert-tree-il->glil - (apply (toplevel foo) - (apply (toplevel @call-with-current-continuation) (toplevel bar))) + (call (toplevel foo) + (call (toplevel @call-with-current-continuation) (toplevel bar))) (program () (std-prelude 0 0 #f) (label _) (toplevel ref foo) (toplevel ref bar) (call call/cc 1) @@ -654,7 +651,7 @@ (f))) (const 3)) - (pass-if-peval resolve-primitives + (pass-if-peval ;; First order, let-values (requires primitive expansion for ;; `call-with-values'.) (let ((x 0)) @@ -667,23 +664,23 @@ (pass-if-peval ;; First order, coalesced, mutability preserved. (cons 0 (cons 1 (cons 2 (list 3 4 5)))) - (apply (primitive list) - (const 0) (const 1) (const 2) (const 3) (const 4) (const 5))) + (primcall list + (const 0) (const 1) (const 2) (const 3) (const 4) (const 5))) (pass-if-peval ;; First order, coalesced, mutability preserved. (cons 0 (cons 1 (cons 2 (list 3 4 5)))) ;; This must not be a constant. - (apply (primitive list) - (const 0) (const 1) (const 2) (const 3) (const 4) (const 5))) + (primcall list + (const 0) (const 1) (const 2) (const 3) (const 4) (const 5))) (pass-if-peval ;; First order, coalesced, immutability preserved. (cons 0 (cons 1 (cons 2 '(3 4 5)))) - (apply (primitive cons) (const 0) - (apply (primitive cons) (const 1) - (apply (primitive cons) (const 2) - (const (3 4 5)))))) + (primcall cons (const 0) + (primcall cons (const 1) + (primcall cons (const 2) + (const (3 4 5)))))) ;; These two tests doesn't work any more because we changed the way we ;; deal with constants -- now the algorithm will see a construction as @@ -708,10 +705,10 @@ (if (zero? i) r (loop (1- i) (cons (cons i i) r)))) - (apply (primitive list) - (apply (primitive cons) (const 1) (const 1)) - (apply (primitive cons) (const 2) (const 2)) - (apply (primitive cons) (const 3) (const 3)))) + (primcall list + (primcall cons (const 1) (const 1)) + (primcall cons (const 2) (const 2)) + (primcall cons (const 3) (const 3)))) ;; ;; See above. #; @@ -732,15 +729,15 @@ r (loop (1- i) (cons (cons i i) r)))) (let (r) (_) - ((apply (primitive list) - (apply (primitive cons) (const 3) (const 3)))) + ((primcall list + (primcall cons (const 3) (const 3)))) (let (r) (_) - ((apply (primitive cons) - (apply (primitive cons) (const 2) (const 2)) - (lexical r _))) - (apply (primitive cons) - (apply (primitive cons) (const 1) (const 1)) - (lexical r _))))) + ((primcall cons + (primcall cons (const 2) (const 2)) + (lexical r _))) + (primcall cons + (primcall cons (const 1) (const 1)) + (lexical r _))))) ;; See above. (pass-if-peval @@ -750,21 +747,21 @@ (car r) (loop (1- i) (cons i r)))) (let (r) (_) - ((apply (primitive list) (const 4))) + ((primcall list (const 4))) (let (r) (_) - ((apply (primitive cons) - (const 3) - (lexical r _))) + ((primcall cons + (const 3) + (lexical r _))) (let (r) (_) - ((apply (primitive cons) - (const 2) - (lexical r _))) + ((primcall cons + (const 2) + (lexical r _))) (let (r) (_) - ((apply (primitive cons) - (const 1) - (lexical r _))) - (apply (primitive car) - (lexical r _))))))) + ((primcall cons + (const 1) + (lexical r _))) + (primcall car + (lexical r _))))))) ;; Static sums. (pass-if-peval @@ -774,7 +771,7 @@ (loop (cdr l) (+ sum (car l))))) (const 10)) - (pass-if-peval resolve-primitives + (pass-if-peval (let ((string->chars (lambda (s) (define (char-at n) @@ -787,7 +784,7 @@ (loop (1+ i))) '()))))) (string->chars "yo")) - (apply (primitive list) (const #\y) (const #\o))) + (primcall list (const #\y) (const #\o))) (pass-if-peval ;; Primitives in module-refs are resolved (the expansion of `pmatch' @@ -798,14 +795,13 @@ (pmatch '(a b c d) ((a b . _) #t))) - (begin - (apply . _) - (const #t))) + (seq (call . _) + (const #t))) (pass-if-peval ;; Mutability preserved. ((lambda (x y z) (list x y z)) 1 2 3) - (apply (primitive list) (const 1) (const 2) (const 3))) + (primcall list (const 1) (const 2) (const 3))) (pass-if-peval ;; Don't propagate effect-free expressions that operate on mutable @@ -814,10 +810,10 @@ (y (car x))) (set-car! x 0) y) - (let (x) (_) ((apply (primitive list) (const 1))) - (let (y) (_) ((apply (primitive car) (lexical x _))) - (begin - (apply (toplevel set-car!) (lexical x _) (const 0)) + (let (x) (_) ((primcall list (const 1))) + (let (y) (_) ((primcall car (lexical x _))) + (seq + (primcall set-car! (lexical x _) (const 0)) (lexical y _))))) (pass-if-peval @@ -826,9 +822,9 @@ (let ((y (car x))) (set-car! x 0) y) - (let (y) (_) ((apply (primitive car) (toplevel x))) - (begin - (apply (toplevel set-car!) (toplevel x) (const 0)) + (let (y) (_) ((primcall car (toplevel x))) + (seq + (primcall set-car! (toplevel x) (const 0)) (lexical y _)))) (pass-if-peval @@ -838,8 +834,8 @@ ((lambda _ (lambda-case (((x) _ _ _ _ _) - (apply (lexical x _) (lexical x _)))))) - (apply (lexical x _) (lexical x _)))) + (call (lexical x _) (lexical x _)))))) + (call (lexical x _) (lexical x _)))) (pass-if-peval ;; First order, aliased primitive. @@ -851,28 +847,28 @@ (begin (define (+ x y) (pk x y)) (+ 1 2)) - (begin + (seq (define + (lambda (_) (lambda-case (((x y) #f #f #f () (_ _)) - (apply (toplevel pk) (lexical x _) (lexical y _)))))) - (apply (toplevel +) (const 1) (const 2)))) + (call (toplevel pk) (lexical x _) (lexical y _)))))) + (call (toplevel +) (const 1) (const 2)))) (pass-if-peval ;; First-order, effects preserved. (let ((x 2)) (do-something!) x) - (begin - (apply (toplevel do-something!)) + (seq + (call (toplevel do-something!)) (const 2))) (pass-if-peval ;; First order, residual bindings removed. (let ((x 2) (y 3)) (* (+ x y) z)) - (apply (primitive *) (const 5) (toplevel z))) + (primcall * (const 5) (toplevel z))) (pass-if-peval ;; First order, with lambda. @@ -883,7 +879,7 @@ (lambda (_) (lambda-case (((x) #f #f #f () (_)) - (apply (primitive +) (lexical x _) (const 9))))))) + (primcall + (lexical x _) (const 9))))))) (pass-if-peval ;; First order, with lambda inlined & specialized twice. @@ -893,22 +889,22 @@ (y 3)) (+ (* x (f x y)) (f something x))) - (apply (primitive +) - (apply (primitive *) - (const 2) - (apply (primitive +) ; (f 2 3) - (apply (primitive *) - (const 2) - (toplevel top)) - (const 3))) - (let (x) (_) ((toplevel something)) ; (f something 2) - ;; `something' is not const, so preserve order of - ;; effects with a lexical binding. - (apply (primitive +) - (apply (primitive *) - (lexical x _) - (toplevel top)) - (const 2))))) + (primcall + + (primcall * + (const 2) + (primcall + ; (f 2 3) + (primcall * + (const 2) + (toplevel top)) + (const 3))) + (let (x) (_) ((toplevel something)) ; (f something 2) + ;; `something' is not const, so preserve order of + ;; effects with a lexical binding. + (primcall + + (primcall * + (lexical x _) + (toplevel top)) + (const 2))))) (pass-if-peval ;; First order, with lambda inlined & specialized 3 times. @@ -918,15 +914,22 @@ (f -1 y) (f 2 y) (f z y))) - (apply (primitive +) - (const -1) ; (f -1 0) - (const 0) ; (f 1 0) - (begin (toplevel y) (const -1)) ; (f -1 y) - (toplevel y) ; (f 2 y) - (let (x y) (_ _) ((toplevel z) (toplevel y)) ; (f z y) - (if (apply (primitive >) (lexical x _) (const 0)) - (lexical y _) - (lexical x _))))) + (primcall + + + (const -1) ; (f -1 0) + (primcall + + + (const 0) ; (f 1 0) + (primcall + + + (seq (toplevel y) (const -1)) ; (f -1 y) + (primcall + + + (toplevel y) ; (f 2 y) + (let (x y) (_ _) ((toplevel z) (toplevel y)) ; (f z y) + (if (primcall > (lexical x _) (const 0)) + (lexical y _) + (lexical x _)))))))) (pass-if-peval ;; First order, conditional. @@ -938,7 +941,7 @@ (lambda () (lambda-case (((x) #f #f #f () (_)) - (apply (toplevel display) (lexical x _)))))) + (call (toplevel display) (lexical x _)))))) (pass-if-peval ;; First order, recursive procedure. @@ -957,8 +960,8 @@ (foo) x) (let (x) (_) ((toplevel top)) - (begin - (apply (toplevel foo)) + (seq + (call (toplevel foo)) (lexical x _)))) (pass-if-peval @@ -997,8 +1000,8 @@ (lambda (x) (+ x 1)) '(2 3)) - (let (y) (_) ((apply (toplevel foo))) - (apply (primitive +) (lexical y _) (const 7)))) + (let (y) (_) ((call (toplevel foo))) + (primcall + (lexical y _) (const 7)))) (pass-if-peval ;; Higher order with optional argument (caller-supplied value). @@ -1020,7 +1023,7 @@ ;; <https://lists.gnu.org/archive/html/bug-guile/2011-09/msg00019.html>. (let ((fold (lambda (f g) (f (g top))))) (fold 1+ (lambda (x) x))) - (apply (primitive 1+) (toplevel top))) + (primcall 1+ (toplevel top))) (pass-if-peval ;; Procedure not inlined when residual code contains recursive calls. @@ -1031,7 +1034,7 @@ (f (car x3) (fold f (cdr x3) b null? car cdr)))))) (fold * x 1 zero? (lambda (x1) x1) (lambda (x2) (- x2 1)))) (letrec (fold) (_) (_) - (apply (lexical fold _) + (call (lexical fold _) (primitive *) (toplevel x) (const 1) @@ -1043,7 +1046,7 @@ (lambda () (lambda-case (((x2) #f #f #f () (_)) - (apply (primitive -) (lexical x2 _) (const 1)))))))) + (primcall 1- (lexical x2 _)))))))) (pass-if "inlined lambdas are alpha-renamed" ;; In this example, `make-adder' is inlined more than once; thus, @@ -1054,24 +1057,27 @@ ;; <https://lists.gnu.org/archive/html/bug-guile/2011-09/msg00019.html> and ;; <https://lists.gnu.org/archive/html/bug-guile/2011-09/msg00029.html>. (pmatch (unparse-tree-il - (peval (compile - '(let ((make-adder - (lambda (x) (lambda (y) (+ x y))))) - (cons (make-adder 1) (make-adder 2))) - #:to 'tree-il))) - ((apply (primitive cons) - (lambda () - (lambda-case - (((y) #f #f #f () (,gensym1)) - (apply (primitive +) - (const 1) - (lexical y ,ref1))))) - (lambda () - (lambda-case - (((y) #f #f #f () (,gensym2)) - (apply (primitive +) - (const 2) - (lexical y ,ref2)))))) + (peval (expand-primitives! + (resolve-primitives! + (compile + '(let ((make-adder + (lambda (x) (lambda (y) (+ x y))))) + (cons (make-adder 1) (make-adder 2))) + #:to 'tree-il) + (current-module))))) + ((primcall cons + (lambda () + (lambda-case + (((y) #f #f #f () (,gensym1)) + (primcall + + (const 1) + (lexical y ,ref1))))) + (lambda () + (lambda-case + (((y) #f #f #f () (,gensym2)) + (primcall + + (const 2) + (lexical y ,ref2)))))) (and (eq? gensym1 ref1) (eq? gensym2 ref2) (not (eq? gensym1 gensym2)))) @@ -1091,8 +1097,8 @@ (b (lambda () (a))) (c (lambda (x) x))) (c 10)) - (begin (apply (toplevel foo!)) - (const 10))) + (seq (call (toplevel foo!)) + (const 10))) (pass-if-peval ;; Higher order, mutually recursive procedures. @@ -1113,9 +1119,9 @@ ;; Memv with non-constant list. It could fold but doesn't ;; currently. (memv 1 (list 3 2 1)) - (apply (primitive memv) - (const 1) - (apply (primitive list) (const 3) (const 2) (const 1)))) + (primcall memv + (const 1) + (primcall list (const 3) (const 2) (const 1)))) (pass-if-peval ;; Memv with non-constant key, constant list, test context @@ -1123,11 +1129,11 @@ ((3 2 1) 'a) (else 'b)) (if (let (t) (_) ((toplevel foo)) - (if (apply (primitive eqv?) (lexical t _) (const 3)) + (if (primcall eqv? (lexical t _) (const 3)) (const #t) - (if (apply (primitive eqv?) (lexical t _) (const 2)) + (if (primcall eqv? (lexical t _) (const 2)) (const #t) - (apply (primitive eqv?) (lexical t _) (const 1))))) + (primcall eqv? (lexical t _) (const 1))))) (const a) (const b))) @@ -1137,7 +1143,7 @@ (case foo (() 'a) (else 'b)) - (if (begin (toplevel foo) (const #f)) + (if (seq (toplevel foo) (const #f)) (const a) (const b))) @@ -1151,12 +1157,12 @@ (lambda (n) (vector-set! v n n))) (let (v) (_) - ((apply (toplevel make-vector) (const 6) (const #f))) + ((call (toplevel make-vector) (const 6) (const #f))) (lambda () (lambda-case (((n) #f #f #f () (_)) - (apply (toplevel vector-set!) - (lexical v _) (lexical n _) (lexical n _))))))) + (primcall vector-set! + (lexical v _) (lexical n _) (lexical n _))))))) (pass-if-peval ;; Mutable lexical is not propagated. @@ -1164,7 +1170,7 @@ (lambda () v)) (let (v) (_) - ((apply (primitive vector) (const 1) (const 2) (const 3))) + ((primcall vector (const 1) (const 2) (const 3))) (lambda () (lambda-case ((() #f #f #f () ()) @@ -1175,12 +1181,13 @@ (let* ((x (if (> p q) (frob!) (display 'chbouib))) (y (* x 2))) (+ x x y)) - (let (x) (_) ((if (apply (primitive >) (toplevel p) (toplevel q)) - (apply (toplevel frob!)) - (apply (toplevel display) (const chbouib)))) - (let (y) (_) ((apply (primitive *) (lexical x _) (const 2))) - (apply (primitive +) - (lexical x _) (lexical x _) (lexical y _))))) + (let (x) (_) ((if (primcall > (toplevel p) (toplevel q)) + (call (toplevel frob!)) + (call (toplevel display) (const chbouib)))) + (let (y) (_) ((primcall * (lexical x _) (const 2))) + (primcall + + (lexical x _) + (primcall + (lexical x _) (lexical y _)))))) (pass-if-peval ;; Non-constant arguments not propagated to lambdas. @@ -1192,16 +1199,16 @@ (make-list 10) (list 1 2 3)) (let (x y z) (_ _ _) - ((apply (primitive vector) (const 1) (const 2) (const 3)) - (apply (toplevel make-list) (const 10)) - (apply (primitive list) (const 1) (const 2) (const 3))) - (begin - (apply (toplevel vector-set!) - (lexical x _) (const 0) (const 0)) - (apply (toplevel set-car!) - (lexical y _) (const 0)) - (apply (toplevel set-cdr!) - (lexical z _) (const ()))))) + ((primcall vector (const 1) (const 2) (const 3)) + (call (toplevel make-list) (const 10)) + (primcall list (const 1) (const 2) (const 3))) + (seq + (primcall vector-set! + (lexical x _) (const 0) (const 0)) + (seq (primcall set-car! + (lexical y _) (const 0)) + (primcall set-cdr! + (lexical z _) (const ())))))) (pass-if-peval (let ((foo top-foo) (bar top-bar)) @@ -1209,9 +1216,9 @@ (f (lambda (g x) (g x x)))) (+ (f g foo) (f g bar)))) (let (foo bar) (_ _) ((toplevel top-foo) (toplevel top-bar)) - (apply (primitive +) - (apply (primitive +) (lexical foo _) (lexical foo _)) - (apply (primitive +) (lexical bar _) (lexical bar _))))) + (primcall + + (primcall + (lexical foo _) (lexical foo _)) + (primcall + (lexical bar _) (lexical bar _))))) (pass-if-peval ;; Fresh objects are not turned into constants, nor are constants @@ -1220,8 +1227,8 @@ (x (cons 1 c)) (y (cons 0 x))) y) - (let (x) (_) ((apply (primitive cons) (const 1) (const (2 3)))) - (apply (primitive cons) (const 0) (lexical x _)))) + (let (x) (_) ((primcall cons (const 1) (const (2 3)))) + (primcall cons (const 0) (lexical x _)))) (pass-if-peval ;; Bindings mutated. @@ -1229,7 +1236,7 @@ (set! x 3) x) (let (x) (_) ((const 2)) - (begin + (seq (set! (lexical x _) (const 3)) (lexical x _)))) @@ -1242,8 +1249,8 @@ (frob f) ; may mutate `x' x) (letrec (x) (_) ((const 0)) - (begin - (apply (toplevel frob) (lambda _ _)) + (seq + (call (toplevel frob) (lambda _ _)) (lexical x _)))) (pass-if-peval @@ -1259,9 +1266,9 @@ (let ((x (make-foo))) (frob! x) ; may mutate `x' x) - (let (x) (_) ((apply (toplevel make-foo))) - (begin - (apply (toplevel frob!) (lexical x _)) + (let (x) (_) ((call (toplevel make-foo))) + (seq + (call (toplevel frob!) (lexical x _)) (lexical x _)))) (pass-if-peval @@ -1272,10 +1279,10 @@ (lambda-case (((x) #f #f #f () (_)) (if _ _ - (apply (lexical loop _) - (apply (primitive 1-) - (lexical x _)))))))) - (apply (lexical loop _) (toplevel x)))) + (call (lexical loop _) + (primcall 1- + (lexical x _)))))))) + (call (lexical loop _) (toplevel x)))) (pass-if-peval ;; Recursion on the 2nd argument is fully evaluated. @@ -1284,8 +1291,8 @@ (if (> y 0) (loop x (1- y)) (foo x y)))) - (let (x) (_) ((apply (toplevel top))) - (apply (toplevel foo) (lexical x _) (const 0)))) + (let (x) (_) ((call (toplevel top))) + (call (toplevel foo) (lexical x _) (const 0)))) (pass-if-peval ;; Inlining aborted when residual code contains recursive calls. @@ -1300,10 +1307,10 @@ (letrec (loop) (_) ((lambda (_) (lambda-case (((x y) #f #f #f () (_ _)) - (if (apply (primitive >) - (lexical y _) (const 0)) + (if (primcall > + (lexical y _) (const 0)) _ _))))) - (apply (lexical loop _) (toplevel x) (const 0)))) + (call (lexical loop _) (toplevel x) (const 0)))) (pass-if-peval ;; Infinite recursion: `peval' gives up and leaves it as is. @@ -1320,7 +1327,7 @@ (and (< x top) (loop (1+ x)))) (letrec (loop) (_) ((lambda . _)) - (apply (lexical loop _) (const 0)))) + (call (lexical loop _) (const 0)))) (pass-if-peval ;; This test checks that the `start' binding is indeed residualized. @@ -1330,10 +1337,10 @@ (let ((here (let ((start pos)) (lambda () start)))) (here))) (let (pos) (_) ((const 0)) - (begin + (seq (set! (lexical pos _) (const 1)) (let (here) (_) (_) - (apply (lexical here _)))))) + (call (lexical here _)))))) (pass-if-peval ;; FIXME: should this one residualize the binding? @@ -1370,7 +1377,7 @@ ((lambda _ (lambda-case ((() #f #f #f () ()) - (apply (lexical a _))))) + (call (lexical a _))))) (lambda _ (lambda-case (((x) #f #f #f () (_)) @@ -1378,12 +1385,11 @@ (lambda _ (lambda-case ((() #f #f #f () ()) - (apply (lexical a _)))))) + (call (lexical a _)))))) (let (d) (_) - ((apply (toplevel foo) (lexical b _))) - (apply (lexical c _) - (lexical d _))))) + ((call (toplevel foo) (lexical b _))) + (call (lexical c _) (lexical d _))))) (pass-if-peval ;; In this case, we can prune the bindings. `a' ends up being copied @@ -1392,15 +1398,15 @@ (letrec* ((a (lambda (x) (top x))) (b (lambda () a))) (foo (b) (b))) - (apply (toplevel foo) - (lambda _ - (lambda-case - (((x) #f #f #f () (_)) - (apply (toplevel top) (lexical x _))))) - (lambda _ - (lambda-case - (((x) #f #f #f () (_)) - (apply (toplevel top) (lexical x _))))))) + (call (toplevel foo) + (lambda _ + (lambda-case + (((x) #f #f #f () (_)) + (call (toplevel top) (lexical x _))))) + (lambda _ + (lambda-case + (((x) #f #f #f () (_)) + (call (toplevel top) (lexical x _))))))) (pass-if-peval ;; Constant folding: cons @@ -1410,7 +1416,7 @@ (pass-if-peval ;; Constant folding: cons (begin (cons (foo) 2) #f) - (begin (apply (toplevel foo)) (const #f))) + (seq (call (toplevel foo)) (const #f))) (pass-if-peval ;; Constant folding: cons @@ -1430,12 +1436,12 @@ (pass-if-peval ;; Constant folding: car+cons, impure (car (cons 1 (bar))) - (begin (apply (toplevel bar)) (const 1))) + (seq (call (toplevel bar)) (const 1))) (pass-if-peval ;; Constant folding: cdr+cons, impure (cdr (cons (bar) 0)) - (begin (apply (toplevel bar)) (const 0))) + (seq (call (toplevel bar)) (const 0))) (pass-if-peval ;; Constant folding: car+list @@ -1445,40 +1451,43 @@ (pass-if-peval ;; Constant folding: cdr+list (cdr (list 1 0)) - (apply (primitive list) (const 0))) + (primcall list (const 0))) (pass-if-peval ;; Constant folding: car+list, impure (car (list 1 (bar))) - (begin (apply (toplevel bar)) (const 1))) + (seq (call (toplevel bar)) (const 1))) (pass-if-peval ;; Constant folding: cdr+list, impure (cdr (list (bar) 0)) - (begin (apply (toplevel bar)) (apply (primitive list) (const 0)))) + (seq (call (toplevel bar)) (primcall list (const 0)))) (pass-if-peval - resolve-primitives ;; Non-constant guards get lexical bindings. (dynamic-wind foo (lambda () bar) baz) - (let (pre post) (_ _) ((toplevel foo) (toplevel baz)) - (dynwind (lexical pre _) (toplevel bar) (lexical post _)))) + (let (w u) (_ _) ((toplevel foo) (toplevel baz)) + (dynwind (lexical w _) + (call (lexical w _)) + (toplevel bar) + (call (lexical u _)) + (lexical u _)))) (pass-if-peval - resolve-primitives ;; Constant guards don't need lexical bindings. (dynamic-wind (lambda () foo) (lambda () bar) (lambda () baz)) (dynwind (lambda () (lambda-case ((() #f #f #f () ()) (toplevel foo)))) + (toplevel foo) (toplevel bar) + (toplevel baz) (lambda () (lambda-case ((() #f #f #f () ()) (toplevel baz)))))) (pass-if-peval - resolve-primitives ;; Prompt is removed if tag is unreferenced (let ((tag (make-prompt-tag))) (call-with-prompt tag @@ -1487,7 +1496,6 @@ (const 1)) (pass-if-peval - resolve-primitives ;; Prompt is removed if tag is unreferenced, with explicit stem (let ((tag (make-prompt-tag "foo"))) (call-with-prompt tag @@ -1496,7 +1504,6 @@ (const 1)) (pass-if-peval - resolve-primitives ;; `while' without `break' or `continue' has no prompts and gets its ;; condition folded. Unfortunately the outer `lp' does not yet get ;; elided. @@ -1509,9 +1516,9 @@ ((lambda _ (lambda-case ((() #f #f #f () ()) - (apply (lexical loop _)))))) - (apply (lexical loop _))))))) - (apply (lexical lp _))))) + (call (lexical loop _)))))) + (call (lexical loop _))))))) + (call (lexical lp _))))) @@ -1545,9 +1552,9 @@ '(lambda () (lambda-case (((x y) #f #f #f () (x1 y1)) - (apply (toplevel +) - (lexical x x1) - (lexical y y1))) + (call (toplevel +) + (lexical x x1) + (lexical y y1))) #f)))))) (and (equal? (map strip-source leaves) (list (make-lexical-ref #f 'y 'y1) diff --git a/test-suite/tests/vlist.test b/test-suite/tests/vlist.test index d939284c1..d9bbbebce 100644 --- a/test-suite/tests/vlist.test +++ b/test-suite/tests/vlist.test @@ -220,11 +220,11 @@ (and (fold (lambda (k v result) (and result (equal? (cons k v) - (vhash-assq k vh)))) + (vhash-assoc k vh)))) #t keys values) - (not (vhash-assq 'x vh))))) + (not (vhash-assoc 'x vh))))) (pass-if "vhash as vlist" (let* ((keys '(a b c d e f g h i)) diff --git a/test-suite/tests/weaks.test b/test-suite/tests/weaks.test index d0f6c5ef5..9475eed55 100644 --- a/test-suite/tests/weaks.test +++ b/test-suite/tests/weaks.test @@ -68,28 +68,28 @@ exception:wrong-type-arg (list->weak-vector 32))) - (with-test-prefix "make-weak-key-alist-vector" + (with-test-prefix "make-weak-key-hash-table" (pass-if "create" - (make-weak-key-alist-vector 17) + (make-weak-key-hash-table 17) #t) (pass-if-exception "bad-args" exception:wrong-type-arg - (make-weak-key-alist-vector '(bad arg)))) - (with-test-prefix "make-weak-value-alist-vector" + (make-weak-key-hash-table '(bad arg)))) + (with-test-prefix "make-weak-value-hash-table" (pass-if "create" - (make-weak-value-alist-vector 17) + (make-weak-value-hash-table 17) #t) (pass-if-exception "bad-args" exception:wrong-type-arg - (make-weak-value-alist-vector '(bad arg)))) + (make-weak-value-hash-table '(bad arg)))) - (with-test-prefix "make-doubly-weak-alist-vector" + (with-test-prefix "make-doubly-weak-hash-table" (pass-if "create" - (make-doubly-weak-alist-vector 17) + (make-doubly-weak-hash-table 17) #t) (pass-if-exception "bad-args" exception:wrong-type-arg - (make-doubly-weak-alist-vector '(bad arg))))) + (make-doubly-weak-hash-table '(bad arg))))) @@ -138,9 +138,9 @@ (or (not value) (equal? value initial-value))) - (let ((x (make-weak-key-alist-vector 17)) - (y (make-weak-value-alist-vector 17)) - (z (make-doubly-weak-alist-vector 17)) + (let ((x (make-weak-key-hash-table 17)) + (y (make-weak-value-hash-table 17)) + (z (make-doubly-weak-hash-table 17)) (test-key "foo") (test-value "bar")) (with-test-prefix |