diff options
179 files changed, 25266 insertions, 30883 deletions
diff --git a/.gitignore b/.gitignore index f13d7533e..edbb1f0c7 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 ccc5fa572..697761fc8 100644 --- a/configure.ac +++ b/configure.ac @@ -1260,7 +1260,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 GC_gcollect_and_unmap GC_get_unmapped_bytes]) +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 GC_gcollect_and_unmap GC_get_unmapped_bytes]) # 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 @@ -1663,8 +1663,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 2ab9c7a63..09b93ac39 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 82e7bac6f..398129e2b 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 c181b998f..52ffc34be 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 c4f2a1ad1..d0a421371 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,147 +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) -#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) -#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 @@ -685,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 ef6f80dd3..acd167da6 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, 2012 Free Software Foundation, Inc. +/* Copyright (C) 1996,1998,2000,2001,2004,2005, 2006, 2008, 2009, 2010, 2011, 2012 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 97b5aad9b..935d6f363 100644 --- a/libguile/arrays.c +++ b/libguile/arrays.c @@ -470,7 +470,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)) { @@ -725,15 +725,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; } @@ -750,7 +750,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) @@ -771,12 +771,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); } @@ -804,9 +804,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 @@ -830,14 +830,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) @@ -860,7 +860,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)); } @@ -868,11 +868,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; @@ -897,7 +897,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; @@ -922,7 +922,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); } @@ -930,7 +930,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, @@ -952,7 +952,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 7dd66ad2e..11a0cb1ee 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; } @@ -220,14 +220,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; @@ -236,7 +236,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 { @@ -341,19 +341,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 @@ -368,9 +368,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 { @@ -385,7 +385,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)) { @@ -396,10 +396,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 @@ -426,7 +426,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 { @@ -524,9 +524,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; @@ -557,7 +557,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; } @@ -587,7 +587,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 b0c21f50d..bc273a3b1 100644 --- a/libguile/bitvectors.c +++ b/libguile/bitvectors.c @@ -50,12 +50,12 @@ scm_i_print_bitvector (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 b1a90d84d..87513bf48 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 4155d1981..362d9b7e2 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,2012 +/* Copyright (C) 1995,1996,1998,1999,2000,2001,2002,2004,2008,2009,2010,2011,2012 * Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or @@ -54,18 +54,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 530d2d425..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 @@ -2624,26 +75,12 @@ scm_immutable_double_cell (scm_t_bits car, scm_t_bits cbr, return scm_double_cell (car, cbr, ccr, cdr); } - - - -scm_t_bits -scm_i_deprecated_asrtgo (scm_t_bits condition) -{ - scm_c_issue_deprecation_warning - ("SCM_ASRTGO is deprecated. Use `if (!condition) goto label;' directly."); - - return condition; -} - 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 2b85bef6a..d11667191 100644 --- a/libguile/deprecated.h +++ b/libguile/deprecated.h @@ -5,7 +5,7 @@ #ifndef SCM_DEPRECATED_H #define SCM_DEPRECATED_H -/* Copyright (C) 2003,2004, 2005, 2006, 2007, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. +/* Copyright (C) 2003,2004, 2005, 2006, 2007, 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,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,644 +92,59 @@ 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); - /* Deprecated 26-05-2011, as the GC_STUBBORN API doesn't do anything any more. */ -SCM_DEPRECATED SCM scm_immutable_cell (scm_t_bits car, scm_t_bits cdr); -SCM_DEPRECATED SCM scm_immutable_double_cell (scm_t_bits car, scm_t_bits cbr, +SCM_API SCM scm_immutable_cell (scm_t_bits car, scm_t_bits cdr); +SCM_API SCM scm_immutable_double_cell (scm_t_bits car, scm_t_bits cbr, scm_t_bits ccr, scm_t_bits cdr); -SCM_DEPRECATED scm_t_bits scm_i_deprecated_asrtgo (scm_t_bits condition); - -/* Deprecated 08-01-2012, as it's undocumented and unused. */ -#define SCM_ASRTGO(_cond, _label) \ - do { if (!scm_i_deprecated_asrtgo(_cond)) goto _label; } while (0) - - - void scm_i_init_deprecated (void); #endif diff --git a/libguile/deprecation.c b/libguile/deprecation.c index 08227071f..5c1a246c2 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_warning_port ()); + scm_puts_unlocked (msg, scm_current_warning_port ()); scm_newline (scm_current_warning_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 02ce0a9b5..5a6f574d2 100644 --- a/libguile/eq.c +++ b/libguile/eq.c @@ -372,7 +372,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 e52fa48e4..5a42b1ead 100644 --- a/libguile/eval.c +++ b/libguile/eval.c @@ -230,10 +230,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: @@ -960,16 +959,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 c1d46b56d..3e04a7a59 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 f3bddc788..c11cb5e9e 100644 --- a/libguile/feature.c +++ b/libguile/feature.c @@ -45,7 +45,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); } @@ -110,21 +110,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 18ad9746c..63e5a206b 100644 --- a/libguile/filesys.c +++ b/libguile/filesys.c @@ -1005,7 +1005,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 @@ -1775,12 +1775,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 f1c09cb30..55910b0a5 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 0dc7ac666..851cdedd5 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; @@ -270,8 +267,8 @@ SCM_DEFINE (scm_pointer_to_bytevector, "pointer->bytevector", 2, 2, 0, blen = scm_to_size_t (len); ret = scm_c_take_typed_bytevector ((signed char *) ptr + boffset, - blen, btype); - register_weak_reference (ret, pointer); + blen, btype, pointer); + return ret; } #undef FUNC_NAME @@ -319,7 +316,7 @@ SCM_DEFINE (scm_set_pointer_finalizer_x, "set-pointer-finalizer!", 2, 0, 0, c_finalizer = SCM_POINTER_VALUE (finalizer); - GC_REGISTER_FINALIZER_NO_ORDER (SCM2PTR (pointer), + GC_REGISTER_FINALIZER_NO_ORDER (SCM_HEAP_OBJECT_BASE (pointer), pointer_finalizer_trampoline, c_finalizer, &prev_finalizer, @@ -332,9 +329,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); } @@ -1126,7 +1123,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)); @@ -1157,7 +1154,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) { @@ -1303,7 +1300,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 3ac3ced8b..97dadded5 100644 --- a/libguile/fports.c +++ b/libguile/fports.c @@ -216,7 +216,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) { @@ -535,7 +535,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. */ @@ -554,26 +554,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 @@ -642,7 +637,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)) { @@ -651,8 +646,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) @@ -664,11 +659,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; } @@ -723,7 +718,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 c7505b262..b57b1295d 100644 --- a/libguile/frames.c +++ b/libguile/frames.c @@ -52,12 +52,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 eaed79d43..71d5b124d 100644 --- a/libguile/frames.h +++ b/libguile/frames.h @@ -112,7 +112,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 de8e9e2b3..5c230dd1f 100644 --- a/libguile/gc-malloc.c +++ b/libguile/gc-malloc.c @@ -45,7 +45,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" @@ -242,106 +241,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 fd37046af..6d44f5e38 100644 --- a/libguile/gc.c +++ b/libguile/gc.c @@ -22,8 +22,6 @@ # include <config.h> #endif -#define SCM_BUILDING_DEPRECATED_CODE - #include "libguile/gen-scmconfig.h" #include <stdio.h> @@ -49,7 +47,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" @@ -82,14 +79,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) @@ -955,6 +948,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 2f9cf30b9..5e846eeae 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 @@ -172,7 +164,6 @@ static SCM class_array; static SCM class_bitvector; 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 @@ -200,17 +191,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)) { @@ -229,9 +218,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; @@ -934,7 +921,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"); @@ -969,7 +955,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); } @@ -982,7 +967,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)); @@ -1000,21 +985,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)); @@ -1733,36 +1718,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) @@ -1906,6 +1861,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 @@ -2367,12 +2363,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); } @@ -2572,30 +2568,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 ("<"), @@ -2606,14 +2597,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 @@ -2721,7 +2706,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)); } @@ -2843,7 +2828,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 f337ebf8a..e6406429e 100644 --- a/libguile/hashtab.c +++ b/libguile/hashtab.c @@ -54,9 +54,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. */ @@ -76,201 +73,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; @@ -279,9 +83,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); @@ -289,8 +90,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), @@ -323,13 +122,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; @@ -343,13 +135,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); @@ -369,10 +154,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)); @@ -387,28 +168,21 @@ 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_UNPACK (exp), 16, port); scm_putc (' ', 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, @@ -416,171 +190,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 @@ -605,69 +226,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; } @@ -693,11 +252,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; @@ -705,29 +260,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)) @@ -763,36 +298,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, @@ -804,24 +309,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; } @@ -848,11 +336,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)) { @@ -871,6 +355,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); @@ -890,9 +377,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, @@ -908,9 +392,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, @@ -929,6 +410,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, @@ -944,6 +429,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, @@ -959,6 +447,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, @@ -977,9 +468,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, @@ -995,9 +483,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, @@ -1006,6 +491,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" @@ -1016,6 +507,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, @@ -1031,6 +527,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, @@ -1045,6 +549,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, @@ -1062,9 +573,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, @@ -1080,9 +588,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, @@ -1091,6 +596,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" @@ -1101,6 +612,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, @@ -1117,6 +633,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, @@ -1132,6 +656,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, @@ -1146,10 +677,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) { @@ -1159,8 +689,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) { @@ -1168,6 +696,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), @@ -1182,9 +724,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); @@ -1205,9 +745,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); @@ -1234,6 +772,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); } @@ -1258,6 +805,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); } @@ -1279,6 +836,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); } @@ -1299,6 +866,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); @@ -1320,6 +891,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, @@ -1338,9 +913,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); @@ -1363,6 +935,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), @@ -1381,6 +957,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); @@ -1393,14 +972,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 633f8c681..35ab85603 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 007621883..135a621cb 100644 --- a/libguile/load.c +++ b/libguile/load.c @@ -667,11 +667,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; @@ -686,10 +686,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 ()); @@ -718,16 +718,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; } @@ -736,22 +736,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_warning_port ()); + scm_puts_unlocked (";;; WARNING: compilation of ", scm_current_warning_port ()); scm_display (source, scm_current_warning_port ()); - scm_puts (" failed:\n", scm_current_warning_port ()); + scm_puts_unlocked (" failed:\n", scm_current_warning_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_warning_port ()); + scm_puts_unlocked (";;; ", scm_current_warning_port ()); scm_display (scm_car (lines), scm_current_warning_port ()); scm_newline (scm_current_warning_port ()); } @@ -769,7 +769,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_warning_port ()); message_shown = 1; @@ -788,9 +788,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); } @@ -937,7 +937,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_warning_port ()); + scm_puts_unlocked (";;; found fresh local cache at ", scm_current_warning_port ()); scm_display (fallback, scm_current_warning_port ()); scm_newline (scm_current_warning_port ()); return scm_load_compiled_with_vm (fallback); @@ -1002,7 +1002,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 a0b140126..34aa60c83 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 05c6a8529..b4499bc6d 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 @@ -45,9 +45,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 693838138..46a195a98 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'; @@ -5363,7 +5354,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; } @@ -5371,7 +5362,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 @@ -5379,7 +5370,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; } @@ -5387,7 +5378,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 @@ -5408,7 +5399,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; } @@ -6245,7 +6236,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)) { @@ -6280,7 +6272,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)) { @@ -6318,7 +6311,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)) { @@ -6356,7 +6350,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)) { @@ -6390,10 +6385,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); } @@ -6452,7 +6449,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)) { @@ -6480,7 +6478,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)) { @@ -6508,7 +6507,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)) { @@ -6541,10 +6541,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); } @@ -6573,9 +6575,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); } @@ -6607,9 +6609,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 @@ -6643,9 +6645,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 @@ -6672,7 +6674,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 @@ -6696,7 +6698,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 @@ -6720,7 +6722,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 @@ -6754,11 +6756,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)) @@ -6797,7 +6799,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)) { @@ -6827,7 +6829,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)) { @@ -6882,7 +6884,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)) { @@ -6905,10 +6907,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); } @@ -6935,11 +6937,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)) @@ -6968,7 +6970,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)) { @@ -6998,7 +7000,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)) { @@ -7042,7 +7044,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)) { @@ -7065,10 +7067,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); } @@ -7097,7 +7099,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))) @@ -7130,7 +7132,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)) @@ -7195,7 +7197,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)) { @@ -7215,7 +7217,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)) { @@ -7239,7 +7241,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)) { @@ -7262,10 +7264,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); } @@ -7305,7 +7307,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)) { @@ -7328,7 +7330,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))) @@ -7415,7 +7417,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)) { @@ -7479,7 +7481,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)) { @@ -7499,7 +7502,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)) { @@ -7523,7 +7526,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)) { @@ -7547,10 +7550,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 @@ -7593,7 +7596,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))) @@ -7626,7 +7629,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: /* @@ -7671,7 +7674,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)) { @@ -7706,7 +7709,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)) { @@ -7729,7 +7732,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)) { @@ -7762,7 +7765,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)) { @@ -7787,10 +7790,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)) \ @@ -7854,7 +7857,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); @@ -7908,7 +7911,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))) @@ -7982,7 +7985,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)) { @@ -8081,7 +8084,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)) { @@ -8120,7 +8123,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)) { @@ -8178,7 +8181,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)) { @@ -8217,10 +8220,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 @@ -8297,7 +8300,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 @@ -8317,8 +8320,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 @@ -8335,7 +8338,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 @@ -8352,7 +8355,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 @@ -8391,9 +8394,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 @@ -8420,7 +8423,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 @@ -8441,7 +8444,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 @@ -8466,7 +8469,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 @@ -8487,7 +8490,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 @@ -8508,7 +8511,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 @@ -8533,7 +8536,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 @@ -8561,7 +8564,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 @@ -8591,7 +8594,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 @@ -8618,17 +8621,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 @@ -8646,7 +8649,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 @@ -8664,7 +8667,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 @@ -8682,7 +8685,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 @@ -8691,7 +8694,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; @@ -8783,7 +8786,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 @@ -8798,7 +8801,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 @@ -8814,7 +8817,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 @@ -8831,7 +8834,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 @@ -8873,7 +8877,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 @@ -8919,7 +8924,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 @@ -8938,7 +8943,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 @@ -8959,7 +8965,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); @@ -9339,7 +9346,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; @@ -9347,46 +9354,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) { @@ -9536,7 +9503,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 @@ -9583,7 +9550,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 @@ -9611,7 +9578,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 @@ -9716,7 +9683,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 004dd6118..df10ea3ce 100644 --- a/libguile/objcodes.c +++ b/libguile/objcodes.c @@ -376,17 +376,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 @@ -422,9 +419,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; } @@ -433,9 +431,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 a6311003a..c0e13f374 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_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; + scm_t_ptob_descriptor *desc; + long ptobnum; - scm_ptobs[scm_numptob].write = write; - scm_ptobs[scm_numptob].flush = flush_port_default; + desc = scm_gc_malloc_pointerless (sizeof (*desc), "port-type"); + memset (desc, 0, sizeof (*desc)); - scm_ptobs[scm_numptob].end_input = end_input_default; - scm_ptobs[scm_numptob].fill_input = fill_input; - scm_ptobs[scm_numptob].input_waiting = 0; + 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].seek = 0; - scm_ptobs[scm_numptob].truncate = 0; + ptobnum = scm_c_port_type_add_x (desc); - 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; @@ -525,21 +441,95 @@ 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); /* Register a finalizer for PORT. */ @@ -551,7 +541,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); } @@ -560,8 +551,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 (); @@ -573,16 +563,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); @@ -600,73 +587,61 @@ 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); + entry->lock = scm_gc_malloc_pointerless (sizeof (*entry->lock), "port lock"); + scm_i_pthread_mutex_init (entry->lock, scm_i_pthread_mutexattr_recursive); + + 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. */ @@ -676,10 +651,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; @@ -694,155 +670,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. - */ - -int -scm_revealed_count (SCM port) -{ - return SCM_REVEALED(port); -} - +/* Predicates. */ -/* 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 @@ -859,7 +752,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); @@ -867,9 +759,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); @@ -909,183 +800,616 @@ 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) +{ + 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) { - return scm_cons (key, result); + 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; + + new_input_cd = (iconv_t) -1; + new_output_cd = (iconv_t) -1; - /* 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); + /* 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; + + SCM_VALIDATE_PORT (1, port); + SCM_VALIDATE_STRING (2, enc); - for (; scm_is_pair (ports); ports = scm_cdr (ports)) - if (SCM_PORTP (SCM_CAR (ports))) - scm_call_1 (proc, SCM_CAR (ports)); + 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; + } + +} + +void +scm_i_set_conversion_strategy_x (SCM port, + scm_t_string_failed_conversion_handler handler) +{ + 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_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 +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 { - x = SCM_COERCE_OUTPORT (x); - return scm_from_bool (SCM_OUTPUT_PORT_P (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_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 + + + +/* The port lock. */ + +static void +lock_port (void *mutex) { - return scm_from_bool (SCM_PORTP (x)); + scm_i_pthread_mutex_lock (mutex); +} + +static void +unlock_port (void *mutex) +{ + scm_i_pthread_mutex_unlock (mutex); +} + +void +scm_dynwind_lock_port (SCM port) +#define FUNC_NAME "dynwind-lock-port" +{ + scm_i_pthread_mutex_t *lock; + SCM_VALIDATE_OPPORT (SCM_ARG1, port); + scm_c_lock_port (port, &lock); + if (lock) + { + scm_dynwind_unwind_handler (unlock_port, lock, SCM_F_WIND_EXPLICITLY); + scm_dynwind_rewind_handler (lock_port, lock, 0); + } } #undef FUNC_NAME -SCM_DEFINE (scm_port_closed_p, "port-closed?", 1, 0, 0, + + + +/* 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) +{ + scm_i_pthread_mutex_t *lock; + int ret; + + scm_c_lock_port (port, &lock); + ret = SCM_REVEALED (port); + if (lock) + scm_i_pthread_mutex_unlock (lock); + + 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; + scm_i_pthread_mutex_t *lock; + + port = SCM_COERCE_OUTPORT (port); + SCM_VALIDATE_OPENPORT (1, port); + r = scm_to_int (rcount); + scm_c_lock_port (port, &lock); + SCM_REVEALED (port) = r; + if (lock) + scm_i_pthread_mutex_unlock (lock); + 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_adjust_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); + scm_i_pthread_mutex_t *lock; + int a; + port = SCM_COERCE_OUTPORT (port); + SCM_VALIDATE_OPENPORT (1, port); + a = scm_to_int (addend); + scm_c_lock_port (port, &lock); + SCM_REVEALED (port) += a; + if (lock) + scm_i_pthread_mutex_unlock (lock); 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); + scm_i_pthread_mutex_t *lock; + int ret; + + scm_c_lock_port (port, &lock); + ret = scm_get_byte_or_eof_unlocked (port); + if (lock) + scm_i_pthread_mutex_unlock (lock); + + 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; + scm_i_pthread_mutex_t *lock; + int ret; + + scm_c_lock_port (port, &lock); + ret = scm_peek_byte_or_eof_unlocked (port); + if (lock) + scm_i_pthread_mutex_unlock (lock); + + 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) +{ + scm_i_pthread_mutex_t *lock; + size_t ret; + + scm_c_lock_port (port, &lock); + ret = scm_c_read_unlocked (port, buffer, size); + if (lock) + scm_i_pthread_mutex_unlock (lock); + + + 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) @@ -1172,7 +1496,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; @@ -1188,7 +1512,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)) @@ -1204,7 +1528,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 @@ -1216,7 +1540,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)) @@ -1233,7 +1557,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) @@ -1245,7 +1569,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)) @@ -1255,7 +1579,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)) @@ -1310,7 +1634,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) @@ -1390,7 +1714,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; @@ -1408,274 +1732,50 @@ 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_i_pthread_mutex_t *lock; + 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, &lock); + ret = scm_getc_unlocked (port); + if (lock) + scm_i_pthread_mutex_unlock (lock); + - /* 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); @@ -1738,8 +1838,19 @@ scm_unget_byte (int c, SCM port) } #undef FUNC_NAME +void +scm_unget_byte (int c, SCM port) +{ + scm_i_pthread_mutex_t *lock; + scm_c_lock_port (port, &lock); + scm_unget_byte_unlocked (c, port); + if (lock) + scm_i_pthread_mutex_unlock (lock); + +} + 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); @@ -1766,7 +1877,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); @@ -1783,9 +1894,19 @@ scm_ungetc (scm_t_wchar c, SCM port) } #undef FUNC_NAME +void +scm_ungetc (scm_t_wchar c, SCM port) +{ + scm_i_pthread_mutex_t *lock; + scm_c_lock_port (port, &lock); + scm_ungetc_unlocked (c, port); + if (lock) + scm_i_pthread_mutex_unlock (lock); + +} 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 @@ -1794,9 +1915,19 @@ 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_i_pthread_mutex_t *lock; + scm_c_lock_port (port, &lock); + scm_ungets_unlocked (s, n, port); + if (lock) + scm_i_pthread_mutex_unlock (lock); + +} SCM_DEFINE (scm_peek_char, "peek-char", 0, 1, 0, (SCM port), @@ -1838,7 +1969,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; @@ -1876,7 +2007,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 @@ -1898,12 +2029,382 @@ 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) +{ + scm_i_pthread_mutex_t *lock; + int ret; + + scm_c_lock_port (port, &lock); + ret = scm_fill_input_unlocked (port); + if (lock) + scm_i_pthread_mutex_unlock (lock); + + + 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_i_pthread_mutex_t *lock; + scm_c_lock_port (port, &lock); + scm_end_input_unlocked (port); + if (lock) + scm_i_pthread_mutex_unlock (lock); + +} + +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_i_pthread_mutex_t *lock; + scm_c_lock_port (port, &lock); + scm_flush_unlocked (port); + if (lock) + scm_i_pthread_mutex_unlock (lock); + +} + + + + +/* Output. */ + +void +scm_putc (char c, SCM port) +{ + scm_i_pthread_mutex_t *lock; + scm_c_lock_port (port, &lock); + scm_putc_unlocked (c, port); + if (lock) + scm_i_pthread_mutex_unlock (lock); + +} + +void +scm_puts (const char *s, SCM port) +{ + scm_i_pthread_mutex_t *lock; + scm_c_lock_port (port, &lock); + scm_puts_unlocked (s, port); + if (lock) + scm_i_pthread_mutex_unlock (lock); + +} + +/* 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_i_pthread_mutex_t *lock; + scm_c_lock_port (port, &lock); + scm_c_write_unlocked (port, ptr, size); + if (lock) + scm_i_pthread_mutex_unlock (lock); + +} + +/* 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_i_pthread_mutex_t *lock; + scm_c_lock_port (port, &lock); + scm_lfwrite_unlocked (ptr, size, port); + if (lock) + scm_i_pthread_mutex_unlock (lock); + +} + +/* 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" @@ -1941,7 +2442,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; @@ -2036,12 +2537,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); @@ -2152,349 +2653,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; - - strategy = scm_from_int ((int) handler); + struct for_each_data d; - 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 + @@ -2517,18 +2785,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 @@ -2549,7 +2812,9 @@ SCM_DEFINE (scm_sys_make_void_port, "%make-void-port", 1, 0, 0, } #undef FUNC_NAME + + /* Initialization. */ void @@ -2568,7 +2833,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 fcf1424cc..f4a1908e0 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,8 @@ typedef enum scm_t_port_rw_active { typedef struct { SCM port; /* Link back to the port object. */ + scm_i_pthread_mutex_t *lock; /* A recursive lock for this port. */ + int revealed; /* 0 not revealed, > 1 revealed. * Revealed ports do not get GC'd. */ @@ -118,8 +125,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 +145,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 +204,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 - - - -/* 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; +#define SCM_PTOBNAME(ptobnum) (scm_c_port_type_ref (ptobnum)->name) - - -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 +224,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 +236,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); @@ -256,44 +250,108 @@ SCM_API SCM scm_set_current_warning_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_i_pthread_mutex_t **lock); +SCM_INLINE int scm_c_try_lock_port (SCM port, scm_i_pthread_mutex_t **lock); + +/* 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); @@ -302,36 +360,116 @@ 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); -#endif -#ifdef GUILE_DEBUG -SCM_API SCM scm_pt_size (void); -SCM_API SCM scm_pt_member (SCM member); -#endif /* GUILE_DEBUG */ +/* Inline function implementations. */ -/* internal */ +#if SCM_CAN_INLINE || defined SCM_INLINE_C_IMPLEMENTING_INLINES +SCM_INLINE_IMPLEMENTATION int +scm_c_lock_port (SCM port, scm_i_pthread_mutex_t **lock) +{ + *lock = SCM_PTAB_ENTRY (port)->lock; -SCM_INTERNAL long scm_i_mode_bits (SCM modes); -SCM_INTERNAL void scm_i_dynwind_current_load_port (SCM port); + if (*lock) + return scm_i_pthread_mutex_lock (*lock); + else + return 0; +} + +SCM_INLINE_IMPLEMENTATION int +scm_c_try_lock_port (SCM port, scm_i_pthread_mutex_t **lock) +{ + *lock = SCM_PTAB_ENTRY (port)->lock; + if (*lock) + { + int ret = scm_i_pthread_mutex_trylock (*lock); + if (ret != 0) + *lock = NULL; + return ret; + } + else + return 0; +} + +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 2eda4bbd4..b800362c1 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" @@ -158,7 +157,7 @@ do \ { \ if (pstate->top - pstate->list_offset >= pstate->level) \ { \ - scm_putc ('#', port); \ + scm_putc_unlocked ('#', port); \ return; \ } \ } \ @@ -302,9 +301,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. */ @@ -395,7 +394,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++) { @@ -418,7 +417,7 @@ print_extended_symbol (SCM sym, SCM port) } } - scm_lfwrite ("}#", 2, port); + scm_lfwrite_unlocked ("}#", 2, port); } /* FIXME: allow R6RS hex escapes instead of #{...}#. */ @@ -434,7 +433,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); } @@ -454,7 +453,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); \ } \ } \ @@ -509,7 +508,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 { @@ -530,7 +529,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 { @@ -603,11 +602,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: @@ -622,6 +621,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; @@ -659,14 +664,11 @@ 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_vector: ENTER_NESTED_DATA (pstate, exp, circref); - scm_puts ("#(", port); + scm_puts_unlocked ("#(", port); common_vector_printer: { register long i; @@ -678,43 +680,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; } @@ -859,7 +844,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; } @@ -920,7 +905,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. */ @@ -955,7 +940,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; } @@ -1035,7 +1020,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) { @@ -1045,7 +1030,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) { @@ -1055,7 +1040,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) { @@ -1067,7 +1052,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 @@ -1090,7 +1075,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 @@ -1100,7 +1085,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); } @@ -1171,14 +1156,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. @@ -1187,19 +1172,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); } @@ -1210,7 +1195,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; @@ -1240,18 +1225,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; @@ -1272,7 +1257,7 @@ fancy_printing: { if (n == 0) { - scm_puts (" ...", port); + scm_puts_unlocked (" ...", port); goto skip_tail; } else @@ -1280,14 +1265,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: @@ -1298,7 +1283,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; } @@ -1323,7 +1308,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 (SCM_COERCE_OUTPORT (port)); scm_prin1 (obj, port, 1); + scm_dynwind_end (); + return SCM_UNSPECIFIED; } @@ -1338,7 +1327,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 (SCM_COERCE_OUTPORT (port)); scm_prin1 (obj, port, 0); + scm_dynwind_end (); + return SCM_UNSPECIFIED; } @@ -1451,7 +1444,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 @@ -1496,7 +1489,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 @@ -1541,14 +1534,10 @@ SCM_DEFINE (scm_get_print_state, "get-print-state", 1, 0, 0, void scm_init_print () { - SCM vtable, layout, type; - - 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)); + SCM type; + + 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 428d63f91..93ee7f033 100644 --- a/libguile/procprop.c +++ b/libguile/procprop.c @@ -1,6 +1,5 @@ -/* Copyright (C) 1995, 1996, 1998, 2000, 2001, 2003, 2004, 2006, - * 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. - * +/* Copyright (C) 1995,1996,1998,2000,2001,2003,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 * as published by the Free Software Foundation; either version 3 of @@ -23,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" @@ -44,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; @@ -59,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)) { @@ -73,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); @@ -107,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 @@ -148,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)) { @@ -160,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 @@ -175,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_is_true (scm_assq (scm_sym_arity, alist))) - 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; } @@ -195,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 @@ -216,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)) @@ -230,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; } @@ -243,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 8b038f5de..e966da8e1 100644 --- a/libguile/smob.c +++ b/libguile/smob.c @@ -105,14 +105,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; } @@ -415,16 +415,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; @@ -438,15 +435,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; } } @@ -472,8 +467,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) @@ -481,7 +476,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 @@ -518,7 +513,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, @@ -543,7 +538,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 ()'). */ @@ -562,33 +557,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)); @@ -599,6 +576,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 () @@ -625,7 +669,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 8491b1ea2..cdd43e1b2 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. */ @@ -1487,6 +1487,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) @@ -1520,19 +1537,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) @@ -1606,7 +1611,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 @@ -2170,66 +2249,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 42e57ace3..04a976211 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 a3032bfa9..fb550479d 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,2012 +/* Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2008,2009,2010,2011,2012 * 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,10 +438,10 @@ 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_array 85 -#define scm_tc7_bitvector 87 -#define scm_tc7_unused_20 93 -#define scm_tc7_unused_11 95 +#define scm_tc7_weak_set 85 +#define scm_tc7_weak_table 87 +#define scm_tc7_array 93 +#define scm_tc7_bitvector 95 #define scm_tc7_unused_12 101 #define scm_tc7_unused_18 103 #define scm_tc7_unused_13 109 @@ -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 5a13e5ccf..463414f4a 100644 --- a/libguile/threads.c +++ b/libguile/threads.c @@ -63,7 +63,6 @@ #include "libguile/init.h" #include "libguile/scmsigs.h" #include "libguile/strings.h" -#include "libguile/weaks.h" #include <full-read.h> @@ -398,11 +397,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; } @@ -661,10 +660,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; @@ -685,9 +680,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); @@ -701,7 +696,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); @@ -1308,9 +1303,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; } @@ -1413,7 +1408,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); } @@ -1557,6 +1553,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) @@ -1601,7 +1616,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); } @@ -1635,7 +1650,7 @@ fat_mutex_unlock (SCM mutex, SCM cond, } t->block_asyncs--; - scm_async_click (); + scm_async_tick (); scm_remember_upto_here_2 (cond, mutex); @@ -1649,7 +1664,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); } @@ -1745,9 +1760,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 9c9e5ff6d..fdd93599a 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 80328cde8..ad16c46cc 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 (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 8fae65604..e386202ad 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); @@ -352,22 +352,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 @@ -392,7 +392,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); @@ -504,7 +505,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 5aa46aba6..8065a0553 100644 --- a/m4/gnulib-cache.m4 +++ b/m4/gnulib-cache.m4 @@ -69,6 +69,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 1bda73449..1bda73449 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 c8a56e020..1780b843c 100644 --- a/module/ice-9/boot-9.scm +++ b/module/ice-9/boot-9.scm @@ -884,15 +884,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))))) @@ -971,16 +967,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)))) @@ -1596,7 +1589,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))) @@ -2073,33 +2066,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} @@ -3292,13 +3258,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) diff --git a/module/ice-9/deprecated.scm b/module/ice-9/deprecated.scm index ef2bc2422..6b39e7a7c 100644 --- a/module/ice-9/deprecated.scm +++ b/module/ice-9/deprecated.scm @@ -1,4 +1,4 @@ -;;;; Copyright (C) 2003, 2005, 2006, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. +;;;; Copyright (C) 2003, 2005, 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 @@ -16,866 +16,4 @@ ;;;; (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 - $expt - $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 - fluid-let-syntax)) - - -;;;; 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 ($expt z1 z2) - (issue-deprecation-warning - "`$expt' is deprecated. Use `expt' instead.") - (expt z1 z2)) -(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))))))) - -(define-syntax fluid-let-syntax - (lambda (x) - (issue-deprecation-warning - "`fluid-let-syntax' is deprecated. Use syntax parameters instead.") - (syntax-case x () - ((_ ((k v) ...) body0 body ...) - #'(syntax-parameterize ((k v) ...) - body0 body ...))))) + #:export ()) diff --git a/module/ice-9/eval.scm b/module/ice-9/eval.scm index 74b85329d..d993db0c7 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 24343d8c8..847a25b3f 100644 --- a/module/ice-9/psyntax-pp.scm +++ b/module/ice-9/psyntax-pp.scm @@ -1,1671 +1,2176 @@ (eval-when (compile) (set-current-module (resolve-module (quote (guile))))) (if #f #f) -(let ((session-id-6510 (if #f #f)) - (transformer-environment-6571 (if #f #f))) +(let ((session-id-4511 (if #f #f)) + (transformer-environment-4572 (if #f #f))) (letrec* - ((top-level-eval-hook-6508 - (lambda (x-29318 mod-29319) - (primitive-eval x-29318))) - (get-global-definition-hook-6512 - (lambda (symbol-17709 module-17710) - (begin - (if (if (not module-17710) (current-module) #f) - (warn "module system is booted, we should have a module" - symbol-17709)) - (let ((v-17711 - (module-variable - (if module-17710 - (resolve-module (cdr module-17710)) - (current-module)) - symbol-17709))) - (if v-17711 - (if (variable-bound? v-17711) - (let ((val-17713 (variable-ref v-17711))) - (if (macro? val-17713) - (if (macro-type val-17713) - (cons (macro-type val-17713) - (macro-binding val-17713)) - #f) - #f)) - #f) - #f))))) - (maybe-name-value!-6514 - (lambda (name-17990 val-17991) - (if (if (struct? val-17991) - (eq? (struct-vtable val-17991) - (vector-ref %expanded-vtables 13)) + ((top-level-eval-hook-4509 + (lambda (x-36254 mod-36255) + (primitive-eval x-36254))) + (maybe-name-value!-4515 + (lambda (name-19069 val-19070) + (if (if (struct? val-19070) + (eq? (struct-vtable val-19070) + (vector-ref %expanded-vtables 14)) #f) - (let ((meta-17998 (struct-ref val-17991 1))) - (if (not (assq 'name meta-17998)) - (let ((v-18003 - (cons (cons 'name name-17990) meta-17998))) - (struct-set! val-17991 1 v-18003))))))) - (build-application-6516 - (lambda (source-17715 fun-exp-17716 arg-exps-17717) + (let ((meta-19077 (struct-ref val-19070 1))) + (if (not (assq 'name meta-19077)) + (let ((v-19082 + (cons (cons 'name name-19069) meta-19077))) + (struct-set! val-19070 1 v-19082))))))) + (build-call-4517 + (lambda (source-18814 fun-exp-18815 arg-exps-18816) (make-struct/no-tail (vector-ref %expanded-vtables 11) - source-17715 - fun-exp-17716 - arg-exps-17717))) - (build-conditional-6517 - (lambda (source-17723 - test-exp-17724 - then-exp-17725 - else-exp-17726) + source-18814 + fun-exp-18815 + arg-exps-18816))) + (build-conditional-4518 + (lambda (source-18822 + test-exp-18823 + then-exp-18824 + else-exp-18825) (make-struct/no-tail (vector-ref %expanded-vtables 10) - source-17723 - test-exp-17724 - then-exp-17725 - else-exp-17726))) - (build-dynlet-6518 - (lambda (source-17733 fluids-17734 vals-17735 body-17736) + source-18822 + test-exp-18823 + then-exp-18824 + else-exp-18825))) + (build-dynlet-4519 + (lambda (source-18832 fluids-18833 vals-18834 body-18835) (make-struct/no-tail - (vector-ref %expanded-vtables 17) - source-17733 - fluids-17734 - vals-17735 - body-17736))) - (build-lexical-reference-6519 - (lambda (type-29320 source-29321 name-29322 var-29323) + (vector-ref %expanded-vtables 18) + source-18832 + fluids-18833 + vals-18834 + body-18835))) + (build-lexical-reference-4520 + (lambda (type-36256 source-36257 name-36258 var-36259) (make-struct/no-tail (vector-ref %expanded-vtables 3) - source-29321 - name-29322 - var-29323))) - (build-lexical-assignment-6520 - (lambda (source-17743 name-17744 var-17745 exp-17746) + source-36257 + name-36258 + var-36259))) + (build-lexical-assignment-4521 + (lambda (source-18842 name-18843 var-18844 exp-18845) (begin - (if (if (struct? exp-17746) - (eq? (struct-vtable exp-17746) - (vector-ref %expanded-vtables 13)) + (if (if (struct? exp-18845) + (eq? (struct-vtable exp-18845) + (vector-ref %expanded-vtables 14)) #f) - (let ((meta-17762 (struct-ref exp-17746 1))) - (if (not (assq 'name meta-17762)) - (let ((v-17769 - (cons (cons 'name name-17744) meta-17762))) - (struct-set! exp-17746 1 v-17769))))) + (let ((meta-18861 (struct-ref exp-18845 1))) + (if (not (assq 'name meta-18861)) + (let ((v-18868 + (cons (cons 'name name-18843) meta-18861))) + (struct-set! exp-18845 1 v-18868))))) (make-struct/no-tail (vector-ref %expanded-vtables 4) - source-17743 - name-17744 - var-17745 - exp-17746)))) - (analyze-variable-6521 - (lambda (mod-29329 - var-29330 - modref-cont-29331 - bare-cont-29332) - (if (not mod-29329) - (bare-cont-29332 var-29330) - (let ((kind-29333 (car mod-29329)) - (mod-29334 (cdr mod-29329))) - (if (eqv? kind-29333 'public) - (modref-cont-29331 mod-29334 var-29330 #t) - (if (eqv? kind-29333 'private) - (if (not (equal? mod-29334 (module-name (current-module)))) - (modref-cont-29331 mod-29334 var-29330 #f) - (bare-cont-29332 var-29330)) - (if (eqv? kind-29333 'bare) - (bare-cont-29332 var-29330) - (if (eqv? kind-29333 'hygiene) + source-18842 + name-18843 + var-18844 + exp-18845)))) + (analyze-variable-4522 + (lambda (mod-36265 + var-36266 + modref-cont-36267 + bare-cont-36268) + (if (not mod-36265) + (bare-cont-36268 var-36266) + (let ((kind-36269 (car mod-36265)) + (mod-36270 (cdr mod-36265))) + (if (eqv? kind-36269 'public) + (modref-cont-36267 mod-36270 var-36266 #t) + (if (eqv? kind-36269 'private) + (if (not (equal? mod-36270 (module-name (current-module)))) + (modref-cont-36267 mod-36270 var-36266 #f) + (bare-cont-36268 var-36266)) + (if (eqv? kind-36269 'bare) + (bare-cont-36268 var-36266) + (if (eqv? kind-36269 'hygiene) (if (if (not (equal? - mod-29334 + mod-36270 (module-name (current-module)))) (module-variable - (resolve-module mod-29334) - var-29330) + (resolve-module mod-36270) + var-36266) #f) - (modref-cont-29331 mod-29334 var-29330 #f) - (bare-cont-29332 var-29330)) + (modref-cont-36267 mod-36270 var-36266 #f) + (bare-cont-36268 var-36266)) (syntax-violation #f "bad module kind" - var-29330 - mod-29334))))))))) - (build-global-reference-6522 - (lambda (source-29349 var-29350 mod-29351) - (analyze-variable-6521 - mod-29351 - var-29350 - (lambda (mod-29354 var-29355 public?-29356) + var-36266 + mod-36270))))))))) + (build-global-reference-4523 + (lambda (source-36285 var-36286 mod-36287) + (analyze-variable-4522 + mod-36287 + var-36286 + (lambda (mod-36290 var-36291 public?-36292) (make-struct/no-tail (vector-ref %expanded-vtables 5) - source-29349 - mod-29354 - var-29355 - public?-29356)) - (lambda (var-29364) + source-36285 + mod-36290 + var-36291 + public?-36292)) + (lambda (var-36299) (make-struct/no-tail (vector-ref %expanded-vtables 7) - source-29349 - var-29364))))) - (build-global-assignment-6523 - (lambda (source-17778 var-17779 exp-17780 mod-17781) + source-36285 + var-36299))))) + (build-global-assignment-4524 + (lambda (source-18877 var-18878 exp-18879 mod-18880) (begin - (if (if (struct? exp-17780) - (eq? (struct-vtable exp-17780) - (vector-ref %expanded-vtables 13)) + (if (if (struct? exp-18879) + (eq? (struct-vtable exp-18879) + (vector-ref %expanded-vtables 14)) #f) - (let ((meta-17797 (struct-ref exp-17780 1))) - (if (not (assq 'name meta-17797)) - (let ((v-17804 - (cons (cons 'name var-17779) meta-17797))) - (struct-set! exp-17780 1 v-17804))))) - (analyze-variable-6521 - mod-17781 - var-17779 - (lambda (mod-17809 var-17810 public?-17811) + (let ((meta-18896 (struct-ref exp-18879 1))) + (if (not (assq 'name meta-18896)) + (let ((v-18903 + (cons (cons 'name var-18878) meta-18896))) + (struct-set! exp-18879 1 v-18903))))) + (analyze-variable-4522 + mod-18880 + var-18878 + (lambda (mod-18908 var-18909 public?-18910) (make-struct/no-tail (vector-ref %expanded-vtables 6) - source-17778 - mod-17809 - var-17810 - public?-17811 - exp-17780)) - (lambda (var-17819) + source-18877 + mod-18908 + var-18909 + public?-18910 + exp-18879)) + (lambda (var-18918) (make-struct/no-tail (vector-ref %expanded-vtables 8) - source-17778 - var-17819 - exp-17780)))))) - (build-global-definition-6524 - (lambda (source-29370 var-29371 exp-29372) + source-18877 + var-18918 + exp-18879)))))) + (build-global-definition-4525 + (lambda (source-36304 var-36305 exp-36306) (begin - (if (if (struct? exp-29372) - (eq? (struct-vtable exp-29372) - (vector-ref %expanded-vtables 13)) + (if (if (struct? exp-36306) + (eq? (struct-vtable exp-36306) + (vector-ref %expanded-vtables 14)) #f) - (let ((meta-29388 (struct-ref exp-29372 1))) - (if (not (assq 'name meta-29388)) - (let ((v-29395 - (cons (cons 'name var-29371) meta-29388))) - (struct-set! exp-29372 1 v-29395))))) + (let ((meta-36322 (struct-ref exp-36306 1))) + (if (not (assq 'name meta-36322)) + (let ((v-36329 + (cons (cons 'name var-36305) meta-36322))) + (struct-set! exp-36306 1 v-36329))))) (make-struct/no-tail (vector-ref %expanded-vtables 9) - source-29370 - var-29371 - exp-29372)))) - (build-simple-lambda-6525 - (lambda (src-17825 - req-17826 - rest-17827 - vars-17828 - meta-17829 - exp-17830) - (let ((body-17836 + source-36304 + var-36305 + exp-36306)))) + (build-simple-lambda-4526 + (lambda (src-18924 + req-18925 + rest-18926 + vars-18927 + meta-18928 + exp-18929) + (let ((body-18935 (make-struct/no-tail - (vector-ref %expanded-vtables 14) - src-17825 - req-17826 + (vector-ref %expanded-vtables 15) + src-18924 + req-18925 #f - rest-17827 + rest-18926 #f '() - vars-17828 - exp-17830 + vars-18927 + exp-18929 #f))) (make-struct/no-tail - (vector-ref %expanded-vtables 13) - src-17825 - meta-17829 - body-17836)))) - (build-sequence-6530 - (lambda (src-29403 exps-29404) - (if (null? (cdr exps-29404)) - (car exps-29404) - (make-struct/no-tail - (vector-ref %expanded-vtables 12) - src-29403 - exps-29404)))) - (build-let-6531 - (lambda (src-17848 - ids-17849 - vars-17850 - val-exps-17851 - body-exp-17852) - (begin - (for-each - maybe-name-value!-6514 - ids-17849 - val-exps-17851) - (if (null? vars-17850) - body-exp-17852 + (vector-ref %expanded-vtables 14) + src-18924 + meta-18928 + body-18935)))) + (build-primcall-4529 + (lambda (src-18947 name-18948 args-18949) + (make-struct/no-tail + (vector-ref %expanded-vtables 12) + src-18947 + name-18948 + args-18949))) + (build-sequence-4532 + (lambda (src-36337 exps-36338) + (if (null? (cdr exps-36338)) + (car exps-36338) + (let ((head-36342 (car exps-36338)) + (tail-36343 + (build-sequence-4532 #f (cdr exps-36338)))) (make-struct/no-tail - (vector-ref %expanded-vtables 15) - src-17848 - ids-17849 - vars-17850 - val-exps-17851 - body-exp-17852))))) - (build-named-let-6532 - (lambda (src-17876 - ids-17877 - vars-17878 - val-exps-17879 - body-exp-17880) - (let ((f-17881 (car vars-17878)) - (f-name-17882 (car ids-17877)) - (vars-17883 (cdr vars-17878)) - (ids-17884 (cdr ids-17877))) - (let ((proc-17885 - (let ((body-17905 + (vector-ref %expanded-vtables 13) + src-36337 + head-36342 + tail-36343))))) + (build-named-let-4534 + (lambda (src-18955 + ids-18956 + vars-18957 + val-exps-18958 + body-exp-18959) + (let ((f-18960 (car vars-18957)) + (f-name-18961 (car ids-18956)) + (vars-18962 (cdr vars-18957)) + (ids-18963 (cdr ids-18956))) + (let ((proc-18964 + (let ((body-18984 (make-struct/no-tail - (vector-ref %expanded-vtables 14) - src-17876 - ids-17884 + (vector-ref %expanded-vtables 15) + src-18955 + ids-18963 #f #f #f '() - vars-17883 - body-exp-17880 + vars-18962 + body-exp-18959 #f))) (make-struct/no-tail - (vector-ref %expanded-vtables 13) - src-17876 + (vector-ref %expanded-vtables 14) + src-18955 '() - body-17905)))) + body-18984)))) (begin - (if (if (struct? proc-17885) - (eq? (struct-vtable proc-17885) - (vector-ref %expanded-vtables 13)) + (if (if (struct? proc-18964) + (eq? (struct-vtable proc-18964) + (vector-ref %expanded-vtables 14)) #f) - (let ((meta-17929 (struct-ref proc-17885 1))) - (if (not (assq 'name meta-17929)) - (let ((v-17936 - (cons (cons 'name f-name-17882) meta-17929))) - (struct-set! proc-17885 1 v-17936))))) + (let ((meta-19008 (struct-ref proc-18964 1))) + (if (not (assq 'name meta-19008)) + (let ((v-19015 + (cons (cons 'name f-name-18961) meta-19008))) + (struct-set! proc-18964 1 v-19015))))) (for-each - maybe-name-value!-6514 - ids-17884 - val-exps-17879) - (let ((names-17960 (list f-name-17882)) - (gensyms-17961 (list f-17881)) - (vals-17962 (list proc-17885)) - (body-17963 - (let ((fun-exp-17967 + maybe-name-value!-4515 + ids-18963 + val-exps-18958) + (let ((names-19039 (list f-name-18961)) + (gensyms-19040 (list f-18960)) + (vals-19041 (list proc-18964)) + (body-19042 + (let ((fun-exp-19046 (make-struct/no-tail (vector-ref %expanded-vtables 3) - src-17876 - f-name-17882 - f-17881))) + src-18955 + f-name-18961 + f-18960))) (make-struct/no-tail (vector-ref %expanded-vtables 11) - src-17876 - fun-exp-17967 - val-exps-17879)))) + src-18955 + fun-exp-19046 + val-exps-18958)))) (make-struct/no-tail - (vector-ref %expanded-vtables 16) - src-17876 + (vector-ref %expanded-vtables 17) + src-18955 #f - names-17960 - gensyms-17961 - vals-17962 - body-17963))))))) - (build-letrec-6533 - (lambda (src-17983 - in-order?-17984 - ids-17985 - vars-17986 - val-exps-17987 - body-exp-17988) - (if (null? vars-17986) - body-exp-17988 + names-19039 + gensyms-19040 + vals-19041 + body-19042))))))) + (build-letrec-4535 + (lambda (src-19062 + in-order?-19063 + ids-19064 + vars-19065 + val-exps-19066 + body-exp-19067) + (if (null? vars-19065) + body-exp-19067 (begin (for-each - maybe-name-value!-6514 - ids-17985 - val-exps-17987) + maybe-name-value!-4515 + ids-19064 + val-exps-19066) (make-struct/no-tail - (vector-ref %expanded-vtables 16) - src-17983 - in-order?-17984 - ids-17985 - vars-17986 - val-exps-17987 - body-exp-17988))))) - (source-annotation-6542 - (lambda (x-18014) - (if (if (vector? x-18014) - (if (= (vector-length x-18014) 4) - (eq? (vector-ref x-18014 0) 'syntax-object) + (vector-ref %expanded-vtables 17) + src-19062 + in-order?-19063 + ids-19064 + vars-19065 + val-exps-19066 + body-exp-19067))))) + (source-annotation-4544 + (lambda (x-19093) + (if (if (vector? x-19093) + (if (= (vector-length x-19093) 4) + (eq? (vector-ref x-19093 0) 'syntax-object) #f) #f) - (source-annotation-6542 (vector-ref x-18014 1)) - (if (pair? x-18014) - (let ((props-18029 (source-properties x-18014))) - (if (pair? props-18029) props-18029 #f)) + (source-annotation-4544 (vector-ref x-19093 1)) + (if (pair? x-19093) + (let ((props-19108 (source-properties x-19093))) + (if (pair? props-19108) props-19108 #f)) #f)))) - (extend-env-6543 - (lambda (labels-18031 bindings-18032 r-18033) - (if (null? labels-18031) - r-18033 - (extend-env-6543 - (cdr labels-18031) - (cdr bindings-18032) - (cons (cons (car labels-18031) (car bindings-18032)) - r-18033))))) - (extend-var-env-6544 - (lambda (labels-18034 vars-18035 r-18036) - (if (null? labels-18034) - r-18036 - (extend-var-env-6544 - (cdr labels-18034) - (cdr vars-18035) - (cons (cons (car labels-18034) - (cons 'lexical (car vars-18035))) - r-18036))))) - (macros-only-env-6545 - (lambda (r-18037) - (if (null? r-18037) + (extend-env-4545 + (lambda (labels-19110 bindings-19111 r-19112) + (if (null? labels-19110) + r-19112 + (extend-env-4545 + (cdr labels-19110) + (cdr bindings-19111) + (cons (cons (car labels-19110) (car bindings-19111)) + r-19112))))) + (extend-var-env-4546 + (lambda (labels-19113 vars-19114 r-19115) + (if (null? labels-19113) + r-19115 + (extend-var-env-4546 + (cdr labels-19113) + (cdr vars-19114) + (cons (cons (car labels-19113) + (cons 'lexical (car vars-19114))) + r-19115))))) + (macros-only-env-4547 + (lambda (r-19116) + (if (null? r-19116) '() - (let ((a-18038 (car r-18037))) - (if (eq? (car (cdr a-18038)) 'macro) - (cons a-18038 - (macros-only-env-6545 (cdr r-18037))) - (macros-only-env-6545 (cdr r-18037))))))) - (global-extend-6547 - (lambda (type-18040 sym-18041 val-18042) + (let ((a-19117 (car r-19116))) + (if (let ((t-19120 (car (cdr a-19117)))) + (if (eq? t-19120 'macro) + #t + (eq? t-19120 'syntax-parameter))) + (cons a-19117 + (macros-only-env-4547 (cdr r-19116))) + (macros-only-env-4547 (cdr r-19116))))))) + (global-extend-4548 + (lambda (type-19122 sym-19123 val-19124) (module-define! (current-module) - sym-18041 + sym-19123 (make-syntax-transformer - sym-18041 - type-18040 - val-18042)))) - (id?-6549 - (lambda (x-11853) - (if (symbol? x-11853) + sym-19123 + type-19122 + val-19124)))) + (id?-4550 + (lambda (x-11889) + (if (symbol? x-11889) #t - (if (if (vector? x-11853) - (if (= (vector-length x-11853) 4) - (eq? (vector-ref x-11853 0) 'syntax-object) + (if (if (vector? x-11889) + (if (= (vector-length x-11889) 4) + (eq? (vector-ref x-11889 0) 'syntax-object) #f) #f) - (symbol? (vector-ref x-11853 1)) + (symbol? (vector-ref x-11889 1)) #f)))) - (gen-labels-6552 - (lambda (ls-18052) - (if (null? ls-18052) + (gen-labels-4553 + (lambda (ls-19134) + (if (null? ls-19134) '() (cons (string-append "l-" - (session-id-6510) + (session-id-4511) (symbol->string (gensym "-"))) - (gen-labels-6552 (cdr ls-18052)))))) - (make-binding-wrap-6563 - (lambda (ids-18056 labels-18057 w-18058) - (if (null? ids-18056) - w-18058 - (cons (car w-18058) - (cons (let ((labelvec-18059 (list->vector labels-18057))) - (let ((n-18060 (vector-length labelvec-18059))) - (let ((symnamevec-18061 (make-vector n-18060)) - (marksvec-18062 (make-vector n-18060))) + (gen-labels-4553 (cdr ls-19134)))))) + (make-binding-wrap-4564 + (lambda (ids-19138 labels-19139 w-19140) + (if (null? ids-19138) + w-19140 + (cons (car w-19140) + (cons (let ((labelvec-19141 (list->vector labels-19139))) + (let ((n-19142 (vector-length labelvec-19141))) + (let ((symnamevec-19143 (make-vector n-19142)) + (marksvec-19144 (make-vector n-19142))) (begin (letrec* - ((f-18063 - (lambda (ids-18066 i-18067) - (if (not (null? ids-18066)) + ((f-19145 + (lambda (ids-19342 i-19343) + (if (not (null? ids-19342)) (call-with-values (lambda () - (let ((x-18070 (car ids-18066))) - (if (if (vector? x-18070) + (let ((x-19346 (car ids-19342))) + (if (if (vector? x-19346) (if (= (vector-length - x-18070) + x-19346) 4) (eq? (vector-ref - x-18070 + x-19346 0) 'syntax-object) #f) #f) (values - (vector-ref x-18070 1) - (let ((m1-18086 - (car w-18058)) - (m2-18087 + (vector-ref x-19346 1) + (let ((m1-19362 + (car w-19140)) + (m2-19363 (car (vector-ref - x-18070 + x-19346 2)))) - (if (null? m2-18087) - m1-18086 + (if (null? m2-19363) + m1-19362 (append - m1-18086 - m2-18087)))) + m1-19362 + m2-19363)))) (values - x-18070 - (car w-18058))))) - (lambda (symname-18107 marks-18108) + x-19346 + (car w-19140))))) + (lambda (symname-19383 marks-19384) (begin (vector-set! - symnamevec-18061 - i-18067 - symname-18107) + symnamevec-19143 + i-19343 + symname-19383) (vector-set! - marksvec-18062 - i-18067 - marks-18108) - (f-18063 - (cdr ids-18066) - (#{1+}# i-18067))))))))) - (f-18063 ids-18056 0)) + marksvec-19144 + i-19343 + marks-19384) + (f-19145 + (cdr ids-19342) + (#{1+}# i-19343))))))))) + (f-19145 ids-19138 0)) (vector 'ribcage - symnamevec-18061 - marksvec-18062 - labelvec-18059))))) - (cdr w-18058)))))) - (join-wraps-6565 - (lambda (w1-18117 w2-18118) - (let ((m1-18119 (car w1-18117)) - (s1-18120 (cdr w1-18117))) - (if (null? m1-18119) - (if (null? s1-18120) - w2-18118 - (cons (car w2-18118) - (let ((m2-18127 (cdr w2-18118))) - (if (null? m2-18127) - s1-18120 - (append s1-18120 m2-18127))))) - (cons (let ((m2-18136 (car w2-18118))) - (if (null? m2-18136) - m1-18119 - (append m1-18119 m2-18136))) - (let ((m2-18145 (cdr w2-18118))) - (if (null? m2-18145) - s1-18120 - (append s1-18120 m2-18145)))))))) - (same-marks?-6567 - (lambda (x-18150 y-18151) - (if (eq? x-18150 y-18151) - (eq? x-18150 y-18151) - (if (not (null? x-18150)) - (if (not (null? y-18151)) - (if (eq? (car x-18150) (car y-18151)) - (same-marks?-6567 (cdr x-18150) (cdr y-18151)) + symnamevec-19143 + marksvec-19144 + labelvec-19141))))) + (cdr w-19140)))))) + (same-marks?-4568 + (lambda (x-36344 y-36345) + (if (eq? x-36344 y-36345) + (eq? x-36344 y-36345) + (if (not (null? x-36344)) + (if (not (null? y-36345)) + (if (eq? (car x-36344) (car y-36345)) + (same-marks?-4568 (cdr x-36344) (cdr y-36345)) #f) #f) #f)))) - (id-var-name-6568 - (lambda (id-18159 w-18160) + (id-var-name-4569 + (lambda (id-36353 w-36354 mod-36355) (letrec* - ((search-18161 - (lambda (sym-18222 subst-18223 marks-18224) - (if (null? subst-18223) - (values #f marks-18224) - (let ((fst-18225 (car subst-18223))) - (if (eq? fst-18225 'shift) - (search-18161 - sym-18222 - (cdr subst-18223) - (cdr marks-18224)) - (let ((symnames-18227 (vector-ref fst-18225 1))) - (if (vector? symnames-18227) - (let ((n-18239 (vector-length symnames-18227))) - (letrec* - ((f-18240 - (lambda (i-18242) - (if (= i-18242 n-18239) - (search-18161 - sym-18222 - (cdr subst-18223) - marks-18224) - (if (if (eq? (vector-ref - symnames-18227 - i-18242) - sym-18222) - (same-marks?-6567 - marks-18224 - (vector-ref - (vector-ref fst-18225 2) - i-18242)) - #f) - (values - (vector-ref - (vector-ref fst-18225 3) - i-18242) - marks-18224) - (f-18240 (#{1+}# i-18242))))))) - (f-18240 0))) - (letrec* - ((f-18275 - (lambda (symnames-18277 i-18278) - (if (null? symnames-18277) - (search-18161 - sym-18222 - (cdr subst-18223) - marks-18224) - (if (if (eq? (car symnames-18277) sym-18222) - (same-marks?-6567 - marks-18224 - (list-ref - (vector-ref fst-18225 2) - i-18278)) - #f) - (values - (list-ref - (vector-ref fst-18225 3) - i-18278) - marks-18224) - (f-18275 - (cdr symnames-18277) - (#{1+}# i-18278))))))) - (f-18275 symnames-18227 0)))))))))) - (if (symbol? id-18159) - (let ((t-18164 - (search-18161 - id-18159 - (cdr w-18160) - (car w-18160)))) - (if t-18164 t-18164 id-18159)) - (if (if (vector? id-18159) - (if (= (vector-length id-18159) 4) - (eq? (vector-ref id-18159 0) 'syntax-object) + ((search-36356 + (lambda (sym-36422 subst-36423 marks-36424 mod-36425) + (if (null? subst-36423) + (values #f marks-36424) + (let ((fst-36426 (car subst-36423))) + (if (eq? fst-36426 'shift) + (search-36356 + sym-36422 + (cdr subst-36423) + (cdr marks-36424) + mod-36425) + (let ((symnames-36428 (vector-ref fst-36426 1))) + (if (vector? symnames-36428) + (search-vector-rib-36358 + sym-36422 + subst-36423 + marks-36424 + symnames-36428 + fst-36426 + mod-36425) + (search-list-rib-36357 + sym-36422 + subst-36423 + marks-36424 + symnames-36428 + fst-36426 + mod-36425)))))))) + (search-list-rib-36357 + (lambda (sym-36603 + subst-36604 + marks-36605 + symnames-36606 + ribcage-36607 + mod-36608) + (letrec* + ((f-36609 + (lambda (symnames-36612 i-36613) + (if (null? symnames-36612) + (search-36356 + sym-36603 + (cdr subst-36604) + marks-36605 + mod-36608) + (if (if (eq? (car symnames-36612) sym-36603) + (same-marks?-4568 + marks-36605 + (list-ref + (vector-ref ribcage-36607 2) + i-36613)) + #f) + (let ((n-36759 + (list-ref + (vector-ref ribcage-36607 3) + i-36613))) + (if (pair? n-36759) + (if (equal? mod-36608 (car n-36759)) + (values (cdr n-36759) marks-36605) + (f-36609 + (cdr symnames-36612) + (#{1+}# i-36613))) + (values n-36759 marks-36605))) + (f-36609 (cdr symnames-36612) (#{1+}# i-36613))))))) + (f-36609 symnames-36606 0)))) + (search-vector-rib-36358 + (lambda (sym-36764 + subst-36765 + marks-36766 + symnames-36767 + ribcage-36768 + mod-36769) + (let ((n-36770 (vector-length symnames-36767))) + (letrec* + ((f-36771 + (lambda (i-36774) + (if (= i-36774 n-36770) + (search-36356 + sym-36764 + (cdr subst-36765) + marks-36766 + mod-36769) + (if (if (eq? (vector-ref symnames-36767 i-36774) + sym-36764) + (same-marks?-4568 + marks-36766 + (vector-ref + (vector-ref ribcage-36768 2) + i-36774)) + #f) + (let ((n-36921 + (vector-ref + (vector-ref ribcage-36768 3) + i-36774))) + (if (pair? n-36921) + (if (equal? mod-36769 (car n-36921)) + (values (cdr n-36921) marks-36766) + (f-36771 (#{1+}# i-36774))) + (values n-36921 marks-36766))) + (f-36771 (#{1+}# i-36774))))))) + (f-36771 0)))))) + (if (symbol? id-36353) + (let ((t-36359 + (search-36356 + id-36353 + (cdr w-36354) + (car w-36354) + mod-36355))) + (if t-36359 t-36359 id-36353)) + (if (if (vector? id-36353) + (if (= (vector-length id-36353) 4) + (eq? (vector-ref id-36353 0) 'syntax-object) #f) #f) - (let ((id-18179 (vector-ref id-18159 1)) - (w1-18180 (vector-ref id-18159 2))) - (let ((marks-18181 - (let ((m1-18191 (car w-18160)) - (m2-18192 (car w1-18180))) - (if (null? m2-18192) - m1-18191 - (append m1-18191 m2-18192))))) + (let ((id-36374 (vector-ref id-36353 1)) + (w1-36375 (vector-ref id-36353 2)) + (mod-36376 (vector-ref id-36353 3))) + (let ((marks-36377 + (let ((m1-36387 (car w-36354)) + (m2-36388 (car w1-36375))) + (if (null? m2-36388) + m1-36387 + (append m1-36387 m2-36388))))) (call-with-values (lambda () - (search-18161 id-18179 (cdr w-18160) marks-18181)) - (lambda (new-id-18208 marks-18209) - (if new-id-18208 - new-id-18208 - (let ((t-18217 - (search-18161 - id-18179 - (cdr w1-18180) - marks-18209))) - (if t-18217 t-18217 id-18179))))))) + (search-36356 + id-36374 + (cdr w-36354) + marks-36377 + mod-36376)) + (lambda (new-id-36408 marks-36409) + (if new-id-36408 + new-id-36408 + (let ((t-36417 + (search-36356 + id-36374 + (cdr w1-36375) + marks-36409 + mod-36376))) + (if t-36417 t-36417 id-36374))))))) (syntax-violation 'id-var-name "invalid id" - id-18159)))))) - (locally-bound-identifiers-6569 - (lambda (w-18300 mod-18301) + id-36353)))))) + (locally-bound-identifiers-4570 + (lambda (w-19391 mod-19392) (letrec* - ((scan-18302 - (lambda (subst-18307 results-18308) - (if (null? subst-18307) - results-18308 - (let ((fst-18309 (car subst-18307))) - (if (eq? fst-18309 'shift) - (scan-18302 (cdr subst-18307) results-18308) - (let ((symnames-18311 (vector-ref fst-18309 1)) - (marks-18312 (vector-ref fst-18309 2))) - (if (vector? symnames-18311) - (scan-vector-rib-18304 - subst-18307 - symnames-18311 - marks-18312 - results-18308) - (scan-list-rib-18303 - subst-18307 - symnames-18311 - marks-18312 - results-18308)))))))) - (scan-list-rib-18303 - (lambda (subst-18410 - symnames-18411 - marks-18412 - results-18413) + ((scan-19393 + (lambda (subst-19398 results-19399) + (if (null? subst-19398) + results-19399 + (let ((fst-19400 (car subst-19398))) + (if (eq? fst-19400 'shift) + (scan-19393 (cdr subst-19398) results-19399) + (let ((symnames-19402 (vector-ref fst-19400 1)) + (marks-19403 (vector-ref fst-19400 2))) + (if (vector? symnames-19402) + (scan-vector-rib-19395 + subst-19398 + symnames-19402 + marks-19403 + results-19399) + (scan-list-rib-19394 + subst-19398 + symnames-19402 + marks-19403 + results-19399)))))))) + (scan-list-rib-19394 + (lambda (subst-19520 + symnames-19521 + marks-19522 + results-19523) (letrec* - ((f-18414 - (lambda (symnames-18514 marks-18515 results-18516) - (if (null? symnames-18514) - (scan-18302 (cdr subst-18410) results-18516) - (f-18414 - (cdr symnames-18514) - (cdr marks-18515) - (cons (wrap-6578 - (car symnames-18514) - (let ((w-18524 - (cons (car marks-18515) - subst-18410))) - (cons (cons #f (car w-18524)) - (cons 'shift (cdr w-18524)))) - mod-18301) - results-18516)))))) - (f-18414 - symnames-18411 - marks-18412 - results-18413)))) - (scan-vector-rib-18304 - (lambda (subst-18525 - symnames-18526 - marks-18527 - results-18528) - (let ((n-18529 (vector-length symnames-18526))) + ((f-19524 + (lambda (symnames-19709 marks-19710 results-19711) + (if (null? symnames-19709) + (scan-19393 (cdr subst-19520) results-19711) + (f-19524 + (cdr symnames-19709) + (cdr marks-19710) + (cons (let ((x-19717 (car symnames-19709)) + (w-19718 + (let ((w-19722 + (cons (car marks-19710) + subst-19520))) + (cons (cons #f (car w-19722)) + (cons 'shift + (cdr w-19722)))))) + (if (if (null? (car w-19718)) + (null? (cdr w-19718)) + #f) + x-19717 + (if (if (vector? x-19717) + (if (= (vector-length x-19717) 4) + (eq? (vector-ref x-19717 0) + 'syntax-object) + #f) + #f) + (let ((expression-19734 + (vector-ref x-19717 1)) + (wrap-19735 + (let ((w2-19743 + (vector-ref x-19717 2))) + (let ((m1-19744 (car w-19718)) + (s1-19745 + (cdr w-19718))) + (if (null? m1-19744) + (if (null? s1-19745) + w2-19743 + (cons (car w2-19743) + (let ((m2-19756 + (cdr w2-19743))) + (if (null? m2-19756) + s1-19745 + (append + s1-19745 + m2-19756))))) + (cons (let ((m2-19764 + (car w2-19743))) + (if (null? m2-19764) + m1-19744 + (append + m1-19744 + m2-19764))) + (let ((m2-19772 + (cdr w2-19743))) + (if (null? m2-19772) + s1-19745 + (append + s1-19745 + m2-19772)))))))) + (module-19736 + (vector-ref x-19717 3))) + (vector + 'syntax-object + expression-19734 + wrap-19735 + module-19736)) + (if (null? x-19717) + x-19717 + (vector + 'syntax-object + x-19717 + w-19718 + mod-19392))))) + results-19711)))))) + (f-19524 + symnames-19521 + marks-19522 + results-19523)))) + (scan-vector-rib-19395 + (lambda (subst-19785 + symnames-19786 + marks-19787 + results-19788) + (let ((n-19789 (vector-length symnames-19786))) (letrec* - ((f-18530 - (lambda (i-18613 results-18614) - (if (= i-18613 n-18529) - (scan-18302 (cdr subst-18525) results-18614) - (f-18530 - (#{1+}# i-18613) - (cons (wrap-6578 - (vector-ref symnames-18526 i-18613) - (let ((w-18622 - (cons (vector-ref - marks-18527 - i-18613) - subst-18525))) - (cons (cons #f (car w-18622)) - (cons 'shift (cdr w-18622)))) - mod-18301) - results-18614)))))) - (f-18530 0 results-18528)))))) - (scan-18302 (cdr w-18300) '())))) - (valid-bound-ids?-6575 - (lambda (ids-18623) + ((f-19790 + (lambda (i-19961 results-19962) + (if (= i-19961 n-19789) + (scan-19393 (cdr subst-19785) results-19962) + (f-19790 + (#{1+}# i-19961) + (cons (let ((x-19968 + (vector-ref symnames-19786 i-19961)) + (w-19969 + (let ((w-19973 + (cons (vector-ref + marks-19787 + i-19961) + subst-19785))) + (cons (cons #f (car w-19973)) + (cons 'shift + (cdr w-19973)))))) + (if (if (null? (car w-19969)) + (null? (cdr w-19969)) + #f) + x-19968 + (if (if (vector? x-19968) + (if (= (vector-length x-19968) 4) + (eq? (vector-ref x-19968 0) + 'syntax-object) + #f) + #f) + (let ((expression-19985 + (vector-ref x-19968 1)) + (wrap-19986 + (let ((w2-19994 + (vector-ref + x-19968 + 2))) + (let ((m1-19995 + (car w-19969)) + (s1-19996 + (cdr w-19969))) + (if (null? m1-19995) + (if (null? s1-19996) + w2-19994 + (cons (car w2-19994) + (let ((m2-20007 + (cdr w2-19994))) + (if (null? m2-20007) + s1-19996 + (append + s1-19996 + m2-20007))))) + (cons (let ((m2-20015 + (car w2-19994))) + (if (null? m2-20015) + m1-19995 + (append + m1-19995 + m2-20015))) + (let ((m2-20023 + (cdr w2-19994))) + (if (null? m2-20023) + s1-19996 + (append + s1-19996 + m2-20023)))))))) + (module-19987 + (vector-ref x-19968 3))) + (vector + 'syntax-object + expression-19985 + wrap-19986 + module-19987)) + (if (null? x-19968) + x-19968 + (vector + 'syntax-object + x-19968 + w-19969 + mod-19392))))) + results-19962)))))) + (f-19790 0 results-19788)))))) + (scan-19393 (cdr w-19391) '())))) + (resolve-identifier-4571 + (lambda (id-20036 + w-20037 + r-20038 + mod-20039 + resolve-syntax-parameters?-20040) + (let ((n-20044 + (id-var-name-4569 id-20036 w-20037 mod-20039))) + (if (if (vector? n-20044) + (if (= (vector-length n-20044) 4) + (eq? (vector-ref n-20044 0) 'syntax-object) + #f) + #f) + (resolve-identifier-4571 + n-20044 + w-20037 + r-20038 + mod-20039 + resolve-syntax-parameters?-20040) + (if (symbol? n-20044) + (let ((mod-20059 + (if (if (vector? id-20036) + (if (= (vector-length id-20036) 4) + (eq? (vector-ref id-20036 0) 'syntax-object) + #f) + #f) + (vector-ref id-20036 3) + mod-20039))) + (let ((b-20060 + (let ((b-20063 + (let ((t-20064 + (begin + (if (if (not mod-20059) + (current-module) + #f) + (warn "module system is booted, we should have a module" + n-20044)) + (let ((v-20113 + (module-variable + (if mod-20059 + (resolve-module + (cdr mod-20059)) + (current-module)) + n-20044))) + (if v-20113 + (if (variable-bound? v-20113) + (let ((val-20122 + (variable-ref + v-20113))) + (if (macro? val-20122) + (if (macro-type val-20122) + (cons (macro-type + val-20122) + (macro-binding + val-20122)) + #f) + #f)) + #f) + #f))))) + (if t-20064 t-20064 '(global))))) + (if (if resolve-syntax-parameters?-20040 + (eq? (car b-20063) 'syntax-parameter) + #f) + (let ((t-20131 (assq-ref r-20038 (cdr b-20063)))) + (if t-20131 + t-20131 + (cons 'macro (car (cdr b-20063))))) + b-20063)))) + (if (eq? (car b-20060) 'global) + (values 'global n-20044 mod-20059) + (values (car b-20060) (cdr b-20060) mod-20059)))) + (if (string? n-20044) + (let ((mod-20137 + (if (if (vector? id-20036) + (if (= (vector-length id-20036) 4) + (eq? (vector-ref id-20036 0) 'syntax-object) + #f) + #f) + (vector-ref id-20036 3) + mod-20039))) + (let ((b-20138 + (let ((b-20141 + (let ((t-20142 (assq-ref r-20038 n-20044))) + (if t-20142 + t-20142 + '(displaced-lexical))))) + (if (if resolve-syntax-parameters?-20040 + (eq? (car b-20141) 'syntax-parameter) + #f) + (let ((t-20143 + (assq-ref r-20038 (cdr b-20141)))) + (if t-20143 + t-20143 + (cons 'macro (car (cdr b-20141))))) + b-20141)))) + (values (car b-20138) (cdr b-20138) mod-20137))) + (error "unexpected id-var-name" + id-20036 + w-20037 + n-20044))))))) + (free-id=?-4574 + (lambda (i-20156 j-20157) + (let ((mi-20158 + (if (if (vector? i-20156) + (if (= (vector-length i-20156) 4) + (eq? (vector-ref i-20156 0) 'syntax-object) + #f) + #f) + (vector-ref i-20156 3) + #f))) + (let ((mj-20159 + (if (if (vector? j-20157) + (if (= (vector-length j-20157) 4) + (eq? (vector-ref j-20157 0) 'syntax-object) + #f) + #f) + (vector-ref j-20157 3) + #f))) + (let ((ni-20160 + (id-var-name-4569 i-20156 '(()) mi-20158))) + (let ((nj-20161 + (id-var-name-4569 j-20157 '(()) mj-20159))) + (if (if (vector? ni-20160) + (if (= (vector-length ni-20160) 4) + (eq? (vector-ref ni-20160 0) 'syntax-object) + #f) + #f) + (free-id=?-4574 ni-20160 j-20157) + (if (if (vector? nj-20161) + (if (= (vector-length nj-20161) 4) + (eq? (vector-ref nj-20161 0) 'syntax-object) + #f) + #f) + (free-id=?-4574 i-20156 nj-20161) + (if (symbol? ni-20160) + (if (eq? nj-20161 + (if (if (vector? j-20157) + (if (= (vector-length j-20157) 4) + (eq? (vector-ref j-20157 0) + 'syntax-object) + #f) + #f) + (vector-ref j-20157 1) + j-20157)) + (if (let ((bi-20233 + (module-variable + (if mi-20158 + (resolve-module (cdr mi-20158)) + (current-module)) + (if (if (vector? i-20156) + (if (= (vector-length i-20156) 4) + (eq? (vector-ref i-20156 0) + 'syntax-object) + #f) + #f) + (vector-ref i-20156 1) + i-20156)))) + (if bi-20233 + (eq? bi-20233 + (module-variable + (if mj-20159 + (resolve-module (cdr mj-20159)) + (current-module)) + (if (if (vector? j-20157) + (if (= (vector-length j-20157) 4) + (eq? (vector-ref j-20157 0) + 'syntax-object) + #f) + #f) + (vector-ref j-20157 1) + j-20157))) + (if (not (module-variable + (if mj-20159 + (resolve-module (cdr mj-20159)) + (current-module)) + (if (if (vector? j-20157) + (if (= (vector-length + j-20157) + 4) + (eq? (vector-ref j-20157 0) + 'syntax-object) + #f) + #f) + (vector-ref j-20157 1) + j-20157))) + (eq? ni-20160 nj-20161) + #f))) + (eq? (module-variable + (if mi-20158 + (resolve-module (cdr mi-20158)) + (current-module)) + (if (if (vector? i-20156) + (if (= (vector-length i-20156) 4) + (eq? (vector-ref i-20156 0) + 'syntax-object) + #f) + #f) + (vector-ref i-20156 1) + i-20156)) + (module-variable + (if mj-20159 + (resolve-module (cdr mj-20159)) + (current-module)) + (if (if (vector? j-20157) + (if (= (vector-length j-20157) 4) + (eq? (vector-ref j-20157 0) + 'syntax-object) + #f) + #f) + (vector-ref j-20157 1) + j-20157))) + #f) + #f) + (equal? ni-20160 nj-20161)))))))))) + (bound-id=?-4575 + (lambda (i-20426 j-20427) + (if (if (if (vector? i-20426) + (if (= (vector-length i-20426) 4) + (eq? (vector-ref i-20426 0) 'syntax-object) + #f) + #f) + (if (vector? j-20427) + (if (= (vector-length j-20427) 4) + (eq? (vector-ref j-20427 0) 'syntax-object) + #f) + #f) + #f) + (if (eq? (vector-ref i-20426 1) + (vector-ref j-20427 1)) + (same-marks?-4568 + (car (vector-ref i-20426 2)) + (car (vector-ref j-20427 2))) + #f) + (eq? i-20426 j-20427)))) + (valid-bound-ids?-4576 + (lambda (ids-20596) (if (letrec* - ((all-ids?-18624 - (lambda (ids-18786) - (if (null? ids-18786) - (null? ids-18786) - (if (let ((x-18797 (car ids-18786))) - (if (symbol? x-18797) + ((all-ids?-20597 + (lambda (ids-20794) + (if (null? ids-20794) + (null? ids-20794) + (if (let ((x-20805 (car ids-20794))) + (if (symbol? x-20805) #t - (if (if (vector? x-18797) - (if (= (vector-length x-18797) 4) - (eq? (vector-ref x-18797 0) + (if (if (vector? x-20805) + (if (= (vector-length x-20805) 4) + (eq? (vector-ref x-20805 0) 'syntax-object) #f) #f) - (symbol? (vector-ref x-18797 1)) + (symbol? (vector-ref x-20805 1)) #f))) - (all-ids?-18624 (cdr ids-18786)) + (all-ids?-20597 (cdr ids-20794)) #f))))) - (all-ids?-18624 ids-18623)) - (distinct-bound-ids?-6576 ids-18623) + (all-ids?-20597 ids-20596)) + (distinct-bound-ids?-4577 ids-20596) #f))) - (distinct-bound-ids?-6576 - (lambda (ids-18925) + (distinct-bound-ids?-4577 + (lambda (ids-20926) (letrec* - ((distinct?-18926 - (lambda (ids-19038) - (if (null? ids-19038) - (null? ids-19038) - (if (not (bound-id-member?-6577 - (car ids-19038) - (cdr ids-19038))) - (distinct?-18926 (cdr ids-19038)) + ((distinct?-20927 + (lambda (ids-21032) + (if (null? ids-21032) + (null? ids-21032) + (if (not (bound-id-member?-4578 + (car ids-21032) + (cdr ids-21032))) + (distinct?-20927 (cdr ids-21032)) #f))))) - (distinct?-18926 ids-18925)))) - (bound-id-member?-6577 - (lambda (x-19248 list-19249) - (if (not (null? list-19249)) - (let ((t-19250 - (let ((j-19331 (car list-19249))) - (if (if (if (vector? x-19248) - (if (= (vector-length x-19248) 4) - (eq? (vector-ref x-19248 0) 'syntax-object) - #f) - #f) - (if (vector? j-19331) - (if (= (vector-length j-19331) 4) - (eq? (vector-ref j-19331 0) 'syntax-object) - #f) - #f) - #f) - (if (eq? (vector-ref x-19248 1) - (vector-ref j-19331 1)) - (same-marks?-6567 - (car (vector-ref x-19248 2)) - (car (vector-ref j-19331 2))) - #f) - (eq? x-19248 j-19331))))) - (if t-19250 - t-19250 - (bound-id-member?-6577 x-19248 (cdr list-19249)))) + (distinct?-20927 ids-20926)))) + (bound-id-member?-4578 + (lambda (x-21128 list-21129) + (if (not (null? list-21129)) + (let ((t-21130 + (bound-id=?-4575 x-21128 (car list-21129)))) + (if t-21130 + t-21130 + (bound-id-member?-4578 x-21128 (cdr list-21129)))) #f))) - (wrap-6578 - (lambda (x-19375 w-19376 defmod-19377) - (if (if (null? (car w-19376)) - (null? (cdr w-19376)) - #f) - x-19375 - (if (if (vector? x-19375) - (if (= (vector-length x-19375) 4) - (eq? (vector-ref x-19375 0) 'syntax-object) - #f) + (source-wrap-4580 + (lambda (x-21308 w-21309 s-21310 defmod-21311) + (let ((x-21315 + (begin + (if (if (pair? x-21308) s-21310 #f) + (set-source-properties! x-21308 s-21310)) + x-21308))) + (if (if (null? (car w-21309)) + (null? (cdr w-21309)) #f) - (let ((expression-19391 (vector-ref x-19375 1)) - (wrap-19392 - (join-wraps-6565 w-19376 (vector-ref x-19375 2))) - (module-19393 (vector-ref x-19375 3))) - (vector - 'syntax-object - expression-19391 - wrap-19392 - module-19393)) - (if (null? x-19375) - x-19375 - (vector - 'syntax-object - x-19375 - w-19376 - defmod-19377)))))) - (source-wrap-6579 - (lambda (x-19410 w-19411 s-19412 defmod-19413) - (wrap-6578 - (begin - (if (if (pair? x-19410) s-19412 #f) - (set-source-properties! x-19410 s-19412)) - x-19410) - w-19411 - defmod-19413))) - (expand-sequence-6580 - (lambda (body-29409 r-29410 w-29411 s-29412 mod-29413) - (build-sequence-6530 - s-29412 + x-21315 + (if (if (vector? x-21315) + (if (= (vector-length x-21315) 4) + (eq? (vector-ref x-21315 0) 'syntax-object) + #f) + #f) + (let ((expression-21347 (vector-ref x-21315 1)) + (wrap-21348 + (let ((w2-21356 (vector-ref x-21315 2))) + (let ((m1-21357 (car w-21309)) + (s1-21358 (cdr w-21309))) + (if (null? m1-21357) + (if (null? s1-21358) + w2-21356 + (cons (car w2-21356) + (let ((m2-21373 (cdr w2-21356))) + (if (null? m2-21373) + s1-21358 + (append s1-21358 m2-21373))))) + (cons (let ((m2-21381 (car w2-21356))) + (if (null? m2-21381) + m1-21357 + (append m1-21357 m2-21381))) + (let ((m2-21389 (cdr w2-21356))) + (if (null? m2-21389) + s1-21358 + (append s1-21358 m2-21389)))))))) + (module-21349 (vector-ref x-21315 3))) + (vector + 'syntax-object + expression-21347 + wrap-21348 + module-21349)) + (if (null? x-21315) + x-21315 + (vector + 'syntax-object + x-21315 + w-21309 + defmod-21311))))))) + (expand-sequence-4581 + (lambda (body-36926 r-36927 w-36928 s-36929 mod-36930) + (build-sequence-4532 + s-36929 (letrec* - ((dobody-29493 - (lambda (body-29833 r-29834 w-29835 mod-29836) - (if (null? body-29833) + ((dobody-37018 + (lambda (body-37101 r-37102 w-37103 mod-37104) + (if (null? body-37101) '() - (let ((first-29837 - (let ((e-29841 (car body-29833))) - (call-with-values - (lambda () - (syntax-type-6584 - e-29841 - r-29834 - w-29835 - (source-annotation-6542 e-29841) - #f - mod-29836 - #f)) - (lambda (type-29848 - value-29849 - form-29850 - e-29851 - w-29852 - s-29853 - mod-29854) - (expand-expr-6586 - type-29848 - value-29849 - form-29850 - e-29851 - r-29834 - w-29852 - s-29853 - mod-29854)))))) - (cons first-29837 - (dobody-29493 - (cdr body-29833) - r-29834 - w-29835 - mod-29836))))))) - (dobody-29493 - body-29409 - r-29410 - w-29411 - mod-29413))))) - (expand-top-sequence-6581 - (lambda (body-19431 - r-19432 - w-19433 - s-19434 - m-19435 - esew-19436 - mod-19437) - (letrec* - ((scan-19438 - (lambda (body-19569 - r-19570 - w-19571 - s-19572 - m-19573 - esew-19574 - mod-19575 - exps-19576) - (if (null? body-19569) - exps-19576 - (call-with-values - (lambda () + (let ((first-37105 + (expand-4586 + (car body-37101) + r-37102 + w-37103 + mod-37104))) + (cons first-37105 + (dobody-37018 + (cdr body-37101) + r-37102 + w-37103 + mod-37104))))))) + (dobody-37018 + body-36926 + r-36927 + w-36928 + mod-36930))))) + (expand-top-sequence-4582 + (lambda (body-21418 + r-21419 + w-21420 + s-21421 + m-21422 + esew-21423 + mod-21424) + (let ((r-21425 + (cons '("placeholder" placeholder) r-21419))) + (let ((ribcage-21426 (vector 'ribcage '() '() '()))) + (let ((w-21427 + (cons (car w-21420) + (cons ribcage-21426 (cdr w-21420))))) + (letrec* + ((record-definition!-21428 + (lambda (id-24805 var-24806) + (let ((mod-24807 + (cons 'hygiene (module-name (current-module))))) + (let ((label-24813 + (cons (vector-ref id-24805 3) + (if (if (vector? var-24806) + (if (= (vector-length var-24806) 4) + (eq? (vector-ref var-24806 0) + 'syntax-object) + #f) + #f) + (let ((expression-24875 + (vector-ref var-24806 1)) + (wrap-24876 + (let ((w2-24886 + (vector-ref + var-24806 + 2))) + (cons (let ((m2-24893 + (car w2-24886))) + (if (null? m2-24893) + '(top) + (append + '(top) + m2-24893))) + (let ((m2-24902 + (cdr w2-24886))) + (if (null? m2-24902) + '() + (append + '() + m2-24902)))))) + (module-24877 + (vector-ref var-24806 3))) + (vector + 'syntax-object + expression-24875 + wrap-24876 + module-24877)) + (if (null? var-24806) + var-24806 + (vector + 'syntax-object + var-24806 + '((top)) + mod-24807)))))) + (begin + (let ((update-24816 + (cons (vector-ref id-24805 1) + (vector-ref ribcage-21426 1)))) + (vector-set! ribcage-21426 1 update-24816)) + (let ((update-24831 + (cons (car (vector-ref id-24805 2)) + (vector-ref ribcage-21426 2)))) + (vector-set! ribcage-21426 2 update-24831)) + (let ((update-24846 + (cons label-24813 + (vector-ref ribcage-21426 3)))) + (vector-set! ribcage-21426 3 update-24846))))))) + (parse-21431 + (lambda (body-21626 + r-21627 + w-21628 + s-21629 + m-21630 + esew-21631 + mod-21632) + (letrec* + ((lp-21633 + (lambda (body-21716 exps-21717) + (if (null? body-21716) + exps-21717 + (lp-21633 + (cdr body-21716) + (append + (parse1-21432 + (car body-21716) + r-21627 + w-21628 + s-21629 + m-21630 + esew-21631 + mod-21632) + exps-21717)))))) + (lp-21633 body-21626 '())))) + (parse1-21432 + (lambda (x-21787 + r-21788 + w-21789 + s-21790 + m-21791 + esew-21792 + mod-21793) (call-with-values (lambda () - (let ((e-19577 (car body-19569))) - (syntax-type-6584 - e-19577 - r-19570 - w-19571 - (let ((t-19581 (source-annotation-6542 e-19577))) - (if t-19581 t-19581 s-19572)) - #f - mod-19575 - #f))) - (lambda (type-19816 - value-19817 - form-19818 - e-19819 - w-19820 - s-19821 - mod-19822) - (if (eqv? type-19816 'begin-form) - (let ((tmp-19827 ($sc-dispatch e-19819 '(_)))) - (if tmp-19827 - (@apply (lambda () exps-19576) tmp-19827) - (let ((tmp-19831 - ($sc-dispatch - e-19819 - '(_ any . each-any)))) - (if tmp-19831 - (@apply - (lambda (e1-19835 e2-19836) - (scan-19438 - (cons e1-19835 e2-19836) - r-19570 - w-19820 - s-19821 - m-19573 - esew-19574 - mod-19822 - exps-19576)) - tmp-19831) - (syntax-violation - #f - "source expression failed to match any pattern" - e-19819))))) - (if (eqv? type-19816 'local-syntax-form) - (expand-local-syntax-6590 - value-19817 - e-19819 - r-19570 - w-19820 - s-19821 - mod-19822 - (lambda (body-19851 - r-19852 - w-19853 - s-19854 - mod-19855) - (scan-19438 - body-19851 - r-19852 - w-19853 - s-19854 - m-19573 - esew-19574 - mod-19855 - exps-19576))) - (if (eqv? type-19816 'eval-when-form) - (let ((tmp-19860 + (syntax-type-4585 + x-21787 + r-21788 + w-21789 + (source-annotation-4544 x-21787) + ribcage-21426 + mod-21793 + #f)) + (lambda (type-21979 + value-21980 + form-21981 + e-21982 + w-21983 + s-21984 + mod-21985) + (if (eqv? type-21979 'define-form) + (let ((id-21989 + (if (if (null? (car w-21983)) + (null? (cdr w-21983)) + #f) + value-21980 + (if (if (vector? value-21980) + (if (= (vector-length value-21980) + 4) + (eq? (vector-ref value-21980 0) + 'syntax-object) + #f) + #f) + (let ((expression-22039 + (vector-ref value-21980 1)) + (wrap-22040 + (let ((w2-22050 + (vector-ref + value-21980 + 2))) + (let ((m1-22051 + (car w-21983)) + (s1-22052 + (cdr w-21983))) + (if (null? m1-22051) + (if (null? s1-22052) + w2-22050 + (cons (car w2-22050) + (let ((m2-22069 + (cdr w2-22050))) + (if (null? m2-22069) + s1-22052 + (append + s1-22052 + m2-22069))))) + (cons (let ((m2-22077 + (car w2-22050))) + (if (null? m2-22077) + m1-22051 + (append + m1-22051 + m2-22077))) + (let ((m2-22085 + (cdr w2-22050))) + (if (null? m2-22085) + s1-22052 + (append + s1-22052 + m2-22085)))))))) + (module-22041 + (vector-ref value-21980 3))) + (vector + 'syntax-object + expression-22039 + wrap-22040 + module-22041)) + (if (null? value-21980) + value-21980 + (vector + 'syntax-object + value-21980 + w-21983 + mod-21985)))))) + (begin + (string-append + "l-" + (session-id-4511) + (symbol->string (gensym "-"))) + (let ((var-21991 + (if (not (equal? + (car (vector-ref + id-21989 + 2)) + '(top))) + (symbol-append + (vector-ref id-21989 1) + '- + (string->symbol + (number->string + (hash (syntax->datum x-21787) + most-positive-fixnum) + 16))) + (vector-ref id-21989 1)))) + (begin + (record-definition!-21428 + id-21989 + var-21991) + (list (if (eq? m-21791 'c&e) + (let ((x-22211 + (build-global-definition-4525 + s-21984 + var-21991 + (expand-4586 + e-21982 + r-21788 + w-21983 + mod-21985)))) + (begin + (top-level-eval-hook-4509 + x-22211 + mod-21985) + (lambda () x-22211))) + (lambda () + (build-global-definition-4525 + s-21984 + var-21991 + (expand-4586 + e-21982 + r-21788 + w-21983 + mod-21985))))))))) + (if (if (eqv? type-21979 'define-syntax-form) + #t + (eqv? type-21979 + 'define-syntax-parameter-form)) + (let ((id-22705 + (if (if (null? (car w-21983)) + (null? (cdr w-21983)) + #f) + value-21980 + (if (if (vector? value-21980) + (if (= (vector-length + value-21980) + 4) + (eq? (vector-ref value-21980 0) + 'syntax-object) + #f) + #f) + (let ((expression-22755 + (vector-ref value-21980 1)) + (wrap-22756 + (let ((w2-22766 + (vector-ref + value-21980 + 2))) + (let ((m1-22767 + (car w-21983)) + (s1-22768 + (cdr w-21983))) + (if (null? m1-22767) + (if (null? s1-22768) + w2-22766 + (cons (car w2-22766) + (let ((m2-22785 + (cdr w2-22766))) + (if (null? m2-22785) + s1-22768 + (append + s1-22768 + m2-22785))))) + (cons (let ((m2-22793 + (car w2-22766))) + (if (null? m2-22793) + m1-22767 + (append + m1-22767 + m2-22793))) + (let ((m2-22801 + (cdr w2-22766))) + (if (null? m2-22801) + s1-22768 + (append + s1-22768 + m2-22801)))))))) + (module-22757 + (vector-ref value-21980 3))) + (vector + 'syntax-object + expression-22755 + wrap-22756 + module-22757)) + (if (null? value-21980) + value-21980 + (vector + 'syntax-object + value-21980 + w-21983 + mod-21985)))))) + (begin + (string-append + "l-" + (session-id-4511) + (symbol->string (gensym "-"))) + (let ((var-22707 + (if (not (equal? + (car (vector-ref + id-22705 + 2)) + '(top))) + (symbol-append + (vector-ref id-22705 1) + '- + (string->symbol + (number->string + (hash (syntax->datum x-21787) + most-positive-fixnum) + 16))) + (vector-ref id-22705 1)))) + (begin + (record-definition!-21428 + id-22705 + var-22707) + (if (eqv? m-21791 'c) + (if (memq 'compile esew-21792) + (let ((e-22930 + (expand-install-global-4583 + var-22707 + type-21979 + (expand-4586 + e-21982 + r-21788 + w-21983 + mod-21985)))) + (begin + (top-level-eval-hook-4509 + e-22930 + mod-21985) + (if (memq 'load esew-21792) + (list (lambda () e-22930)) + '()))) + (if (memq 'load esew-21792) + (list (lambda () + (expand-install-global-4583 + var-22707 + type-21979 + (expand-4586 + e-21982 + r-21788 + w-21983 + mod-21985)))) + '())) + (if (eqv? m-21791 'c&e) + (let ((e-23433 + (expand-install-global-4583 + var-22707 + type-21979 + (expand-4586 + e-21982 + r-21788 + w-21983 + mod-21985)))) + (begin + (top-level-eval-hook-4509 + e-23433 + mod-21985) + (list (lambda () e-23433)))) + (begin + (if (memq 'eval esew-21792) + (top-level-eval-hook-4509 + (expand-install-global-4583 + var-22707 + type-21979 + (expand-4586 + e-21982 + r-21788 + w-21983 + mod-21985)) + mod-21985)) + '()))))))) + (if (eqv? type-21979 'begin-form) + (let ((tmp-24043 ($sc-dispatch - e-19819 - '(_ each-any any . each-any)))) - (if tmp-19860 + e-21982 + '(_ . each-any)))) + (if tmp-24043 (@apply - (lambda (x-19864 e1-19865 e2-19866) - (let ((when-list-19867 - (parse-when-list-6583 - e-19819 - x-19864)) - (body-19868 - (cons e1-19865 e2-19866))) - (if (eq? m-19573 'e) - (if (memq 'eval when-list-19867) - (scan-19438 - body-19868 - r-19570 - w-19820 - s-19821 - (if (memq 'expand - when-list-19867) - 'c&e - 'e) - '(eval) - mod-19822 - exps-19576) - (begin - (if (memq 'expand - when-list-19867) - (let ((x-19945 - (expand-top-sequence-6581 - body-19868 - r-19570 - w-19820 - s-19821 - 'e - '(eval) - mod-19822))) - (primitive-eval x-19945))) - exps-19576)) - (if (memq 'load when-list-19867) - (if (let ((t-19971 - (memq 'compile - when-list-19867))) - (if t-19971 - t-19971 - (let ((t-20020 - (memq 'expand - when-list-19867))) - (if t-20020 - t-20020 - (if (eq? m-19573 - 'c&e) - (memq 'eval - when-list-19867) - #f))))) - (scan-19438 - body-19868 - r-19570 - w-19820 - s-19821 - 'c&e - '(compile load) - mod-19822 - exps-19576) - (if (if (eq? m-19573 'c) - #t - (eq? m-19573 'c&e)) - (scan-19438 - body-19868 - r-19570 - w-19820 - s-19821 - 'c - '(load) - mod-19822 - exps-19576) - exps-19576)) - (if (let ((t-20149 - (memq 'compile - when-list-19867))) - (if t-20149 - t-20149 - (let ((t-20198 - (memq 'expand - when-list-19867))) - (if t-20198 - t-20198 - (if (eq? m-19573 - 'c&e) - (memq 'eval - when-list-19867) - #f))))) - (begin - (let ((x-20322 - (expand-top-sequence-6581 - body-19868 - r-19570 - w-19820 - s-19821 - 'e - '(eval) - mod-19822))) - (primitive-eval x-20322)) - exps-19576) - exps-19576))))) - tmp-19860) + (lambda (e1-24047) + (parse-21431 + e1-24047 + r-21788 + w-21983 + s-21984 + m-21791 + esew-21792 + mod-21985)) + tmp-24043) (syntax-violation #f "source expression failed to match any pattern" - e-19819))) - (if (if (eqv? type-19816 'define-syntax-form) - #t - (eqv? type-19816 - 'define-syntax-parameter-form)) - (let ((n-20368 - (id-var-name-6568 - value-19817 - w-19820)) - (r-20369 - (macros-only-env-6545 r-19570))) - (if (eqv? m-19573 'c) - (if (memq 'compile esew-19574) - (let ((e-20373 - (expand-install-global-6582 - n-20368 - (expand-6585 - e-19819 - r-20369 - w-19820 - mod-19822)))) - (begin - (top-level-eval-hook-6508 - e-20373 - mod-19822) - (if (memq 'load esew-19574) - (cons e-20373 exps-19576) - exps-19576))) - (if (memq 'load esew-19574) - (cons (expand-install-global-6582 - n-20368 - (expand-6585 - e-19819 - r-20369 - w-19820 - mod-19822)) - exps-19576) - exps-19576)) - (if (eqv? m-19573 'c&e) - (let ((e-21015 - (expand-install-global-6582 - n-20368 - (expand-6585 - e-19819 - r-20369 - w-19820 - mod-19822)))) - (begin - (top-level-eval-hook-6508 - e-21015 - mod-19822) - (cons e-21015 exps-19576))) - (begin - (if (memq 'eval esew-19574) - (top-level-eval-hook-6508 - (expand-install-global-6582 - n-20368 - (expand-6585 - e-19819 - r-20369 - w-19820 - mod-19822)) - mod-19822)) - exps-19576)))) - (if (eqv? type-19816 'define-form) - (let ((n-21689 - (id-var-name-6568 - value-19817 - w-19820))) - (let ((type-21690 - (car (let ((t-21697 - (assq n-21689 - r-19570))) - (if t-21697 - (cdr t-21697) - (if (symbol? n-21689) - (let ((t-21703 - (get-global-definition-hook-6512 - n-21689 - mod-19822))) - (if t-21703 - t-21703 - '(global))) - '(displaced-lexical))))))) - (if (if (eqv? type-21690 'global) - #t - (if (eqv? type-21690 'core) - #t - (if (eqv? type-21690 'macro) - #t - (eqv? type-21690 - 'module-ref)))) - (begin - (if (if (if (eq? m-19573 'c) - #t - (eq? m-19573 'c&e)) - (if (not (module-local-variable - (current-module) - n-21689)) - (current-module) - #f) - #f) - (let ((old-21734 - (module-variable - (current-module) - n-21689))) - (if (if (variable? old-21734) - (variable-bound? - old-21734) - #f) - (module-define! - (current-module) - n-21689 - (variable-ref old-21734)) - (module-add! - (current-module) - n-21689 - (make-undefined-variable))))) - (cons (if (eq? m-19573 'c&e) - (let ((x-22175 - (build-global-definition-6524 - s-19821 - n-21689 - (expand-6585 - e-19819 - r-19570 - w-19820 - mod-19822)))) + e-21982))) + (if (eqv? type-21979 'local-syntax-form) + (expand-local-syntax-4591 + value-21980 + e-21982 + r-21788 + w-21983 + s-21984 + mod-21985 + (lambda (forms-24090 + r-24091 + w-24092 + s-24093 + mod-24094) + (parse-21431 + forms-24090 + r-24091 + w-24092 + s-24093 + m-21791 + esew-21792 + mod-24094))) + (if (eqv? type-21979 'eval-when-form) + (let ((tmp-24130 + ($sc-dispatch + e-21982 + '(_ each-any any . each-any)))) + (if tmp-24130 + (@apply + (lambda (x-24134 e1-24135 e2-24136) + (let ((when-list-24137 + (parse-when-list-4584 + e-21982 + x-24134)) + (body-24138 + (cons e1-24135 e2-24136))) + (letrec* + ((recurse-24139 + (lambda (m-24725 esew-24726) + (parse-21431 + body-24138 + r-21788 + w-21983 + s-21984 + m-24725 + esew-24726 + mod-21985)))) + (if (eq? m-21791 'e) + (if (memq 'eval + when-list-24137) + (recurse-24139 + (if (memq 'expand + when-list-24137) + 'c&e + 'e) + '(eval)) + (begin + (if (memq 'expand + when-list-24137) + (let ((x-24246 + (expand-top-sequence-4582 + body-24138 + r-21788 + w-21983 + s-21984 + 'e + '(eval) + mod-21985))) + (primitive-eval + x-24246))) + '())) + (if (memq 'load + when-list-24137) + (if (let ((t-24274 + (memq 'compile + when-list-24137))) + (if t-24274 + t-24274 + (let ((t-24327 + (memq 'expand + when-list-24137))) + (if t-24327 + t-24327 + (if (eq? m-21791 + 'c&e) + (memq 'eval + when-list-24137) + #f))))) + (recurse-24139 + 'c&e + '(compile load)) + (if (if (eq? m-21791 'c) + #t + (eq? m-21791 'c&e)) + (recurse-24139 + 'c + '(load)) + '())) + (if (let ((t-24536 + (memq 'compile + when-list-24137))) + (if t-24536 + t-24536 + (let ((t-24589 + (memq 'expand + when-list-24137))) + (if t-24589 + t-24589 + (if (eq? m-21791 + 'c&e) + (memq 'eval + when-list-24137) + #f))))) (begin - (top-level-eval-hook-6508 - x-22175 - mod-19822) - x-22175)) - (lambda () - (build-global-definition-6524 - s-19821 - n-21689 - (expand-6585 - e-19819 - r-19570 - w-19820 - mod-19822)))) - exps-19576)) - (if (eqv? type-21690 - 'displaced-lexical) - (syntax-violation - #f - "identifier out of context" - (wrap-6578 - (begin - (if (if (pair? form-19818) - s-19821 - #f) - (set-source-properties! - form-19818 - s-19821)) - form-19818) - w-19820 - mod-19822) - (wrap-6578 - value-19817 - w-19820 - mod-19822)) - (syntax-violation - #f - "cannot define keyword at top level" - (wrap-6578 - (begin - (if (if (pair? form-19818) - s-19821 - #f) - (set-source-properties! - form-19818 - s-19821)) - form-19818) - w-19820 - mod-19822) - (wrap-6578 - value-19817 - w-19820 - mod-19822)))))) - (cons (if (eq? m-19573 'c&e) - (let ((x-22674 - (expand-expr-6586 - type-19816 - value-19817 - form-19818 - e-19819 - r-19570 - w-19820 - s-19821 - mod-19822))) + (let ((x-24723 + (expand-top-sequence-4582 + body-24138 + r-21788 + w-21983 + s-21984 + 'e + '(eval) + mod-21985))) + (primitive-eval + x-24723)) + '()) + '())))))) + tmp-24130) + (syntax-violation + #f + "source expression failed to match any pattern" + e-21982))) + (list (if (eq? m-21791 'c&e) + (let ((x-24796 + (expand-expr-4587 + type-21979 + value-21980 + form-21981 + e-21982 + r-21788 + w-21983 + s-21984 + mod-21985))) (begin - (primitive-eval x-22674) - x-22674)) + (primitive-eval x-24796) + (lambda () x-24796))) (lambda () - (expand-expr-6586 - type-19816 - value-19817 - form-19818 - e-19819 - r-19570 - w-19820 - s-19821 - mod-19822))) - exps-19576))))))))) - (lambda (exps-22679) - (scan-19438 - (cdr body-19569) - r-19570 - w-19571 - s-19572 - m-19573 - esew-19574 - mod-19575 - exps-22679))))))) - (call-with-values - (lambda () - (scan-19438 - body-19431 - r-19432 - w-19433 - s-19434 - m-19435 - esew-19436 - mod-19437 - '())) - (lambda (exps-19441) - (if (null? exps-19441) - (make-struct/no-tail - (vector-ref %expanded-vtables 0) - s-19434) - (build-sequence-6530 - s-19434 - (letrec* - ((lp-19481 - (lambda (in-19565 out-19566) - (if (null? in-19565) - out-19566 - (let ((e-19567 (car in-19565))) - (lp-19481 - (cdr in-19565) - (cons (if (procedure? e-19567) - (e-19567) - e-19567) - out-19566))))))) - (lp-19481 exps-19441 '()))))))))) - (expand-install-global-6582 - (lambda (name-22680 e-22681) - (let ((exp-22687 - (let ((fun-exp-22697 - (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-22698 - (list (make-struct/no-tail - (vector-ref %expanded-vtables 1) - #f - name-22680) - (make-struct/no-tail - (vector-ref %expanded-vtables 1) - #f - 'macro) - e-22681))) + (expand-expr-4587 + type-21979 + value-21980 + form-21981 + e-21982 + r-21788 + w-21983 + s-21984 + mod-21985)))))))))))))) + (let ((exps-21433 + (map (lambda (x-21556) (x-21556)) + (reverse + (parse-21431 + body-21418 + r-21425 + w-21427 + s-21421 + m-21422 + esew-21423 + mod-21424))))) + (if (null? exps-21433) + (make-struct/no-tail + (vector-ref %expanded-vtables 0) + s-21421) + (build-sequence-4532 s-21421 exps-21433))))))))) + (expand-install-global-4583 + (lambda (name-24924 type-24925 e-24926) + (let ((exp-24932 + (let ((args-24943 + (if (eq? type-24925 'define-syntax-parameter-form) + (list (make-struct/no-tail + (vector-ref %expanded-vtables 1) + #f + name-24924) + (make-struct/no-tail + (vector-ref %expanded-vtables 1) + #f + 'syntax-parameter) + (let ((args-24966 (list e-24926))) + (make-struct/no-tail + (vector-ref %expanded-vtables 12) + #f + 'list + args-24966))) + (list (make-struct/no-tail + (vector-ref %expanded-vtables 1) + #f + name-24924) + (make-struct/no-tail + (vector-ref %expanded-vtables 1) + #f + 'macro) + e-24926)))) (make-struct/no-tail - (vector-ref %expanded-vtables 11) + (vector-ref %expanded-vtables 12) #f - fun-exp-22697 - arg-exps-22698)))) + 'make-syntax-transformer + args-24943)))) (begin - (if (if (struct? exp-22687) - (eq? (struct-vtable exp-22687) - (vector-ref %expanded-vtables 13)) + (if (if (struct? exp-24932) + (eq? (struct-vtable exp-24932) + (vector-ref %expanded-vtables 14)) #f) - (let ((meta-22739 (struct-ref exp-22687 1))) - (if (not (assq 'name meta-22739)) - (let ((v-22746 - (cons (cons 'name name-22680) meta-22739))) - (struct-set! exp-22687 1 v-22746))))) + (let ((meta-24993 (struct-ref exp-24932 1))) + (if (not (assq 'name meta-24993)) + (let ((v-25000 + (cons (cons 'name name-24924) meta-24993))) + (struct-set! exp-24932 1 v-25000))))) (make-struct/no-tail (vector-ref %expanded-vtables 9) #f - name-22680 - exp-22687))))) - (parse-when-list-6583 - (lambda (e-22757 when-list-22758) - (let ((result-22759 (strip-6598 when-list-22758 '(())))) + name-24924 + exp-24932))))) + (parse-when-list-4584 + (lambda (e-25011 when-list-25012) + (let ((result-25013 (strip-4599 when-list-25012 '(())))) (letrec* - ((lp-22760 - (lambda (l-22814) - (if (null? l-22814) - result-22759 - (if (let ((t-22816 (car l-22814))) - (if (eq? t-22816 'compile) + ((lp-25014 + (lambda (l-25080) + (if (null? l-25080) + result-25013 + (if (let ((t-25082 (car l-25080))) + (if (eq? t-25082 'compile) #t - (if (eq? t-22816 'load) + (if (eq? t-25082 'load) #t - (if (eq? t-22816 'eval) + (if (eq? t-25082 'eval) #t - (eq? t-22816 'expand))))) - (lp-22760 (cdr l-22814)) + (eq? t-25082 'expand))))) + (lp-25014 (cdr l-25080)) (syntax-violation 'eval-when "invalid situation" - e-22757 - (car l-22814))))))) - (lp-22760 result-22759))))) - (syntax-type-6584 - (lambda (e-22818 - r-22819 - w-22820 - s-22821 - rib-22822 - mod-22823 - for-car?-22824) - (if (symbol? e-22818) - (let ((n-22825 (id-var-name-6568 e-22818 w-22820))) - (let ((b-22826 - (let ((t-22834 (assq n-22825 r-22819))) - (if t-22834 - (cdr t-22834) - (if (symbol? n-22825) - (let ((t-22840 - (get-global-definition-hook-6512 - n-22825 - mod-22823))) - (if t-22840 t-22840 '(global))) - '(displaced-lexical)))))) - (let ((type-22827 (car b-22826))) - (if (eqv? type-22827 'lexical) + e-25011 + (car l-25080))))))) + (lp-25014 result-25013))))) + (syntax-type-4585 + (lambda (e-25084 + r-25085 + w-25086 + s-25087 + rib-25088 + mod-25089 + for-car?-25090) + (if (symbol? e-25084) + (call-with-values + (lambda () + (resolve-identifier-4571 + e-25084 + w-25086 + r-25085 + mod-25089 + #t)) + (lambda (type-25093 value-25094 mod*-25095) + (if (eqv? type-25093 'macro) + (if for-car?-25090 (values - type-22827 - (cdr b-22826) - e-22818 - e-22818 - w-22820 - s-22821 - mod-22823) - (if (eqv? type-22827 'global) - (values - type-22827 - n-22825 - e-22818 - e-22818 - w-22820 - s-22821 - mod-22823) - (if (eqv? type-22827 'macro) - (if for-car?-22824 - (values - type-22827 - (cdr b-22826) - e-22818 - e-22818 - w-22820 - s-22821 - mod-22823) - (syntax-type-6584 - (expand-macro-6588 - (cdr b-22826) - e-22818 - r-22819 - w-22820 - s-22821 - rib-22822 - mod-22823) - r-22819 - '(()) - s-22821 - rib-22822 - mod-22823 - #f)) - (values - type-22827 - (cdr b-22826) - e-22818 - e-22818 - w-22820 - s-22821 - mod-22823))))))) - (if (pair? e-22818) - (let ((first-22860 (car e-22818))) + type-25093 + value-25094 + e-25084 + e-25084 + w-25086 + s-25087 + mod-25089) + (syntax-type-4585 + (expand-macro-4589 + value-25094 + e-25084 + r-25085 + w-25086 + s-25087 + rib-25088 + mod-25089) + r-25085 + '(()) + s-25087 + rib-25088 + mod-25089 + #f)) + (if (eqv? type-25093 'global) + (values + type-25093 + value-25094 + e-25084 + value-25094 + w-25086 + s-25087 + mod*-25095) + (values + type-25093 + value-25094 + e-25084 + e-25084 + w-25086 + s-25087 + mod-25089))))) + (if (pair? e-25084) + (let ((first-25104 (car e-25084))) (call-with-values (lambda () - (syntax-type-6584 - first-22860 - r-22819 - w-22820 - s-22821 - rib-22822 - mod-22823 + (syntax-type-4585 + first-25104 + r-25085 + w-25086 + s-25087 + rib-25088 + mod-25089 #t)) - (lambda (ftype-22862 - fval-22863 - fform-22864 - fe-22865 - fw-22866 - fs-22867 - fmod-22868) - (if (eqv? ftype-22862 'lexical) + (lambda (ftype-25106 + fval-25107 + fform-25108 + fe-25109 + fw-25110 + fs-25111 + fmod-25112) + (if (eqv? ftype-25106 'lexical) (values 'lexical-call - fval-22863 - e-22818 - e-22818 - w-22820 - s-22821 - mod-22823) - (if (eqv? ftype-22862 'global) + fval-25107 + e-25084 + e-25084 + w-25086 + s-25087 + mod-25089) + (if (eqv? ftype-25106 'global) (values 'global-call (vector 'syntax-object - fval-22863 - w-22820 - fmod-22868) - e-22818 - e-22818 - w-22820 - s-22821 - mod-22823) - (if (eqv? ftype-22862 'macro) - (syntax-type-6584 - (expand-macro-6588 - fval-22863 - e-22818 - r-22819 - w-22820 - s-22821 - rib-22822 - mod-22823) - r-22819 + fval-25107 + w-25086 + fmod-25112) + e-25084 + e-25084 + w-25086 + s-25087 + mod-25089) + (if (eqv? ftype-25106 'macro) + (syntax-type-4585 + (expand-macro-4589 + fval-25107 + e-25084 + r-25085 + w-25086 + s-25087 + rib-25088 + mod-25089) + r-25085 '(()) - s-22821 - rib-22822 - mod-22823 - for-car?-22824) - (if (eqv? ftype-22862 'module-ref) + s-25087 + rib-25088 + mod-25089 + for-car?-25090) + (if (eqv? ftype-25106 'module-ref) (call-with-values - (lambda () (fval-22863 e-22818 r-22819 w-22820)) - (lambda (e-22889 - r-22890 - w-22891 - s-22892 - mod-22893) - (syntax-type-6584 - e-22889 - r-22890 - w-22891 - s-22892 - rib-22822 - mod-22893 - for-car?-22824))) - (if (eqv? ftype-22862 'core) + (lambda () (fval-25107 e-25084 r-25085 w-25086)) + (lambda (e-25133 + r-25134 + w-25135 + s-25136 + mod-25137) + (syntax-type-4585 + e-25133 + r-25134 + w-25135 + s-25136 + rib-25088 + mod-25137 + for-car?-25090))) + (if (eqv? ftype-25106 'core) (values 'core-form - fval-22863 - e-22818 - e-22818 - w-22820 - s-22821 - mod-22823) - (if (eqv? ftype-22862 'local-syntax) + fval-25107 + e-25084 + e-25084 + w-25086 + s-25087 + mod-25089) + (if (eqv? ftype-25106 'local-syntax) (values 'local-syntax-form - fval-22863 - e-22818 - e-22818 - w-22820 - s-22821 - mod-22823) - (if (eqv? ftype-22862 'begin) + fval-25107 + e-25084 + e-25084 + w-25086 + s-25087 + mod-25089) + (if (eqv? ftype-25106 'begin) (values 'begin-form #f - e-22818 - e-22818 - w-22820 - s-22821 - mod-22823) - (if (eqv? ftype-22862 'eval-when) + e-25084 + e-25084 + w-25086 + s-25087 + mod-25089) + (if (eqv? ftype-25106 'eval-when) (values 'eval-when-form #f - e-22818 - e-22818 - w-22820 - s-22821 - mod-22823) - (if (eqv? ftype-22862 'define) - (let ((tmp-22910 + e-25084 + e-25084 + w-25086 + s-25087 + mod-25089) + (if (eqv? ftype-25106 'define) + (let ((tmp-25154 ($sc-dispatch - e-22818 + e-25084 '(_ any any)))) - (if (if tmp-22910 + (if (if tmp-25154 (@apply - (lambda (name-22914 val-22915) - (if (symbol? name-22914) + (lambda (name-25158 val-25159) + (if (symbol? name-25158) #t - (if (if (vector? name-22914) + (if (if (vector? name-25158) (if (= (vector-length - name-22914) + name-25158) 4) (eq? (vector-ref - name-22914 + name-25158 0) 'syntax-object) #f) #f) (symbol? (vector-ref - name-22914 + name-25158 1)) #f))) - tmp-22910) + tmp-25154) #f) (@apply - (lambda (name-22942 val-22943) + (lambda (name-25186 val-25187) (values 'define-form - name-22942 - e-22818 - val-22943 - w-22820 - s-22821 - mod-22823)) - tmp-22910) - (let ((tmp-22944 + name-25186 + e-25084 + val-25187 + w-25086 + s-25087 + mod-25089)) + tmp-25154) + (let ((tmp-25188 ($sc-dispatch - e-22818 + e-25084 '(_ (any . any) any . each-any)))) - (if (if tmp-22944 + (if (if tmp-25188 (@apply - (lambda (name-22948 - args-22949 - e1-22950 - e2-22951) + (lambda (name-25192 + args-25193 + e1-25194 + e2-25195) (if (if (symbol? - name-22948) + name-25192) #t (if (if (vector? - name-22948) + name-25192) (if (= (vector-length - name-22948) + name-25192) 4) (eq? (vector-ref - name-22948 + name-25192 0) 'syntax-object) #f) #f) (symbol? (vector-ref - name-22948 + name-25192 1)) #f)) - (valid-bound-ids?-6575 - (letrec* - ((lvl-23100 - (lambda (vars-23102 - ls-23103 - w-23104) - (if (pair? vars-23102) - (lvl-23100 - (cdr vars-23102) - (cons (wrap-6578 - (car vars-23102) - w-23104 - #f) - ls-23103) - w-23104) - (if (if (symbol? - vars-23102) - #t - (if (if (vector? - vars-23102) - (if (= (vector-length - vars-23102) - 4) - (eq? (vector-ref - vars-23102 - 0) - 'syntax-object) - #f) - #f) - (symbol? - (vector-ref - vars-23102 - 1)) - #f)) - (cons (wrap-6578 - vars-23102 - w-23104 - #f) - ls-23103) - (if (null? vars-23102) - ls-23103 - (if (if (vector? - vars-23102) - (if (= (vector-length - vars-23102) - 4) - (eq? (vector-ref - vars-23102 - 0) - 'syntax-object) - #f) - #f) - (lvl-23100 - (vector-ref - vars-23102 - 1) - ls-23103 - (join-wraps-6565 - w-23104 - (vector-ref - vars-23102 - 2))) - (cons vars-23102 - ls-23103)))))))) - (lvl-23100 - args-22949 - '() - '(())))) + (valid-bound-ids?-4576 + (lambda-var-list-4601 + args-25193)) #f)) - tmp-22944) + tmp-25188) #f) (@apply - (lambda (name-23148 - args-23149 - e1-23150 - e2-23151) + (lambda (name-25658 + args-25659 + e1-25660 + e2-25661) (values 'define-form - (wrap-6578 - name-23148 - w-22820 - mod-22823) - (wrap-6578 - e-22818 - w-22820 - mod-22823) - (let ((e-23159 + (if (if (null? (car w-25086)) + (null? (cdr w-25086)) + #f) + name-25658 + (if (if (vector? + name-25658) + (if (= (vector-length + name-25658) + 4) + (eq? (vector-ref + name-25658 + 0) + 'syntax-object) + #f) + #f) + (let ((expression-25691 + (vector-ref + name-25658 + 1)) + (wrap-25692 + (let ((w2-25702 + (vector-ref + name-25658 + 2))) + (let ((m1-25703 + (car w-25086)) + (s1-25704 + (cdr w-25086))) + (if (null? m1-25703) + (if (null? s1-25704) + w2-25702 + (cons (car w2-25702) + (let ((m2-25721 + (cdr w2-25702))) + (if (null? m2-25721) + s1-25704 + (append + s1-25704 + m2-25721))))) + (cons (let ((m2-25729 + (car w2-25702))) + (if (null? m2-25729) + m1-25703 + (append + m1-25703 + m2-25729))) + (let ((m2-25737 + (cdr w2-25702))) + (if (null? m2-25737) + s1-25704 + (append + s1-25704 + m2-25737)))))))) + (module-25693 + (vector-ref + name-25658 + 3))) + (vector + 'syntax-object + expression-25691 + wrap-25692 + module-25693)) + (if (null? name-25658) + name-25658 + (vector + 'syntax-object + name-25658 + w-25086 + mod-25089)))) + (if (if (null? (car w-25086)) + (null? (cdr w-25086)) + #f) + e-25084 + (if (if (vector? e-25084) + (if (= (vector-length + e-25084) + 4) + (eq? (vector-ref + e-25084 + 0) + 'syntax-object) + #f) + #f) + (let ((expression-25789 + (vector-ref + e-25084 + 1)) + (wrap-25790 + (let ((w2-25800 + (vector-ref + e-25084 + 2))) + (let ((m1-25801 + (car w-25086)) + (s1-25802 + (cdr w-25086))) + (if (null? m1-25801) + (if (null? s1-25802) + w2-25800 + (cons (car w2-25800) + (let ((m2-25819 + (cdr w2-25800))) + (if (null? m2-25819) + s1-25802 + (append + s1-25802 + m2-25819))))) + (cons (let ((m2-25827 + (car w2-25800))) + (if (null? m2-25827) + m1-25801 + (append + m1-25801 + m2-25827))) + (let ((m2-25835 + (cdr w2-25800))) + (if (null? m2-25835) + s1-25802 + (append + s1-25802 + m2-25835)))))))) + (module-25791 + (vector-ref + e-25084 + 3))) + (vector + 'syntax-object + expression-25789 + wrap-25790 + module-25791)) + (if (null? e-25084) + e-25084 + (vector + 'syntax-object + e-25084 + w-25086 + mod-25089)))) + (let ((e-25861 (cons '#(syntax-object lambda ((top) @@ -1678,10 +2183,10 @@ (top) (top) (top)) - #("l-*-4009" - "l-*-4010" - "l-*-4011" - "l-*-4012")) + #("l-*-2021" + "l-*-2022" + "l-*-2023" + "l-*-2024")) #(ribcage () () @@ -1705,13 +2210,13 @@ (top) (top) (top)) - #("l-*-3961" - "l-*-3962" - "l-*-3963" - "l-*-3964" - "l-*-3965" - "l-*-3966" - "l-*-3967")) + #("l-*-1973" + "l-*-1974" + "l-*-1975" + "l-*-1976" + "l-*-1977" + "l-*-1978" + "l-*-1979")) #(ribcage () () @@ -1719,7 +2224,7 @@ #(ribcage #(first) #((top)) - #("l-*-3952")) + #("l-*-1964")) #(ribcage () () @@ -1747,13 +2252,13 @@ (top) (top) (top)) - #("l-*-3924" - "l-*-3925" - "l-*-3926" - "l-*-3927" - "l-*-3928" - "l-*-3929" - "l-*-3930")) + #("l-*-1943" + "l-*-1944" + "l-*-1945" + "l-*-1946" + "l-*-1947" + "l-*-1948" + "l-*-1949")) #(ribcage (lambda-var-list gen-var @@ -1768,7 +2273,7 @@ expand-local-syntax expand-body expand-macro - expand-application + expand-call expand-expr expand syntax-type @@ -1824,7 +2329,6 @@ id? nonsymbol-id? global-extend - lookup macros-only-env extend-var-env extend-env @@ -1850,6 +2354,7 @@ build-sequence build-data build-primref + build-primcall build-lambda-case build-case-lambda build-simple-lambda @@ -1861,7 +2366,7 @@ build-lexical-reference build-dynlet build-conditional - build-application + build-call build-void maybe-name-value! decorate-source @@ -1882,8 +2387,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 @@ -2034,147 +2540,149 @@ (top) (top) (top) + (top) (top)) - ("l-*-2527" - "l-*-2525" - "l-*-2523" - "l-*-2521" - "l-*-2519" - "l-*-2517" - "l-*-2515" - "l-*-2513" - "l-*-2511" - "l-*-2509" - "l-*-2507" - "l-*-2505" - "l-*-2503" - "l-*-2501" - "l-*-2499" - "l-*-2497" - "l-*-2495" - "l-*-2493" - "l-*-2491" - "l-*-2489" - "l-*-2487" - "l-*-2485" - "l-*-2483" - "l-*-2481" - "l-*-2479" - "l-*-2477" - "l-*-2475" - "l-*-2473" - "l-*-2471" - "l-*-2469" - "l-*-2467" - "l-*-2465" - "l-*-2463" - "l-*-2461" - "l-*-2459" - "l-*-2457" - "l-*-2455" - "l-*-2453" - "l-*-2451" - "l-*-2450" - "l-*-2448" - "l-*-2445" - "l-*-2444" - "l-*-2443" - "l-*-2441" - "l-*-2440" - "l-*-2438" - "l-*-2436" - "l-*-2434" - "l-*-2432" - "l-*-2430" - "l-*-2428" - "l-*-2426" - "l-*-2424" - "l-*-2421" - "l-*-2419" - "l-*-2418" - "l-*-2416" - "l-*-2414" - "l-*-2412" - "l-*-2410" - "l-*-2409" - "l-*-2408" - "l-*-2407" - "l-*-2405" - "l-*-2404" - "l-*-2401" - "l-*-2399" - "l-*-2397" - "l-*-2395" - "l-*-2393" - "l-*-2391" - "l-*-2389" - "l-*-2388" - "l-*-2387" - "l-*-2385" - "l-*-2383" - "l-*-2382" - "l-*-2379" - "l-*-2378" - "l-*-2376" - "l-*-2374" - "l-*-2372" - "l-*-2370" - "l-*-2368" - "l-*-2366" - "l-*-2364" - "l-*-2362" - "l-*-2360" - "l-*-2357" - "l-*-2355" - "l-*-2353" - "l-*-2351" - "l-*-2349" - "l-*-2347" - "l-*-2345" - "l-*-2343" - "l-*-2341" - "l-*-2339" - "l-*-2337" - "l-*-2335" - "l-*-2333" - "l-*-2331" - "l-*-2329" - "l-*-2327" - "l-*-2325" - "l-*-2323" - "l-*-2321" - "l-*-2319" - "l-*-2317" - "l-*-2315" - "l-*-2313" - "l-*-2311" - "l-*-2309" - "l-*-2307" - "l-*-2306" - "l-*-2305" - "l-*-2304" - "l-*-2303" - "l-*-2301" - "l-*-2299" - "l-*-2297" - "l-*-2294" - "l-*-2292" - "l-*-2290" - "l-*-2288" - "l-*-2286" - "l-*-2284" - "l-*-2282" - "l-*-2280" - "l-*-2278" - "l-*-2276" - "l-*-2274" - "l-*-2272" - "l-*-2270" - "l-*-2268" - "l-*-2266" - "l-*-2264" - "l-*-2262" - "l-*-2260")) + ("l-*-478" + "l-*-476" + "l-*-474" + "l-*-472" + "l-*-470" + "l-*-468" + "l-*-466" + "l-*-464" + "l-*-462" + "l-*-460" + "l-*-458" + "l-*-456" + "l-*-454" + "l-*-452" + "l-*-450" + "l-*-448" + "l-*-446" + "l-*-444" + "l-*-442" + "l-*-440" + "l-*-438" + "l-*-436" + "l-*-434" + "l-*-432" + "l-*-430" + "l-*-428" + "l-*-426" + "l-*-424" + "l-*-422" + "l-*-420" + "l-*-418" + "l-*-416" + "l-*-414" + "l-*-412" + "l-*-410" + "l-*-408" + "l-*-406" + "l-*-404" + "l-*-402" + "l-*-401" + "l-*-399" + "l-*-396" + "l-*-395" + "l-*-394" + "l-*-392" + "l-*-391" + "l-*-389" + "l-*-387" + "l-*-385" + "l-*-383" + "l-*-381" + "l-*-379" + "l-*-377" + "l-*-375" + "l-*-372" + "l-*-370" + "l-*-369" + "l-*-367" + "l-*-365" + "l-*-363" + "l-*-361" + "l-*-360" + "l-*-359" + "l-*-358" + "l-*-356" + "l-*-355" + "l-*-352" + "l-*-350" + "l-*-348" + "l-*-346" + "l-*-344" + "l-*-342" + "l-*-341" + "l-*-340" + "l-*-338" + "l-*-336" + "l-*-335" + "l-*-332" + "l-*-331" + "l-*-329" + "l-*-327" + "l-*-325" + "l-*-323" + "l-*-321" + "l-*-319" + "l-*-317" + "l-*-315" + "l-*-313" + "l-*-310" + "l-*-308" + "l-*-306" + "l-*-304" + "l-*-302" + "l-*-300" + "l-*-298" + "l-*-296" + "l-*-294" + "l-*-292" + "l-*-290" + "l-*-288" + "l-*-286" + "l-*-284" + "l-*-282" + "l-*-280" + "l-*-278" + "l-*-276" + "l-*-274" + "l-*-272" + "l-*-270" + "l-*-268" + "l-*-266" + "l-*-264" + "l-*-262" + "l-*-260" + "l-*-258" + "l-*-257" + "l-*-256" + "l-*-255" + "l-*-254" + "l-*-252" + "l-*-250" + "l-*-248" + "l-*-245" + "l-*-243" + "l-*-241" + "l-*-239" + "l-*-237" + "l-*-235" + "l-*-233" + "l-*-231" + "l-*-229" + "l-*-227" + "l-*-225" + "l-*-223" + "l-*-221" + "l-*-219" + "l-*-217" + "l-*-215" + "l-*-213" + "l-*-211" + "l-*-209")) #(ribcage (define-structure define-expansion-accessors @@ -2182,76 +2690,277 @@ ((top) (top) (top)) - ("l-*-2098" - "l-*-2097" - "l-*-2096"))) + ("l-*-47" + "l-*-46" + "l-*-45")) + #(ribcage + () + () + ())) (hygiene guile)) - (wrap-6578 - (cons args-23149 - (cons e1-23150 - e2-23151)) - w-22820 - mod-22823)))) + (let ((x-25865 + (cons args-25659 + (cons e1-25660 + e2-25661)))) + (if (if (null? (car w-25086)) + (null? (cdr w-25086)) + #f) + x-25865 + (if (if (vector? + x-25865) + (if (= (vector-length + x-25865) + 4) + (eq? (vector-ref + x-25865 + 0) + 'syntax-object) + #f) + #f) + (let ((expression-25883 + (vector-ref + x-25865 + 1)) + (wrap-25884 + (let ((w2-25892 + (vector-ref + x-25865 + 2))) + (let ((m1-25893 + (car w-25086)) + (s1-25894 + (cdr w-25086))) + (if (null? m1-25893) + (if (null? s1-25894) + w2-25892 + (cons (car w2-25892) + (let ((m2-25909 + (cdr w2-25892))) + (if (null? m2-25909) + s1-25894 + (append + s1-25894 + m2-25909))))) + (cons (let ((m2-25917 + (car w2-25892))) + (if (null? m2-25917) + m1-25893 + (append + m1-25893 + m2-25917))) + (let ((m2-25925 + (cdr w2-25892))) + (if (null? m2-25925) + s1-25894 + (append + s1-25894 + m2-25925)))))))) + (module-25885 + (vector-ref + x-25865 + 3))) + (vector + 'syntax-object + expression-25883 + wrap-25884 + module-25885)) + (if (null? x-25865) + x-25865 + (vector + 'syntax-object + x-25865 + w-25086 + mod-25089)))))))) (begin - (if (if (pair? e-23159) - s-22821 + (if (if (pair? e-25861) + s-25087 #f) (set-source-properties! - e-23159 - s-22821)) - e-23159)) + e-25861 + s-25087)) + e-25861)) '(()) - s-22821 - mod-22823)) - tmp-22944) - (let ((tmp-23166 + s-25087 + mod-25089)) + tmp-25188) + (let ((tmp-25944 ($sc-dispatch - e-22818 + e-25084 '(_ any)))) - (if (if tmp-23166 + (if (if tmp-25944 (@apply - (lambda (name-23170) + (lambda (name-25948) (if (symbol? - name-23170) + name-25948) #t (if (if (vector? - name-23170) + name-25948) (if (= (vector-length - name-23170) + name-25948) 4) (eq? (vector-ref - name-23170 + name-25948 0) 'syntax-object) #f) #f) (symbol? (vector-ref - name-23170 + name-25948 1)) #f))) - tmp-23166) + tmp-25944) #f) (@apply - (lambda (name-23197) + (lambda (name-25975) (values 'define-form - (wrap-6578 - name-23197 - w-22820 - mod-22823) - (wrap-6578 - e-22818 - w-22820 - mod-22823) + (if (if (null? (car w-25086)) + (null? (cdr w-25086)) + #f) + name-25975 + (if (if (vector? + name-25975) + (if (= (vector-length + name-25975) + 4) + (eq? (vector-ref + name-25975 + 0) + 'syntax-object) + #f) + #f) + (let ((expression-26005 + (vector-ref + name-25975 + 1)) + (wrap-26006 + (let ((w2-26016 + (vector-ref + name-25975 + 2))) + (let ((m1-26017 + (car w-25086)) + (s1-26018 + (cdr w-25086))) + (if (null? m1-26017) + (if (null? s1-26018) + w2-26016 + (cons (car w2-26016) + (let ((m2-26035 + (cdr w2-26016))) + (if (null? m2-26035) + s1-26018 + (append + s1-26018 + m2-26035))))) + (cons (let ((m2-26043 + (car w2-26016))) + (if (null? m2-26043) + m1-26017 + (append + m1-26017 + m2-26043))) + (let ((m2-26051 + (cdr w2-26016))) + (if (null? m2-26051) + s1-26018 + (append + s1-26018 + m2-26051)))))))) + (module-26007 + (vector-ref + name-25975 + 3))) + (vector + 'syntax-object + expression-26005 + wrap-26006 + module-26007)) + (if (null? name-25975) + name-25975 + (vector + 'syntax-object + name-25975 + w-25086 + mod-25089)))) + (if (if (null? (car w-25086)) + (null? (cdr w-25086)) + #f) + e-25084 + (if (if (vector? + e-25084) + (if (= (vector-length + e-25084) + 4) + (eq? (vector-ref + e-25084 + 0) + 'syntax-object) + #f) + #f) + (let ((expression-26103 + (vector-ref + e-25084 + 1)) + (wrap-26104 + (let ((w2-26114 + (vector-ref + e-25084 + 2))) + (let ((m1-26115 + (car w-25086)) + (s1-26116 + (cdr w-25086))) + (if (null? m1-26115) + (if (null? s1-26116) + w2-26114 + (cons (car w2-26114) + (let ((m2-26133 + (cdr w2-26114))) + (if (null? m2-26133) + s1-26116 + (append + s1-26116 + m2-26133))))) + (cons (let ((m2-26141 + (car w2-26114))) + (if (null? m2-26141) + m1-26115 + (append + m1-26115 + m2-26141))) + (let ((m2-26149 + (cdr w2-26114))) + (if (null? m2-26149) + s1-26116 + (append + s1-26116 + m2-26149)))))))) + (module-26105 + (vector-ref + e-25084 + 3))) + (vector + 'syntax-object + expression-26103 + wrap-26104 + module-26105)) + (if (null? e-25084) + e-25084 + (vector + 'syntax-object + e-25084 + w-25086 + mod-25089)))) '(#(syntax-object if ((top) #(ribcage #(name) #((top)) - #("l-*-4022")) + #("l-*-2034")) #(ribcage () () ()) #(ribcage () () ()) #(ribcage @@ -2269,18 +2978,18 @@ (top) (top) (top)) - #("l-*-3961" - "l-*-3962" - "l-*-3963" - "l-*-3964" - "l-*-3965" - "l-*-3966" - "l-*-3967")) + #("l-*-1973" + "l-*-1974" + "l-*-1975" + "l-*-1976" + "l-*-1977" + "l-*-1978" + "l-*-1979")) #(ribcage () () ()) #(ribcage #(first) #((top)) - #("l-*-3952")) + #("l-*-1964")) #(ribcage () () ()) #(ribcage () () ()) #(ribcage () () ()) @@ -2299,13 +3008,13 @@ (top) (top) (top)) - #("l-*-3924" - "l-*-3925" - "l-*-3926" - "l-*-3927" - "l-*-3928" - "l-*-3929" - "l-*-3930")) + #("l-*-1943" + "l-*-1944" + "l-*-1945" + "l-*-1946" + "l-*-1947" + "l-*-1948" + "l-*-1949")) #(ribcage (lambda-var-list gen-var @@ -2320,7 +3029,7 @@ expand-local-syntax expand-body expand-macro - expand-application + expand-call expand-expr expand syntax-type @@ -2376,7 +3085,6 @@ id? nonsymbol-id? global-extend - lookup macros-only-env extend-var-env extend-env @@ -2402,6 +3110,7 @@ build-sequence build-data build-primref + build-primcall build-lambda-case build-case-lambda build-simple-lambda @@ -2413,7 +3122,7 @@ build-lexical-reference build-dynlet build-conditional - build-application + build-call build-void maybe-name-value! decorate-source @@ -2434,8 +3143,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 @@ -2586,147 +3296,149 @@ (top) (top) (top) + (top) (top)) - ("l-*-2527" - "l-*-2525" - "l-*-2523" - "l-*-2521" - "l-*-2519" - "l-*-2517" - "l-*-2515" - "l-*-2513" - "l-*-2511" - "l-*-2509" - "l-*-2507" - "l-*-2505" - "l-*-2503" - "l-*-2501" - "l-*-2499" - "l-*-2497" - "l-*-2495" - "l-*-2493" - "l-*-2491" - "l-*-2489" - "l-*-2487" - "l-*-2485" - "l-*-2483" - "l-*-2481" - "l-*-2479" - "l-*-2477" - "l-*-2475" - "l-*-2473" - "l-*-2471" - "l-*-2469" - "l-*-2467" - "l-*-2465" - "l-*-2463" - "l-*-2461" - "l-*-2459" - "l-*-2457" - "l-*-2455" - "l-*-2453" - "l-*-2451" - "l-*-2450" - "l-*-2448" - "l-*-2445" - "l-*-2444" - "l-*-2443" - "l-*-2441" - "l-*-2440" - "l-*-2438" - "l-*-2436" - "l-*-2434" - "l-*-2432" - "l-*-2430" - "l-*-2428" - "l-*-2426" - "l-*-2424" - "l-*-2421" - "l-*-2419" - "l-*-2418" - "l-*-2416" - "l-*-2414" - "l-*-2412" - "l-*-2410" - "l-*-2409" - "l-*-2408" - "l-*-2407" - "l-*-2405" - "l-*-2404" - "l-*-2401" - "l-*-2399" - "l-*-2397" - "l-*-2395" - "l-*-2393" - "l-*-2391" - "l-*-2389" - "l-*-2388" - "l-*-2387" - "l-*-2385" - "l-*-2383" - "l-*-2382" - "l-*-2379" - "l-*-2378" - "l-*-2376" - "l-*-2374" - "l-*-2372" - "l-*-2370" - "l-*-2368" - "l-*-2366" - "l-*-2364" - "l-*-2362" - "l-*-2360" - "l-*-2357" - "l-*-2355" - "l-*-2353" - "l-*-2351" - "l-*-2349" - "l-*-2347" - "l-*-2345" - "l-*-2343" - "l-*-2341" - "l-*-2339" - "l-*-2337" - "l-*-2335" - "l-*-2333" - "l-*-2331" - "l-*-2329" - "l-*-2327" - "l-*-2325" - "l-*-2323" - "l-*-2321" - "l-*-2319" - "l-*-2317" - "l-*-2315" - "l-*-2313" - "l-*-2311" - "l-*-2309" - "l-*-2307" - "l-*-2306" - "l-*-2305" - "l-*-2304" - "l-*-2303" - "l-*-2301" - "l-*-2299" - "l-*-2297" - "l-*-2294" - "l-*-2292" - "l-*-2290" - "l-*-2288" - "l-*-2286" - "l-*-2284" - "l-*-2282" - "l-*-2280" - "l-*-2278" - "l-*-2276" - "l-*-2274" - "l-*-2272" - "l-*-2270" - "l-*-2268" - "l-*-2266" - "l-*-2264" - "l-*-2262" - "l-*-2260")) + ("l-*-478" + "l-*-476" + "l-*-474" + "l-*-472" + "l-*-470" + "l-*-468" + "l-*-466" + "l-*-464" + "l-*-462" + "l-*-460" + "l-*-458" + "l-*-456" + "l-*-454" + "l-*-452" + "l-*-450" + "l-*-448" + "l-*-446" + "l-*-444" + "l-*-442" + "l-*-440" + "l-*-438" + "l-*-436" + "l-*-434" + "l-*-432" + "l-*-430" + "l-*-428" + "l-*-426" + "l-*-424" + "l-*-422" + "l-*-420" + "l-*-418" + "l-*-416" + "l-*-414" + "l-*-412" + "l-*-410" + "l-*-408" + "l-*-406" + "l-*-404" + "l-*-402" + "l-*-401" + "l-*-399" + "l-*-396" + "l-*-395" + "l-*-394" + "l-*-392" + "l-*-391" + "l-*-389" + "l-*-387" + "l-*-385" + "l-*-383" + "l-*-381" + "l-*-379" + "l-*-377" + "l-*-375" + "l-*-372" + "l-*-370" + "l-*-369" + "l-*-367" + "l-*-365" + "l-*-363" + "l-*-361" + "l-*-360" + "l-*-359" + "l-*-358" + "l-*-356" + "l-*-355" + "l-*-352" + "l-*-350" + "l-*-348" + "l-*-346" + "l-*-344" + "l-*-342" + "l-*-341" + "l-*-340" + "l-*-338" + "l-*-336" + "l-*-335" + "l-*-332" + "l-*-331" + "l-*-329" + "l-*-327" + "l-*-325" + "l-*-323" + "l-*-321" + "l-*-319" + "l-*-317" + "l-*-315" + "l-*-313" + "l-*-310" + "l-*-308" + "l-*-306" + "l-*-304" + "l-*-302" + "l-*-300" + "l-*-298" + "l-*-296" + "l-*-294" + "l-*-292" + "l-*-290" + "l-*-288" + "l-*-286" + "l-*-284" + "l-*-282" + "l-*-280" + "l-*-278" + "l-*-276" + "l-*-274" + "l-*-272" + "l-*-270" + "l-*-268" + "l-*-266" + "l-*-264" + "l-*-262" + "l-*-260" + "l-*-258" + "l-*-257" + "l-*-256" + "l-*-255" + "l-*-254" + "l-*-252" + "l-*-250" + "l-*-248" + "l-*-245" + "l-*-243" + "l-*-241" + "l-*-239" + "l-*-237" + "l-*-235" + "l-*-233" + "l-*-231" + "l-*-229" + "l-*-227" + "l-*-225" + "l-*-223" + "l-*-221" + "l-*-219" + "l-*-217" + "l-*-215" + "l-*-213" + "l-*-211" + "l-*-209")) #(ribcage (define-structure define-expansion-accessors @@ -2734,9 +3446,13 @@ ((top) (top) (top)) - ("l-*-2098" - "l-*-2097" - "l-*-2096"))) + ("l-*-47" + "l-*-46" + "l-*-45")) + #(ribcage + () + () + ())) (hygiene guile)) #(syntax-object #f @@ -2744,7 +3460,7 @@ #(ribcage #(name) #((top)) - #("l-*-4022")) + #("l-*-2034")) #(ribcage () () ()) #(ribcage () () ()) #(ribcage @@ -2762,18 +3478,18 @@ (top) (top) (top)) - #("l-*-3961" - "l-*-3962" - "l-*-3963" - "l-*-3964" - "l-*-3965" - "l-*-3966" - "l-*-3967")) + #("l-*-1973" + "l-*-1974" + "l-*-1975" + "l-*-1976" + "l-*-1977" + "l-*-1978" + "l-*-1979")) #(ribcage () () ()) #(ribcage #(first) #((top)) - #("l-*-3952")) + #("l-*-1964")) #(ribcage () () ()) #(ribcage () () ()) #(ribcage () () ()) @@ -2792,13 +3508,13 @@ (top) (top) (top)) - #("l-*-3924" - "l-*-3925" - "l-*-3926" - "l-*-3927" - "l-*-3928" - "l-*-3929" - "l-*-3930")) + #("l-*-1943" + "l-*-1944" + "l-*-1945" + "l-*-1946" + "l-*-1947" + "l-*-1948" + "l-*-1949")) #(ribcage (lambda-var-list gen-var @@ -2813,7 +3529,7 @@ expand-local-syntax expand-body expand-macro - expand-application + expand-call expand-expr expand syntax-type @@ -2869,7 +3585,6 @@ id? nonsymbol-id? global-extend - lookup macros-only-env extend-var-env extend-env @@ -2895,6 +3610,7 @@ build-sequence build-data build-primref + build-primcall build-lambda-case build-case-lambda build-simple-lambda @@ -2906,7 +3622,7 @@ build-lexical-reference build-dynlet build-conditional - build-application + build-call build-void maybe-name-value! decorate-source @@ -2927,8 +3643,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 @@ -3079,147 +3796,149 @@ (top) (top) (top) + (top) (top)) - ("l-*-2527" - "l-*-2525" - "l-*-2523" - "l-*-2521" - "l-*-2519" - "l-*-2517" - "l-*-2515" - "l-*-2513" - "l-*-2511" - "l-*-2509" - "l-*-2507" - "l-*-2505" - "l-*-2503" - "l-*-2501" - "l-*-2499" - "l-*-2497" - "l-*-2495" - "l-*-2493" - "l-*-2491" - "l-*-2489" - "l-*-2487" - "l-*-2485" - "l-*-2483" - "l-*-2481" - "l-*-2479" - "l-*-2477" - "l-*-2475" - "l-*-2473" - "l-*-2471" - "l-*-2469" - "l-*-2467" - "l-*-2465" - "l-*-2463" - "l-*-2461" - "l-*-2459" - "l-*-2457" - "l-*-2455" - "l-*-2453" - "l-*-2451" - "l-*-2450" - "l-*-2448" - "l-*-2445" - "l-*-2444" - "l-*-2443" - "l-*-2441" - "l-*-2440" - "l-*-2438" - "l-*-2436" - "l-*-2434" - "l-*-2432" - "l-*-2430" - "l-*-2428" - "l-*-2426" - "l-*-2424" - "l-*-2421" - "l-*-2419" - "l-*-2418" - "l-*-2416" - "l-*-2414" - "l-*-2412" - "l-*-2410" - "l-*-2409" - "l-*-2408" - "l-*-2407" - "l-*-2405" - "l-*-2404" - "l-*-2401" - "l-*-2399" - "l-*-2397" - "l-*-2395" - "l-*-2393" - "l-*-2391" - "l-*-2389" - "l-*-2388" - "l-*-2387" - "l-*-2385" - "l-*-2383" - "l-*-2382" - "l-*-2379" - "l-*-2378" - "l-*-2376" - "l-*-2374" - "l-*-2372" - "l-*-2370" - "l-*-2368" - "l-*-2366" - "l-*-2364" - "l-*-2362" - "l-*-2360" - "l-*-2357" - "l-*-2355" - "l-*-2353" - "l-*-2351" - "l-*-2349" - "l-*-2347" - "l-*-2345" - "l-*-2343" - "l-*-2341" - "l-*-2339" - "l-*-2337" - "l-*-2335" - "l-*-2333" - "l-*-2331" - "l-*-2329" - "l-*-2327" - "l-*-2325" - "l-*-2323" - "l-*-2321" - "l-*-2319" - "l-*-2317" - "l-*-2315" - "l-*-2313" - "l-*-2311" - "l-*-2309" - "l-*-2307" - "l-*-2306" - "l-*-2305" - "l-*-2304" - "l-*-2303" - "l-*-2301" - "l-*-2299" - "l-*-2297" - "l-*-2294" - "l-*-2292" - "l-*-2290" - "l-*-2288" - "l-*-2286" - "l-*-2284" - "l-*-2282" - "l-*-2280" - "l-*-2278" - "l-*-2276" - "l-*-2274" - "l-*-2272" - "l-*-2270" - "l-*-2268" - "l-*-2266" - "l-*-2264" - "l-*-2262" - "l-*-2260")) + ("l-*-478" + "l-*-476" + "l-*-474" + "l-*-472" + "l-*-470" + "l-*-468" + "l-*-466" + "l-*-464" + "l-*-462" + "l-*-460" + "l-*-458" + "l-*-456" + "l-*-454" + "l-*-452" + "l-*-450" + "l-*-448" + "l-*-446" + "l-*-444" + "l-*-442" + "l-*-440" + "l-*-438" + "l-*-436" + "l-*-434" + "l-*-432" + "l-*-430" + "l-*-428" + "l-*-426" + "l-*-424" + "l-*-422" + "l-*-420" + "l-*-418" + "l-*-416" + "l-*-414" + "l-*-412" + "l-*-410" + "l-*-408" + "l-*-406" + "l-*-404" + "l-*-402" + "l-*-401" + "l-*-399" + "l-*-396" + "l-*-395" + "l-*-394" + "l-*-392" + "l-*-391" + "l-*-389" + "l-*-387" + "l-*-385" + "l-*-383" + "l-*-381" + "l-*-379" + "l-*-377" + "l-*-375" + "l-*-372" + "l-*-370" + "l-*-369" + "l-*-367" + "l-*-365" + "l-*-363" + "l-*-361" + "l-*-360" + "l-*-359" + "l-*-358" + "l-*-356" + "l-*-355" + "l-*-352" + "l-*-350" + "l-*-348" + "l-*-346" + "l-*-344" + "l-*-342" + "l-*-341" + "l-*-340" + "l-*-338" + "l-*-336" + "l-*-335" + "l-*-332" + "l-*-331" + "l-*-329" + "l-*-327" + "l-*-325" + "l-*-323" + "l-*-321" + "l-*-319" + "l-*-317" + "l-*-315" + "l-*-313" + "l-*-310" + "l-*-308" + "l-*-306" + "l-*-304" + "l-*-302" + "l-*-300" + "l-*-298" + "l-*-296" + "l-*-294" + "l-*-292" + "l-*-290" + "l-*-288" + "l-*-286" + "l-*-284" + "l-*-282" + "l-*-280" + "l-*-278" + "l-*-276" + "l-*-274" + "l-*-272" + "l-*-270" + "l-*-268" + "l-*-266" + "l-*-264" + "l-*-262" + "l-*-260" + "l-*-258" + "l-*-257" + "l-*-256" + "l-*-255" + "l-*-254" + "l-*-252" + "l-*-250" + "l-*-248" + "l-*-245" + "l-*-243" + "l-*-241" + "l-*-239" + "l-*-237" + "l-*-235" + "l-*-233" + "l-*-231" + "l-*-229" + "l-*-227" + "l-*-225" + "l-*-223" + "l-*-221" + "l-*-219" + "l-*-217" + "l-*-215" + "l-*-213" + "l-*-211" + "l-*-209")) #(ribcage (define-structure define-expansion-accessors @@ -3227,9 +3946,13 @@ ((top) (top) (top)) - ("l-*-2098" - "l-*-2097" - "l-*-2096"))) + ("l-*-47" + "l-*-46" + "l-*-45")) + #(ribcage + () + () + ())) (hygiene guile)) #(syntax-object #f @@ -3237,7 +3960,7 @@ #(ribcage #(name) #((top)) - #("l-*-4022")) + #("l-*-2034")) #(ribcage () () ()) #(ribcage () () ()) #(ribcage @@ -3255,18 +3978,18 @@ (top) (top) (top)) - #("l-*-3961" - "l-*-3962" - "l-*-3963" - "l-*-3964" - "l-*-3965" - "l-*-3966" - "l-*-3967")) + #("l-*-1973" + "l-*-1974" + "l-*-1975" + "l-*-1976" + "l-*-1977" + "l-*-1978" + "l-*-1979")) #(ribcage () () ()) #(ribcage #(first) #((top)) - #("l-*-3952")) + #("l-*-1964")) #(ribcage () () ()) #(ribcage () () ()) #(ribcage () () ()) @@ -3285,13 +4008,13 @@ (top) (top) (top)) - #("l-*-3924" - "l-*-3925" - "l-*-3926" - "l-*-3927" - "l-*-3928" - "l-*-3929" - "l-*-3930")) + #("l-*-1943" + "l-*-1944" + "l-*-1945" + "l-*-1946" + "l-*-1947" + "l-*-1948" + "l-*-1949")) #(ribcage (lambda-var-list gen-var @@ -3306,7 +4029,7 @@ expand-local-syntax expand-body expand-macro - expand-application + expand-call expand-expr expand syntax-type @@ -3362,7 +4085,6 @@ id? nonsymbol-id? global-extend - lookup macros-only-env extend-var-env extend-env @@ -3388,6 +4110,7 @@ build-sequence build-data build-primref + build-primcall build-lambda-case build-case-lambda build-simple-lambda @@ -3399,7 +4122,7 @@ build-lexical-reference build-dynlet build-conditional - build-application + build-call build-void maybe-name-value! decorate-source @@ -3420,8 +4143,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 @@ -3572,147 +4296,149 @@ (top) (top) (top) + (top) (top)) - ("l-*-2527" - "l-*-2525" - "l-*-2523" - "l-*-2521" - "l-*-2519" - "l-*-2517" - "l-*-2515" - "l-*-2513" - "l-*-2511" - "l-*-2509" - "l-*-2507" - "l-*-2505" - "l-*-2503" - "l-*-2501" - "l-*-2499" - "l-*-2497" - "l-*-2495" - "l-*-2493" - "l-*-2491" - "l-*-2489" - "l-*-2487" - "l-*-2485" - "l-*-2483" - "l-*-2481" - "l-*-2479" - "l-*-2477" - "l-*-2475" - "l-*-2473" - "l-*-2471" - "l-*-2469" - "l-*-2467" - "l-*-2465" - "l-*-2463" - "l-*-2461" - "l-*-2459" - "l-*-2457" - "l-*-2455" - "l-*-2453" - "l-*-2451" - "l-*-2450" - "l-*-2448" - "l-*-2445" - "l-*-2444" - "l-*-2443" - "l-*-2441" - "l-*-2440" - "l-*-2438" - "l-*-2436" - "l-*-2434" - "l-*-2432" - "l-*-2430" - "l-*-2428" - "l-*-2426" - "l-*-2424" - "l-*-2421" - "l-*-2419" - "l-*-2418" - "l-*-2416" - "l-*-2414" - "l-*-2412" - "l-*-2410" - "l-*-2409" - "l-*-2408" - "l-*-2407" - "l-*-2405" - "l-*-2404" - "l-*-2401" - "l-*-2399" - "l-*-2397" - "l-*-2395" - "l-*-2393" - "l-*-2391" - "l-*-2389" - "l-*-2388" - "l-*-2387" - "l-*-2385" - "l-*-2383" - "l-*-2382" - "l-*-2379" - "l-*-2378" - "l-*-2376" - "l-*-2374" - "l-*-2372" - "l-*-2370" - "l-*-2368" - "l-*-2366" - "l-*-2364" - "l-*-2362" - "l-*-2360" - "l-*-2357" - "l-*-2355" - "l-*-2353" - "l-*-2351" - "l-*-2349" - "l-*-2347" - "l-*-2345" - "l-*-2343" - "l-*-2341" - "l-*-2339" - "l-*-2337" - "l-*-2335" - "l-*-2333" - "l-*-2331" - "l-*-2329" - "l-*-2327" - "l-*-2325" - "l-*-2323" - "l-*-2321" - "l-*-2319" - "l-*-2317" - "l-*-2315" - "l-*-2313" - "l-*-2311" - "l-*-2309" - "l-*-2307" - "l-*-2306" - "l-*-2305" - "l-*-2304" - "l-*-2303" - "l-*-2301" - "l-*-2299" - "l-*-2297" - "l-*-2294" - "l-*-2292" - "l-*-2290" - "l-*-2288" - "l-*-2286" - "l-*-2284" - "l-*-2282" - "l-*-2280" - "l-*-2278" - "l-*-2276" - "l-*-2274" - "l-*-2272" - "l-*-2270" - "l-*-2268" - "l-*-2266" - "l-*-2264" - "l-*-2262" - "l-*-2260")) + ("l-*-478" + "l-*-476" + "l-*-474" + "l-*-472" + "l-*-470" + "l-*-468" + "l-*-466" + "l-*-464" + "l-*-462" + "l-*-460" + "l-*-458" + "l-*-456" + "l-*-454" + "l-*-452" + "l-*-450" + "l-*-448" + "l-*-446" + "l-*-444" + "l-*-442" + "l-*-440" + "l-*-438" + "l-*-436" + "l-*-434" + "l-*-432" + "l-*-430" + "l-*-428" + "l-*-426" + "l-*-424" + "l-*-422" + "l-*-420" + "l-*-418" + "l-*-416" + "l-*-414" + "l-*-412" + "l-*-410" + "l-*-408" + "l-*-406" + "l-*-404" + "l-*-402" + "l-*-401" + "l-*-399" + "l-*-396" + "l-*-395" + "l-*-394" + "l-*-392" + "l-*-391" + "l-*-389" + "l-*-387" + "l-*-385" + "l-*-383" + "l-*-381" + "l-*-379" + "l-*-377" + "l-*-375" + "l-*-372" + "l-*-370" + "l-*-369" + "l-*-367" + "l-*-365" + "l-*-363" + "l-*-361" + "l-*-360" + "l-*-359" + "l-*-358" + "l-*-356" + "l-*-355" + "l-*-352" + "l-*-350" + "l-*-348" + "l-*-346" + "l-*-344" + "l-*-342" + "l-*-341" + "l-*-340" + "l-*-338" + "l-*-336" + "l-*-335" + "l-*-332" + "l-*-331" + "l-*-329" + "l-*-327" + "l-*-325" + "l-*-323" + "l-*-321" + "l-*-319" + "l-*-317" + "l-*-315" + "l-*-313" + "l-*-310" + "l-*-308" + "l-*-306" + "l-*-304" + "l-*-302" + "l-*-300" + "l-*-298" + "l-*-296" + "l-*-294" + "l-*-292" + "l-*-290" + "l-*-288" + "l-*-286" + "l-*-284" + "l-*-282" + "l-*-280" + "l-*-278" + "l-*-276" + "l-*-274" + "l-*-272" + "l-*-270" + "l-*-268" + "l-*-266" + "l-*-264" + "l-*-262" + "l-*-260" + "l-*-258" + "l-*-257" + "l-*-256" + "l-*-255" + "l-*-254" + "l-*-252" + "l-*-250" + "l-*-248" + "l-*-245" + "l-*-243" + "l-*-241" + "l-*-239" + "l-*-237" + "l-*-235" + "l-*-233" + "l-*-231" + "l-*-229" + "l-*-227" + "l-*-225" + "l-*-223" + "l-*-221" + "l-*-219" + "l-*-217" + "l-*-215" + "l-*-213" + "l-*-211" + "l-*-209")) #(ribcage (define-structure define-expansion-accessors @@ -3720,2679 +4446,2873 @@ ((top) (top) (top)) - ("l-*-2098" - "l-*-2097" - "l-*-2096"))) + ("l-*-47" + "l-*-46" + "l-*-45")) + #(ribcage + () + () + ())) (hygiene guile))) '(()) - s-22821 - mod-22823)) - tmp-23166) + s-25087 + mod-25089)) + tmp-25944) (syntax-violation #f "source expression failed to match any pattern" - e-22818))))))) - (if (eqv? ftype-22862 'define-syntax) - (let ((tmp-23218 + e-25084))))))) + (if (eqv? ftype-25106 'define-syntax) + (let ((tmp-26188 ($sc-dispatch - e-22818 + e-25084 '(_ any any)))) - (if (if tmp-23218 + (if (if tmp-26188 (@apply - (lambda (name-23222 val-23223) - (if (symbol? name-23222) + (lambda (name-26192 val-26193) + (if (symbol? name-26192) #t (if (if (vector? - name-23222) + name-26192) (if (= (vector-length - name-23222) + name-26192) 4) (eq? (vector-ref - name-23222 + name-26192 0) 'syntax-object) #f) #f) (symbol? (vector-ref - name-23222 + name-26192 1)) #f))) - tmp-23218) + tmp-26188) #f) (@apply - (lambda (name-23250 val-23251) + (lambda (name-26220 val-26221) (values 'define-syntax-form - name-23250 - e-22818 - val-23251 - w-22820 - s-22821 - mod-22823)) - tmp-23218) + name-26220 + e-25084 + val-26221 + w-25086 + s-25087 + mod-25089)) + tmp-26188) (syntax-violation #f "source expression failed to match any pattern" - e-22818))) - (if (eqv? ftype-22862 + e-25084))) + (if (eqv? ftype-25106 'define-syntax-parameter) - (let ((tmp-23262 + (let ((tmp-26232 ($sc-dispatch - e-22818 + e-25084 '(_ any any)))) - (if (if tmp-23262 + (if (if tmp-26232 (@apply - (lambda (name-23266 - val-23267) - (if (symbol? name-23266) + (lambda (name-26236 + val-26237) + (if (symbol? name-26236) #t (if (if (vector? - name-23266) + name-26236) (if (= (vector-length - name-23266) + name-26236) 4) (eq? (vector-ref - name-23266 + name-26236 0) 'syntax-object) #f) #f) (symbol? (vector-ref - name-23266 + name-26236 1)) #f))) - tmp-23262) + tmp-26232) #f) (@apply - (lambda (name-23294 val-23295) + (lambda (name-26264 val-26265) (values 'define-syntax-parameter-form - name-23294 - e-22818 - val-23295 - w-22820 - s-22821 - mod-22823)) - tmp-23262) + name-26264 + e-25084 + val-26265 + w-25086 + s-25087 + mod-25089)) + tmp-26232) (syntax-violation #f "source expression failed to match any pattern" - e-22818))) + e-25084))) (values 'call #f - e-22818 - e-22818 - w-22820 - s-22821 - mod-22823))))))))))))))) - (if (if (vector? e-22818) - (if (= (vector-length e-22818) 4) - (eq? (vector-ref e-22818 0) 'syntax-object) + e-25084 + e-25084 + w-25086 + s-25087 + mod-25089))))))))))))))) + (if (if (vector? e-25084) + (if (= (vector-length e-25084) 4) + (eq? (vector-ref e-25084 0) 'syntax-object) #f) #f) - (syntax-type-6584 - (vector-ref e-22818 1) - r-22819 - (join-wraps-6565 w-22820 (vector-ref e-22818 2)) - (let ((t-23322 (source-annotation-6542 e-22818))) - (if t-23322 t-23322 s-22821)) - rib-22822 - (let ((t-23557 (vector-ref e-22818 3))) - (if t-23557 t-23557 mod-22823)) - for-car?-22824) - (if (self-evaluating? e-22818) + (syntax-type-4585 + (vector-ref e-25084 1) + r-25085 + (let ((w2-26290 (vector-ref e-25084 2))) + (let ((m1-26291 (car w-25086)) + (s1-26292 (cdr w-25086))) + (if (null? m1-26291) + (if (null? s1-26292) + w2-26290 + (cons (car w2-26290) + (let ((m2-26303 (cdr w2-26290))) + (if (null? m2-26303) + s1-26292 + (append s1-26292 m2-26303))))) + (cons (let ((m2-26311 (car w2-26290))) + (if (null? m2-26311) + m1-26291 + (append m1-26291 m2-26311))) + (let ((m2-26319 (cdr w2-26290))) + (if (null? m2-26319) + s1-26292 + (append s1-26292 m2-26319))))))) + (let ((t-26324 (source-annotation-4544 e-25084))) + (if t-26324 t-26324 s-25087)) + rib-25088 + (let ((t-26600 (vector-ref e-25084 3))) + (if t-26600 t-26600 mod-25089)) + for-car?-25090) + (if (self-evaluating? e-25084) (values 'constant #f - e-22818 - e-22818 - w-22820 - s-22821 - mod-22823) + e-25084 + e-25084 + w-25086 + s-25087 + mod-25089) (values 'other #f - e-22818 - e-22818 - w-22820 - s-22821 - mod-22823))))))) - (expand-6585 - (lambda (e-23566 r-23567 w-23568 mod-23569) + e-25084 + e-25084 + w-25086 + s-25087 + mod-25089))))))) + (expand-4586 + (lambda (e-26609 r-26610 w-26611 mod-26612) (call-with-values (lambda () - (syntax-type-6584 - e-23566 - r-23567 - w-23568 - (source-annotation-6542 e-23566) + (syntax-type-4585 + e-26609 + r-26610 + w-26611 + (source-annotation-4544 e-26609) #f - mod-23569 + mod-26612 #f)) - (lambda (type-23724 - value-23725 - form-23726 - e-23727 - w-23728 - s-23729 - mod-23730) - (expand-expr-6586 - type-23724 - value-23725 - form-23726 - e-23727 - r-23567 - w-23728 - s-23729 - mod-23730))))) - (expand-expr-6586 - (lambda (type-23733 - value-23734 - form-23735 - e-23736 - r-23737 - w-23738 - s-23739 - mod-23740) - (if (eqv? type-23733 'lexical) + (lambda (type-26798 + value-26799 + form-26800 + e-26801 + w-26802 + s-26803 + mod-26804) + (expand-expr-4587 + type-26798 + value-26799 + form-26800 + e-26801 + r-26610 + w-26802 + s-26803 + mod-26804))))) + (expand-expr-4587 + (lambda (type-26807 + value-26808 + form-26809 + e-26810 + r-26811 + w-26812 + s-26813 + mod-26814) + (if (eqv? type-26807 'lexical) (make-struct/no-tail (vector-ref %expanded-vtables 3) - s-23739 - e-23736 - value-23734) - (if (if (eqv? type-23733 'core) + s-26813 + e-26810 + value-26808) + (if (if (eqv? type-26807 'core) #t - (eqv? type-23733 'core-form)) - (value-23734 - e-23736 - r-23737 - w-23738 - s-23739 - mod-23740) - (if (eqv? type-23733 'module-ref) + (eqv? type-26807 'core-form)) + (value-26808 + e-26810 + r-26811 + w-26812 + s-26813 + mod-26814) + (if (eqv? type-26807 'module-ref) (call-with-values - (lambda () (value-23734 e-23736 r-23737 w-23738)) - (lambda (e-23766 r-23767 w-23768 s-23769 mod-23770) - (expand-6585 e-23766 r-23767 w-23768 mod-23770))) - (if (eqv? type-23733 'lexical-call) - (expand-application-6587 - (let ((id-23845 (car e-23736))) - (build-lexical-reference-6519 + (lambda () (value-26808 e-26810 r-26811 w-26812)) + (lambda (e-26840 r-26841 w-26842 s-26843 mod-26844) + (expand-4586 e-26840 r-26841 w-26842 mod-26844))) + (if (eqv? type-26807 'lexical-call) + (expand-call-4588 + (let ((id-27017 (car e-26810))) + (build-lexical-reference-4520 'fun - (source-annotation-6542 id-23845) - (if (if (vector? id-23845) - (if (= (vector-length id-23845) 4) - (eq? (vector-ref id-23845 0) 'syntax-object) + (source-annotation-4544 id-27017) + (if (if (vector? id-27017) + (if (= (vector-length id-27017) 4) + (eq? (vector-ref id-27017 0) 'syntax-object) #f) #f) - (syntax->datum id-23845) - id-23845) - value-23734)) - e-23736 - r-23737 - w-23738 - s-23739 - mod-23740) - (if (eqv? type-23733 'global-call) - (expand-application-6587 - (build-global-reference-6522 - (source-annotation-6542 (car e-23736)) - (if (if (vector? value-23734) - (if (= (vector-length value-23734) 4) - (eq? (vector-ref value-23734 0) 'syntax-object) + (syntax->datum id-27017) + id-27017) + value-26808)) + e-26810 + r-26811 + w-26812 + s-26813 + mod-26814) + (if (eqv? type-26807 'global-call) + (expand-call-4588 + (build-global-reference-4523 + (source-annotation-4544 (car e-26810)) + (if (if (vector? value-26808) + (if (= (vector-length value-26808) 4) + (eq? (vector-ref value-26808 0) 'syntax-object) #f) #f) - (vector-ref value-23734 1) - value-23734) - (if (if (vector? value-23734) - (if (= (vector-length value-23734) 4) - (eq? (vector-ref value-23734 0) 'syntax-object) + (vector-ref value-26808 1) + value-26808) + (if (if (vector? value-26808) + (if (= (vector-length value-26808) 4) + (eq? (vector-ref value-26808 0) 'syntax-object) #f) #f) - (vector-ref value-23734 3) - mod-23740)) - e-23736 - r-23737 - w-23738 - s-23739 - mod-23740) - (if (eqv? type-23733 'constant) - (let ((exp-24182 - (strip-6598 - (wrap-6578 - (begin - (if (if (pair? e-23736) s-23739 #f) - (set-source-properties! e-23736 s-23739)) - e-23736) - w-23738 - mod-23740) + (vector-ref value-26808 3) + mod-26814)) + e-26810 + r-26811 + w-26812 + s-26813 + mod-26814) + (if (eqv? type-26807 'constant) + (let ((exp-27691 + (strip-4599 + (let ((x-27704 + (begin + (if (if (pair? e-26810) s-26813 #f) + (set-source-properties! + e-26810 + s-26813)) + e-26810))) + (if (if (null? (car w-26812)) + (null? (cdr w-26812)) + #f) + x-27704 + (if (if (vector? x-27704) + (if (= (vector-length x-27704) 4) + (eq? (vector-ref x-27704 0) + 'syntax-object) + #f) + #f) + (let ((expression-27736 + (vector-ref x-27704 1)) + (wrap-27737 + (let ((w2-27745 + (vector-ref x-27704 2))) + (let ((m1-27746 (car w-26812)) + (s1-27747 (cdr w-26812))) + (if (null? m1-27746) + (if (null? s1-27747) + w2-27745 + (cons (car w2-27745) + (let ((m2-27762 + (cdr w2-27745))) + (if (null? m2-27762) + s1-27747 + (append + s1-27747 + m2-27762))))) + (cons (let ((m2-27770 + (car w2-27745))) + (if (null? m2-27770) + m1-27746 + (append + m1-27746 + m2-27770))) + (let ((m2-27778 + (cdr w2-27745))) + (if (null? m2-27778) + s1-27747 + (append + s1-27747 + m2-27778)))))))) + (module-27738 + (vector-ref x-27704 3))) + (vector + 'syntax-object + expression-27736 + wrap-27737 + module-27738)) + (if (null? x-27704) + x-27704 + (vector + 'syntax-object + x-27704 + w-26812 + mod-26814))))) '(())))) (make-struct/no-tail (vector-ref %expanded-vtables 1) - s-23739 - exp-24182)) - (if (eqv? type-23733 'global) - (analyze-variable-6521 - mod-23740 - value-23734 - (lambda (mod-24218 var-24219 public?-24220) + s-26813 + exp-27691)) + (if (eqv? type-26807 'global) + (analyze-variable-4522 + mod-26814 + value-26808 + (lambda (mod-27803 var-27804 public?-27805) (make-struct/no-tail (vector-ref %expanded-vtables 5) - s-23739 - mod-24218 - var-24219 - public?-24220)) - (lambda (var-24229) + s-26813 + mod-27803 + var-27804 + public?-27805)) + (lambda (var-27813) (make-struct/no-tail (vector-ref %expanded-vtables 7) - s-23739 - var-24229))) - (if (eqv? type-23733 'call) - (expand-application-6587 - (expand-6585 - (car e-23736) - r-23737 - w-23738 - mod-23740) - e-23736 - r-23737 - w-23738 - s-23739 - mod-23740) - (if (eqv? type-23733 'begin-form) - (let ((tmp-24304 - ($sc-dispatch e-23736 '(_ any . each-any)))) - (if tmp-24304 + s-26813 + var-27813))) + (if (eqv? type-26807 'call) + (expand-call-4588 + (expand-4586 + (car e-26810) + r-26811 + w-26812 + mod-26814) + e-26810 + r-26811 + w-26812 + s-26813 + mod-26814) + (if (eqv? type-26807 'begin-form) + (let ((tmp-27983 + ($sc-dispatch e-26810 '(_ any . each-any)))) + (if tmp-27983 (@apply - (lambda (e1-24308 e2-24309) - (expand-sequence-6580 - (cons e1-24308 e2-24309) - r-23737 - w-23738 - s-23739 - mod-23740)) - tmp-24304) - (let ((tmp-24396 ($sc-dispatch e-23736 '(_)))) - (if tmp-24396 + (lambda (e1-27987 e2-27988) + (expand-sequence-4581 + (cons e1-27987 e2-27988) + r-26811 + w-26812 + s-26813 + mod-26814)) + tmp-27983) + (let ((tmp-28083 ($sc-dispatch e-26810 '(_)))) + (if tmp-28083 (@apply (lambda () - (if (include-deprecated-features) - (begin - (issue-deprecation-warning - "Sequences of zero expressions are deprecated. Use *unspecified*.") - (make-struct/no-tail - (vector-ref %expanded-vtables 0) - #f)) - (syntax-violation - #f - "sequence of zero expressions" - (wrap-6578 - (begin - (if (if (pair? e-23736) - s-23739 + (syntax-violation + #f + "sequence of zero expressions" + (let ((x-28096 + (begin + (if (if (pair? e-26810) + s-26813 + #f) + (set-source-properties! + e-26810 + s-26813)) + e-26810))) + (if (if (null? (car w-26812)) + (null? (cdr w-26812)) + #f) + x-28096 + (if (if (vector? x-28096) + (if (= (vector-length + x-28096) + 4) + (eq? (vector-ref + x-28096 + 0) + 'syntax-object) #f) - (set-source-properties! - e-23736 - s-23739)) - e-23736) - w-23738 - mod-23740)))) - tmp-24396) + #f) + (let ((expression-28128 + (vector-ref x-28096 1)) + (wrap-28129 + (let ((w2-28137 + (vector-ref + x-28096 + 2))) + (let ((m1-28138 + (car w-26812)) + (s1-28139 + (cdr w-26812))) + (if (null? m1-28138) + (if (null? s1-28139) + w2-28137 + (cons (car w2-28137) + (let ((m2-28154 + (cdr w2-28137))) + (if (null? m2-28154) + s1-28139 + (append + s1-28139 + m2-28154))))) + (cons (let ((m2-28162 + (car w2-28137))) + (if (null? m2-28162) + m1-28138 + (append + m1-28138 + m2-28162))) + (let ((m2-28170 + (cdr w2-28137))) + (if (null? m2-28170) + s1-28139 + (append + s1-28139 + m2-28170)))))))) + (module-28130 + (vector-ref x-28096 3))) + (vector + 'syntax-object + expression-28128 + wrap-28129 + module-28130)) + (if (null? x-28096) + x-28096 + (vector + 'syntax-object + x-28096 + w-26812 + mod-26814))))))) + tmp-28083) (syntax-violation #f "source expression failed to match any pattern" - e-23736))))) - (if (eqv? type-23733 'local-syntax-form) - (expand-local-syntax-6590 - value-23734 - e-23736 - r-23737 - w-23738 - s-23739 - mod-23740 - expand-sequence-6580) - (if (eqv? type-23733 'eval-when-form) - (let ((tmp-24507 + e-26810))))) + (if (eqv? type-26807 'local-syntax-form) + (expand-local-syntax-4591 + value-26808 + e-26810 + r-26811 + w-26812 + s-26813 + mod-26814 + expand-sequence-4581) + (if (eqv? type-26807 'eval-when-form) + (let ((tmp-28265 ($sc-dispatch - e-23736 + e-26810 '(_ each-any any . each-any)))) - (if tmp-24507 + (if tmp-28265 (@apply - (lambda (x-24511 e1-24512 e2-24513) - (let ((when-list-24514 - (parse-when-list-6583 - e-23736 - x-24511))) - (if (memq 'eval when-list-24514) - (expand-sequence-6580 - (cons e1-24512 e2-24513) - r-23737 - w-23738 - s-23739 - mod-23740) + (lambda (x-28269 e1-28270 e2-28271) + (let ((when-list-28272 + (parse-when-list-4584 + e-26810 + x-28269))) + (if (memq 'eval when-list-28272) + (expand-sequence-4581 + (cons e1-28270 e2-28271) + r-26811 + w-26812 + s-26813 + mod-26814) (make-struct/no-tail (vector-ref %expanded-vtables 0) #f)))) - tmp-24507) + tmp-28265) (syntax-violation #f "source expression failed to match any pattern" - e-23736))) - (if (if (eqv? type-23733 'define-form) + e-26810))) + (if (if (eqv? type-26807 'define-form) #t - (if (eqv? type-23733 'define-syntax-form) + (if (eqv? type-26807 'define-syntax-form) #t - (eqv? type-23733 + (eqv? type-26807 'define-syntax-parameter-form))) (syntax-violation #f "definition in expression context, where definitions are not allowed," - (wrap-6578 - (begin - (if (if (pair? form-23735) s-23739 #f) - (set-source-properties! - form-23735 - s-23739)) - form-23735) - w-23738 - mod-23740)) - (if (eqv? type-23733 'syntax) + (let ((x-28458 + (begin + (if (if (pair? form-26809) + s-26813 + #f) + (set-source-properties! + form-26809 + s-26813)) + form-26809))) + (if (if (null? (car w-26812)) + (null? (cdr w-26812)) + #f) + x-28458 + (if (if (vector? x-28458) + (if (= (vector-length x-28458) 4) + (eq? (vector-ref x-28458 0) + 'syntax-object) + #f) + #f) + (let ((expression-28490 + (vector-ref x-28458 1)) + (wrap-28491 + (let ((w2-28499 + (vector-ref + x-28458 + 2))) + (let ((m1-28500 + (car w-26812)) + (s1-28501 + (cdr w-26812))) + (if (null? m1-28500) + (if (null? s1-28501) + w2-28499 + (cons (car w2-28499) + (let ((m2-28516 + (cdr w2-28499))) + (if (null? m2-28516) + s1-28501 + (append + s1-28501 + m2-28516))))) + (cons (let ((m2-28524 + (car w2-28499))) + (if (null? m2-28524) + m1-28500 + (append + m1-28500 + m2-28524))) + (let ((m2-28532 + (cdr w2-28499))) + (if (null? m2-28532) + s1-28501 + (append + s1-28501 + m2-28532)))))))) + (module-28492 + (vector-ref x-28458 3))) + (vector + 'syntax-object + expression-28490 + wrap-28491 + module-28492)) + (if (null? x-28458) + x-28458 + (vector + 'syntax-object + x-28458 + w-26812 + mod-26814)))))) + (if (eqv? type-26807 'syntax) (syntax-violation #f "reference to pattern variable outside syntax form" - (wrap-6578 - (begin - (if (if (pair? e-23736) s-23739 #f) - (set-source-properties! - e-23736 - s-23739)) - e-23736) - w-23738 - mod-23740)) - (if (eqv? type-23733 'displaced-lexical) + (let ((x-28559 + (begin + (if (if (pair? e-26810) + s-26813 + #f) + (set-source-properties! + e-26810 + s-26813)) + e-26810))) + (if (if (null? (car w-26812)) + (null? (cdr w-26812)) + #f) + x-28559 + (if (if (vector? x-28559) + (if (= (vector-length x-28559) + 4) + (eq? (vector-ref x-28559 0) + 'syntax-object) + #f) + #f) + (let ((expression-28591 + (vector-ref x-28559 1)) + (wrap-28592 + (let ((w2-28600 + (vector-ref + x-28559 + 2))) + (let ((m1-28601 + (car w-26812)) + (s1-28602 + (cdr w-26812))) + (if (null? m1-28601) + (if (null? s1-28602) + w2-28600 + (cons (car w2-28600) + (let ((m2-28617 + (cdr w2-28600))) + (if (null? m2-28617) + s1-28602 + (append + s1-28602 + m2-28617))))) + (cons (let ((m2-28625 + (car w2-28600))) + (if (null? m2-28625) + m1-28601 + (append + m1-28601 + m2-28625))) + (let ((m2-28633 + (cdr w2-28600))) + (if (null? m2-28633) + s1-28602 + (append + s1-28602 + m2-28633)))))))) + (module-28593 + (vector-ref x-28559 3))) + (vector + 'syntax-object + expression-28591 + wrap-28592 + module-28593)) + (if (null? x-28559) + x-28559 + (vector + 'syntax-object + x-28559 + w-26812 + mod-26814)))))) + (if (eqv? type-26807 'displaced-lexical) (syntax-violation #f "reference to identifier outside its scope" - (wrap-6578 - (begin - (if (if (pair? e-23736) s-23739 #f) - (set-source-properties! - e-23736 - s-23739)) - e-23736) - w-23738 - mod-23740)) + (let ((x-28660 + (begin + (if (if (pair? e-26810) + s-26813 + #f) + (set-source-properties! + e-26810 + s-26813)) + e-26810))) + (if (if (null? (car w-26812)) + (null? (cdr w-26812)) + #f) + x-28660 + (if (if (vector? x-28660) + (if (= (vector-length x-28660) + 4) + (eq? (vector-ref x-28660 0) + 'syntax-object) + #f) + #f) + (let ((expression-28692 + (vector-ref x-28660 1)) + (wrap-28693 + (let ((w2-28701 + (vector-ref + x-28660 + 2))) + (let ((m1-28702 + (car w-26812)) + (s1-28703 + (cdr w-26812))) + (if (null? m1-28702) + (if (null? s1-28703) + w2-28701 + (cons (car w2-28701) + (let ((m2-28718 + (cdr w2-28701))) + (if (null? m2-28718) + s1-28703 + (append + s1-28703 + m2-28718))))) + (cons (let ((m2-28726 + (car w2-28701))) + (if (null? m2-28726) + m1-28702 + (append + m1-28702 + m2-28726))) + (let ((m2-28734 + (cdr w2-28701))) + (if (null? m2-28734) + s1-28703 + (append + s1-28703 + m2-28734)))))))) + (module-28694 + (vector-ref x-28660 3))) + (vector + 'syntax-object + expression-28692 + wrap-28693 + module-28694)) + (if (null? x-28660) + x-28660 + (vector + 'syntax-object + x-28660 + w-26812 + mod-26814)))))) (syntax-violation #f "unexpected syntax" - (wrap-6578 - (begin - (if (if (pair? e-23736) s-23739 #f) - (set-source-properties! - e-23736 - s-23739)) - e-23736) - w-23738 - mod-23740)))))))))))))))))) - (expand-application-6587 - (lambda (x-24774 - e-24775 - r-24776 - w-24777 - s-24778 - mod-24779) - (let ((tmp-24781 - ($sc-dispatch e-24775 '(any . each-any)))) - (if tmp-24781 + (let ((x-28758 + (begin + (if (if (pair? e-26810) + s-26813 + #f) + (set-source-properties! + e-26810 + s-26813)) + e-26810))) + (if (if (null? (car w-26812)) + (null? (cdr w-26812)) + #f) + x-28758 + (if (if (vector? x-28758) + (if (= (vector-length x-28758) + 4) + (eq? (vector-ref x-28758 0) + 'syntax-object) + #f) + #f) + (let ((expression-28790 + (vector-ref x-28758 1)) + (wrap-28791 + (let ((w2-28799 + (vector-ref + x-28758 + 2))) + (let ((m1-28800 + (car w-26812)) + (s1-28801 + (cdr w-26812))) + (if (null? m1-28800) + (if (null? s1-28801) + w2-28799 + (cons (car w2-28799) + (let ((m2-28816 + (cdr w2-28799))) + (if (null? m2-28816) + s1-28801 + (append + s1-28801 + m2-28816))))) + (cons (let ((m2-28824 + (car w2-28799))) + (if (null? m2-28824) + m1-28800 + (append + m1-28800 + m2-28824))) + (let ((m2-28832 + (cdr w2-28799))) + (if (null? m2-28832) + s1-28801 + (append + s1-28801 + m2-28832)))))))) + (module-28792 + (vector-ref x-28758 3))) + (vector + 'syntax-object + expression-28790 + wrap-28791 + module-28792)) + (if (null? x-28758) + x-28758 + (vector + 'syntax-object + x-28758 + w-26812 + mod-26814)))))))))))))))))))))) + (expand-call-4588 + (lambda (x-28847 + e-28848 + r-28849 + w-28850 + s-28851 + mod-28852) + (let ((tmp-28854 + ($sc-dispatch e-28848 '(any . each-any)))) + (if tmp-28854 (@apply - (lambda (e0-24785 e1-24786) - (build-application-6516 - s-24778 - x-24774 - (map (lambda (e-24866) - (expand-6585 e-24866 r-24776 w-24777 mod-24779)) - e1-24786))) - tmp-24781) + (lambda (e0-28858 e1-28859) + (build-call-4517 + s-28851 + x-28847 + (map (lambda (e-28947) + (expand-4586 e-28947 r-28849 w-28850 mod-28852)) + e1-28859))) + tmp-28854) (syntax-violation #f "source expression failed to match any pattern" - e-24775))))) - (expand-macro-6588 - (lambda (p-24942 - e-24943 - r-24944 - w-24945 - s-24946 - rib-24947 - mod-24948) + e-28848))))) + (expand-macro-4589 + (lambda (p-29031 + e-29032 + r-29033 + w-29034 + s-29035 + rib-29036 + mod-29037) (letrec* - ((rebuild-macro-output-24949 - (lambda (x-24982 m-24983) - (if (pair? x-24982) - (let ((e-24987 - (cons (rebuild-macro-output-24949 - (car x-24982) - m-24983) - (rebuild-macro-output-24949 - (cdr x-24982) - m-24983)))) + ((rebuild-macro-output-29038 + (lambda (x-29147 m-29148) + (if (pair? x-29147) + (let ((e-29152 + (cons (rebuild-macro-output-29038 + (car x-29147) + m-29148) + (rebuild-macro-output-29038 + (cdr x-29147) + m-29148)))) (begin - (if (if (pair? e-24987) s-24946 #f) - (set-source-properties! e-24987 s-24946)) - e-24987)) - (if (if (vector? x-24982) - (if (= (vector-length x-24982) 4) - (eq? (vector-ref x-24982 0) 'syntax-object) + (if (if (pair? e-29152) s-29035 #f) + (set-source-properties! e-29152 s-29035)) + e-29152)) + (if (if (vector? x-29147) + (if (= (vector-length x-29147) 4) + (eq? (vector-ref x-29147 0) 'syntax-object) #f) #f) - (let ((w-25003 (vector-ref x-24982 2))) - (let ((ms-25004 (car w-25003)) - (s-25005 (cdr w-25003))) - (if (if (pair? ms-25004) (eq? (car ms-25004) #f) #f) - (let ((expression-25013 (vector-ref x-24982 1)) - (wrap-25014 - (cons (cdr ms-25004) - (if rib-24947 - (cons rib-24947 (cdr s-25005)) - (cdr s-25005)))) - (module-25015 (vector-ref x-24982 3))) + (let ((w-29168 (vector-ref x-29147 2))) + (let ((ms-29169 (car w-29168)) + (s-29170 (cdr w-29168))) + (if (if (pair? ms-29169) (eq? (car ms-29169) #f) #f) + (let ((expression-29178 (vector-ref x-29147 1)) + (wrap-29179 + (cons (cdr ms-29169) + (if rib-29036 + (cons rib-29036 (cdr s-29170)) + (cdr s-29170)))) + (module-29180 (vector-ref x-29147 3))) (vector 'syntax-object - expression-25013 - wrap-25014 - module-25015)) - (let ((expression-25025 - (let ((e-25030 (vector-ref x-24982 1))) + expression-29178 + wrap-29179 + module-29180)) + (let ((expression-29190 + (let ((e-29195 (vector-ref x-29147 1))) (begin - (if (if (pair? e-25030) s-25005 #f) + (if (if (pair? e-29195) s-29170 #f) (set-source-properties! - e-25030 - s-25005)) - e-25030))) - (wrap-25026 - (cons (cons m-24983 ms-25004) - (if rib-24947 - (cons rib-24947 - (cons 'shift s-25005)) - (cons 'shift s-25005)))) - (module-25027 (vector-ref x-24982 3))) + e-29195 + s-29170)) + e-29195))) + (wrap-29191 + (cons (cons m-29148 ms-29169) + (if rib-29036 + (cons rib-29036 + (cons 'shift s-29170)) + (cons 'shift s-29170)))) + (module-29192 (vector-ref x-29147 3))) (vector 'syntax-object - expression-25025 - wrap-25026 - module-25027))))) - (if (vector? x-24982) - (let ((n-25042 (vector-length x-24982))) - (let ((v-25043 - (let ((e-25051 (make-vector n-25042))) + expression-29190 + wrap-29191 + module-29192))))) + (if (vector? x-29147) + (let ((n-29207 (vector-length x-29147))) + (let ((v-29208 + (let ((e-29274 (make-vector n-29207))) (begin - (if (if (pair? e-25051) x-24982 #f) - (set-source-properties! e-25051 x-24982)) - e-25051)))) + (if (if (pair? e-29274) x-29147 #f) + (set-source-properties! e-29274 x-29147)) + e-29274)))) (letrec* - ((loop-25044 - (lambda (i-25096) - (if (= i-25096 n-25042) - v-25043 + ((loop-29209 + (lambda (i-29270) + (if (= i-29270 n-29207) + v-29208 (begin (vector-set! - v-25043 - i-25096 - (rebuild-macro-output-24949 - (vector-ref x-24982 i-25096) - m-24983)) - (loop-25044 (#{1+}# i-25096))))))) - (loop-25044 0)))) - (if (symbol? x-24982) + v-29208 + i-29270 + (rebuild-macro-output-29038 + (vector-ref x-29147 i-29270) + m-29148)) + (loop-29209 (#{1+}# i-29270))))))) + (loop-29209 0)))) + (if (symbol? x-29147) (syntax-violation #f "encountered raw symbol in macro output" - (let ((s-25102 (cdr w-24945))) - (wrap-6578 - (begin - (if (if (pair? e-24943) s-25102 #f) - (set-source-properties! e-24943 s-25102)) - e-24943) - w-24945 - mod-24948)) - x-24982) + (let ((s-29285 (cdr w-29034))) + (let ((x-29289 + (begin + (if (if (pair? e-29032) s-29285 #f) + (set-source-properties! + e-29032 + s-29285)) + e-29032))) + (if (if (null? (car w-29034)) + (null? (cdr w-29034)) + #f) + x-29289 + (if (if (vector? x-29289) + (if (= (vector-length x-29289) 4) + (eq? (vector-ref x-29289 0) + 'syntax-object) + #f) + #f) + (let ((expression-29321 + (vector-ref x-29289 1)) + (wrap-29322 + (let ((w2-29330 + (vector-ref x-29289 2))) + (let ((m1-29331 (car w-29034)) + (s1-29332 (cdr w-29034))) + (if (null? m1-29331) + (if (null? s1-29332) + w2-29330 + (cons (car w2-29330) + (let ((m2-29347 + (cdr w2-29330))) + (if (null? m2-29347) + s1-29332 + (append + s1-29332 + m2-29347))))) + (cons (let ((m2-29355 + (car w2-29330))) + (if (null? m2-29355) + m1-29331 + (append + m1-29331 + m2-29355))) + (let ((m2-29363 + (cdr w2-29330))) + (if (null? m2-29363) + s1-29332 + (append + s1-29332 + m2-29363)))))))) + (module-29323 (vector-ref x-29289 3))) + (vector + 'syntax-object + expression-29321 + wrap-29322 + module-29323)) + (if (null? x-29289) + x-29289 + (vector + 'syntax-object + x-29289 + w-29034 + mod-29037)))))) + x-29147) (begin - (if (if (pair? x-24982) s-24946 #f) - (set-source-properties! x-24982 s-24946)) - x-24982)))))))) + (if (if (pair? x-29147) s-29035 #f) + (set-source-properties! x-29147 s-29035)) + x-29147)))))))) (with-fluids - ((transformer-environment-6571 - (lambda (k-24950) - (k-24950 - e-24943 - r-24944 - w-24945 - s-24946 - rib-24947 - mod-24948)))) - (rebuild-macro-output-24949 - (p-24942 - (let ((w-24957 - (cons (cons #f (car w-24945)) - (cons 'shift (cdr w-24945))))) - (wrap-6578 - (begin - (if (if (pair? e-24943) s-24946 #f) - (set-source-properties! e-24943 s-24946)) - e-24943) - w-24957 - mod-24948))) + ((transformer-environment-4572 + (lambda (k-29039) + (k-29039 + e-29032 + r-29033 + w-29034 + s-29035 + rib-29036 + mod-29037)))) + (rebuild-macro-output-29038 + (p-29031 + (let ((w-29046 + (cons (cons #f (car w-29034)) + (cons 'shift (cdr w-29034))))) + (let ((x-29051 + (begin + (if (if (pair? e-29032) s-29035 #f) + (set-source-properties! e-29032 s-29035)) + e-29032))) + (if (if (null? (car w-29046)) + (null? (cdr w-29046)) + #f) + x-29051 + (if (if (vector? x-29051) + (if (= (vector-length x-29051) 4) + (eq? (vector-ref x-29051 0) 'syntax-object) + #f) + #f) + (let ((expression-29090 (vector-ref x-29051 1)) + (wrap-29091 + (let ((w2-29099 (vector-ref x-29051 2))) + (let ((m1-29100 (car w-29046)) + (s1-29101 (cdr w-29046))) + (if (null? m1-29100) + (if (null? s1-29101) + w2-29099 + (cons (car w2-29099) + (let ((m2-29116 (cdr w2-29099))) + (if (null? m2-29116) + s1-29101 + (append + s1-29101 + m2-29116))))) + (cons (let ((m2-29124 (car w2-29099))) + (if (null? m2-29124) + m1-29100 + (append m1-29100 m2-29124))) + (let ((m2-29132 (cdr w2-29099))) + (if (null? m2-29132) + s1-29101 + (append + s1-29101 + m2-29132)))))))) + (module-29092 (vector-ref x-29051 3))) + (vector + 'syntax-object + expression-29090 + wrap-29091 + module-29092)) + (if (null? x-29051) + x-29051 + (vector + 'syntax-object + x-29051 + w-29046 + mod-29037))))))) (gensym - (string-append "m-" (session-id-6510) "-"))))))) - (expand-body-6589 - (lambda (body-25134 - outer-form-25135 - r-25136 - w-25137 - mod-25138) - (let ((r-25139 - (cons '("placeholder" placeholder) r-25136))) - (let ((ribcage-25140 (vector 'ribcage '() '() '()))) - (let ((w-25141 - (cons (car w-25137) - (cons ribcage-25140 (cdr w-25137))))) + (string-append "m-" (session-id-4511) "-"))))))) + (expand-body-4590 + (lambda (body-29393 + outer-form-29394 + r-29395 + w-29396 + mod-29397) + (let ((r-29398 + (cons '("placeholder" placeholder) r-29395))) + (let ((ribcage-29399 (vector 'ribcage '() '() '()))) + (let ((w-29400 + (cons (car w-29396) + (cons ribcage-29399 (cdr w-29396))))) (letrec* - ((parse-25142 - (lambda (body-25155 - ids-25156 - labels-25157 - var-ids-25158 - vars-25159 - vals-25160 - bindings-25161) - (if (null? body-25155) + ((parse-29401 + (lambda (body-29509 + ids-29510 + labels-29511 + var-ids-29512 + vars-29513 + vals-29514 + bindings-29515) + (if (null? body-29509) (syntax-violation #f "no expressions in body" - outer-form-25135) - (let ((e-25162 (cdr (car body-25155))) - (er-25163 (car (car body-25155)))) + outer-form-29394) + (let ((e-29516 (cdr (car body-29509))) + (er-29517 (car (car body-29509)))) (call-with-values (lambda () - (syntax-type-6584 - e-25162 - er-25163 + (syntax-type-4585 + e-29516 + er-29517 '(()) - (source-annotation-6542 er-25163) - ribcage-25140 - mod-25138 + (source-annotation-4544 er-29517) + ribcage-29399 + mod-29397 #f)) - (lambda (type-25320 - value-25321 - form-25322 - e-25323 - w-25324 - s-25325 - mod-25326) - (if (eqv? type-25320 'define-form) - (let ((id-25330 - (wrap-6578 - value-25321 - w-25324 - mod-25326)) - (label-25331 + (lambda (type-29705 + value-29706 + form-29707 + e-29708 + w-29709 + s-29710 + mod-29711) + (if (eqv? type-29705 'define-form) + (let ((id-29715 + (if (if (null? (car w-29709)) + (null? (cdr w-29709)) + #f) + value-29706 + (if (if (vector? value-29706) + (if (= (vector-length + value-29706) + 4) + (eq? (vector-ref + value-29706 + 0) + 'syntax-object) + #f) + #f) + (let ((expression-29760 + (vector-ref value-29706 1)) + (wrap-29761 + (let ((w2-29771 + (vector-ref + value-29706 + 2))) + (let ((m1-29772 + (car w-29709)) + (s1-29773 + (cdr w-29709))) + (if (null? m1-29772) + (if (null? s1-29773) + w2-29771 + (cons (car w2-29771) + (let ((m2-29790 + (cdr w2-29771))) + (if (null? m2-29790) + s1-29773 + (append + s1-29773 + m2-29790))))) + (cons (let ((m2-29798 + (car w2-29771))) + (if (null? m2-29798) + m1-29772 + (append + m1-29772 + m2-29798))) + (let ((m2-29806 + (cdr w2-29771))) + (if (null? m2-29806) + s1-29773 + (append + s1-29773 + m2-29806)))))))) + (module-29762 + (vector-ref + value-29706 + 3))) + (vector + 'syntax-object + expression-29760 + wrap-29761 + module-29762)) + (if (null? value-29706) + value-29706 + (vector + 'syntax-object + value-29706 + w-29709 + mod-29711))))) + (label-29716 (string-append "l-" - (session-id-6510) + (session-id-4511) (symbol->string (gensym "-"))))) - (let ((var-25332 - (let ((id-25392 - (if (if (vector? id-25330) + (let ((var-29717 + (let ((id-29867 + (if (if (vector? id-29715) (if (= (vector-length - id-25330) + id-29715) 4) (eq? (vector-ref - id-25330 + id-29715 0) 'syntax-object) #f) #f) - (vector-ref id-25330 1) - id-25330))) + (vector-ref id-29715 1) + id-29715))) (gensym (string-append - (symbol->string id-25392) + (symbol->string id-29867) "-"))))) (begin - (let ((update-25382 - (cons (vector-ref id-25330 1) - (vector-ref - ribcage-25140 - 1)))) - (vector-set! - ribcage-25140 - 1 - update-25382)) - (let ((update-25384 - (cons (car (vector-ref - id-25330 - 2)) - (vector-ref - ribcage-25140 - 2)))) - (vector-set! - ribcage-25140 - 2 - update-25384)) - (let ((update-25386 - (cons label-25331 - (vector-ref - ribcage-25140 - 3)))) - (vector-set! - ribcage-25140 - 3 - update-25386)) - (parse-25142 - (cdr body-25155) - (cons id-25330 ids-25156) - (cons label-25331 labels-25157) - (cons id-25330 var-ids-25158) - (cons var-25332 vars-25159) - (cons (cons er-25163 - (wrap-6578 - e-25323 - w-25324 - mod-25326)) - vals-25160) - (cons (cons 'lexical var-25332) - bindings-25161))))) - (if (if (eqv? type-25320 'define-syntax-form) + (begin + (let ((update-29726 + (cons (vector-ref id-29715 1) + (vector-ref + ribcage-29399 + 1)))) + (vector-set! + ribcage-29399 + 1 + update-29726)) + (let ((update-29838 + (cons (car (vector-ref + id-29715 + 2)) + (vector-ref + ribcage-29399 + 2)))) + (vector-set! + ribcage-29399 + 2 + update-29838)) + (let ((update-29853 + (cons label-29716 + (vector-ref + ribcage-29399 + 3)))) + (vector-set! + ribcage-29399 + 3 + update-29853))) + (parse-29401 + (cdr body-29509) + (cons id-29715 ids-29510) + (cons label-29716 labels-29511) + (cons id-29715 var-ids-29512) + (cons var-29717 vars-29513) + (cons (cons er-29517 + (if (if (null? (car w-29709)) + (null? (cdr w-29709)) + #f) + e-29708 + (if (if (vector? e-29708) + (if (= (vector-length + e-29708) + 4) + (eq? (vector-ref + e-29708 + 0) + 'syntax-object) + #f) + #f) + (let ((expression-29919 + (vector-ref + e-29708 + 1)) + (wrap-29920 + (let ((w2-29930 + (vector-ref + e-29708 + 2))) + (let ((m1-29931 + (car w-29709)) + (s1-29932 + (cdr w-29709))) + (if (null? m1-29931) + (if (null? s1-29932) + w2-29930 + (cons (car w2-29930) + (let ((m2-29949 + (cdr w2-29930))) + (if (null? m2-29949) + s1-29932 + (append + s1-29932 + m2-29949))))) + (cons (let ((m2-29957 + (car w2-29930))) + (if (null? m2-29957) + m1-29931 + (append + m1-29931 + m2-29957))) + (let ((m2-29965 + (cdr w2-29930))) + (if (null? m2-29965) + s1-29932 + (append + s1-29932 + m2-29965)))))))) + (module-29921 + (vector-ref + e-29708 + 3))) + (vector + 'syntax-object + expression-29919 + wrap-29920 + module-29921)) + (if (null? e-29708) + e-29708 + (vector + 'syntax-object + e-29708 + w-29709 + mod-29711))))) + vals-29514) + (cons (cons 'lexical var-29717) + bindings-29515))))) + (if (if (eqv? type-29705 'define-syntax-form) #t - (eqv? type-25320 + (eqv? type-29705 'define-syntax-parameter-form)) - (let ((id-25425 - (wrap-6578 - value-25321 - w-25324 - mod-25326)) - (label-25426 + (let ((id-29996 + (if (if (null? (car w-29709)) + (null? (cdr w-29709)) + #f) + value-29706 + (if (if (vector? value-29706) + (if (= (vector-length + value-29706) + 4) + (eq? (vector-ref + value-29706 + 0) + 'syntax-object) + #f) + #f) + (let ((expression-30040 + (vector-ref + value-29706 + 1)) + (wrap-30041 + (let ((w2-30051 + (vector-ref + value-29706 + 2))) + (let ((m1-30052 + (car w-29709)) + (s1-30053 + (cdr w-29709))) + (if (null? m1-30052) + (if (null? s1-30053) + w2-30051 + (cons (car w2-30051) + (let ((m2-30070 + (cdr w2-30051))) + (if (null? m2-30070) + s1-30053 + (append + s1-30053 + m2-30070))))) + (cons (let ((m2-30078 + (car w2-30051))) + (if (null? m2-30078) + m1-30052 + (append + m1-30052 + m2-30078))) + (let ((m2-30086 + (cdr w2-30051))) + (if (null? m2-30086) + s1-30053 + (append + s1-30053 + m2-30086)))))))) + (module-30042 + (vector-ref + value-29706 + 3))) + (vector + 'syntax-object + expression-30040 + wrap-30041 + module-30042)) + (if (null? value-29706) + value-29706 + (vector + 'syntax-object + value-29706 + w-29709 + mod-29711))))) + (label-29997 (string-append "l-" - (session-id-6510) + (session-id-4511) (symbol->string (gensym "-"))))) (begin - (let ((update-25476 - (cons (vector-ref id-25425 1) - (vector-ref - ribcage-25140 - 1)))) - (vector-set! - ribcage-25140 - 1 - update-25476)) - (let ((update-25478 - (cons (car (vector-ref - id-25425 - 2)) - (vector-ref - ribcage-25140 - 2)))) - (vector-set! - ribcage-25140 - 2 - update-25478)) - (let ((update-25480 - (cons label-25426 - (vector-ref - ribcage-25140 - 3)))) - (vector-set! - ribcage-25140 - 3 - update-25480)) - (parse-25142 - (cdr body-25155) - (cons id-25425 ids-25156) - (cons label-25426 labels-25157) - var-ids-25158 - vars-25159 - vals-25160 - (cons (cons 'macro - (cons er-25163 - (wrap-6578 - e-25323 - w-25324 - mod-25326))) - bindings-25161)))) - (if (eqv? type-25320 'begin-form) - (let ((tmp-25488 + (begin + (let ((update-30006 + (cons (vector-ref id-29996 1) + (vector-ref + ribcage-29399 + 1)))) + (vector-set! + ribcage-29399 + 1 + update-30006)) + (let ((update-30118 + (cons (car (vector-ref + id-29996 + 2)) + (vector-ref + ribcage-29399 + 2)))) + (vector-set! + ribcage-29399 + 2 + update-30118)) + (let ((update-30133 + (cons label-29997 + (vector-ref + ribcage-29399 + 3)))) + (vector-set! + ribcage-29399 + 3 + update-30133))) + (parse-29401 + (cdr body-29509) + (cons id-29996 ids-29510) + (cons label-29997 labels-29511) + var-ids-29512 + vars-29513 + vals-29514 + (cons (cons (if (eq? type-29705 + 'define-syntax-parameter-form) + 'syntax-parameter + 'macro) + (cons er-29517 + (if (if (null? (car w-29709)) + (null? (cdr w-29709)) + #f) + e-29708 + (if (if (vector? + e-29708) + (if (= (vector-length + e-29708) + 4) + (eq? (vector-ref + e-29708 + 0) + 'syntax-object) + #f) + #f) + (let ((expression-30172 + (vector-ref + e-29708 + 1)) + (wrap-30173 + (let ((w2-30183 + (vector-ref + e-29708 + 2))) + (let ((m1-30184 + (car w-29709)) + (s1-30185 + (cdr w-29709))) + (if (null? m1-30184) + (if (null? s1-30185) + w2-30183 + (cons (car w2-30183) + (let ((m2-30202 + (cdr w2-30183))) + (if (null? m2-30202) + s1-30185 + (append + s1-30185 + m2-30202))))) + (cons (let ((m2-30210 + (car w2-30183))) + (if (null? m2-30210) + m1-30184 + (append + m1-30184 + m2-30210))) + (let ((m2-30218 + (cdr w2-30183))) + (if (null? m2-30218) + s1-30185 + (append + s1-30185 + m2-30218)))))))) + (module-30174 + (vector-ref + e-29708 + 3))) + (vector + 'syntax-object + expression-30172 + wrap-30173 + module-30174)) + (if (null? e-29708) + e-29708 + (vector + 'syntax-object + e-29708 + w-29709 + mod-29711)))))) + bindings-29515)))) + (if (eqv? type-29705 'begin-form) + (let ((tmp-30245 ($sc-dispatch - e-25323 + e-29708 '(_ . each-any)))) - (if tmp-25488 + (if tmp-30245 (@apply - (lambda (e1-25492) - (parse-25142 + (lambda (e1-30249) + (parse-29401 (letrec* - ((f-25493 - (lambda (forms-25556) - (if (null? forms-25556) - (cdr body-25155) - (cons (cons er-25163 - (wrap-6578 - (car forms-25556) - w-25324 - mod-25326)) - (f-25493 - (cdr forms-25556))))))) - (f-25493 e1-25492)) - ids-25156 - labels-25157 - var-ids-25158 - vars-25159 - vals-25160 - bindings-25161)) - tmp-25488) + ((f-30250 + (lambda (forms-30451) + (if (null? forms-30451) + (cdr body-29509) + (cons (cons er-29517 + (let ((x-30455 + (car forms-30451))) + (if (if (null? (car w-29709)) + (null? (cdr w-29709)) + #f) + x-30455 + (if (if (vector? + x-30455) + (if (= (vector-length + x-30455) + 4) + (eq? (vector-ref + x-30455 + 0) + 'syntax-object) + #f) + #f) + (let ((expression-30473 + (vector-ref + x-30455 + 1)) + (wrap-30474 + (let ((w2-30482 + (vector-ref + x-30455 + 2))) + (let ((m1-30483 + (car w-29709)) + (s1-30484 + (cdr w-29709))) + (if (null? m1-30483) + (if (null? s1-30484) + w2-30482 + (cons (car w2-30482) + (let ((m2-30499 + (cdr w2-30482))) + (if (null? m2-30499) + s1-30484 + (append + s1-30484 + m2-30499))))) + (cons (let ((m2-30507 + (car w2-30482))) + (if (null? m2-30507) + m1-30483 + (append + m1-30483 + m2-30507))) + (let ((m2-30515 + (cdr w2-30482))) + (if (null? m2-30515) + s1-30484 + (append + s1-30484 + m2-30515)))))))) + (module-30475 + (vector-ref + x-30455 + 3))) + (vector + 'syntax-object + expression-30473 + wrap-30474 + module-30475)) + (if (null? x-30455) + x-30455 + (vector + 'syntax-object + x-30455 + w-29709 + mod-29711)))))) + (f-30250 + (cdr forms-30451))))))) + (f-30250 e1-30249)) + ids-29510 + labels-29511 + var-ids-29512 + vars-29513 + vals-29514 + bindings-29515)) + tmp-30245) (syntax-violation #f "source expression failed to match any pattern" - e-25323))) - (if (eqv? type-25320 'local-syntax-form) - (expand-local-syntax-6590 - value-25321 - e-25323 - er-25163 - w-25324 - s-25325 - mod-25326 - (lambda (forms-25570 - er-25571 - w-25572 - s-25573 - mod-25574) - (parse-25142 + e-29708))) + (if (eqv? type-29705 'local-syntax-form) + (expand-local-syntax-4591 + value-29706 + e-29708 + er-29517 + w-29709 + s-29710 + mod-29711 + (lambda (forms-30541 + er-30542 + w-30543 + s-30544 + mod-30545) + (parse-29401 (letrec* - ((f-25575 - (lambda (forms-25638) - (if (null? forms-25638) - (cdr body-25155) - (cons (cons er-25571 - (wrap-6578 - (car forms-25638) - w-25572 - mod-25574)) - (f-25575 - (cdr forms-25638))))))) - (f-25575 forms-25570)) - ids-25156 - labels-25157 - var-ids-25158 - vars-25159 - vals-25160 - bindings-25161))) - (if (null? ids-25156) - (build-sequence-6530 + ((f-30546 + (lambda (forms-30747) + (if (null? forms-30747) + (cdr body-29509) + (cons (cons er-30542 + (let ((x-30751 + (car forms-30747))) + (if (if (null? (car w-30543)) + (null? (cdr w-30543)) + #f) + x-30751 + (if (if (vector? + x-30751) + (if (= (vector-length + x-30751) + 4) + (eq? (vector-ref + x-30751 + 0) + 'syntax-object) + #f) + #f) + (let ((expression-30769 + (vector-ref + x-30751 + 1)) + (wrap-30770 + (let ((w2-30778 + (vector-ref + x-30751 + 2))) + (let ((m1-30779 + (car w-30543)) + (s1-30780 + (cdr w-30543))) + (if (null? m1-30779) + (if (null? s1-30780) + w2-30778 + (cons (car w2-30778) + (let ((m2-30795 + (cdr w2-30778))) + (if (null? m2-30795) + s1-30780 + (append + s1-30780 + m2-30795))))) + (cons (let ((m2-30803 + (car w2-30778))) + (if (null? m2-30803) + m1-30779 + (append + m1-30779 + m2-30803))) + (let ((m2-30811 + (cdr w2-30778))) + (if (null? m2-30811) + s1-30780 + (append + s1-30780 + m2-30811)))))))) + (module-30771 + (vector-ref + x-30751 + 3))) + (vector + 'syntax-object + expression-30769 + wrap-30770 + module-30771)) + (if (null? x-30751) + x-30751 + (vector + 'syntax-object + x-30751 + w-30543 + mod-30545)))))) + (f-30546 + (cdr forms-30747))))))) + (f-30546 forms-30541)) + ids-29510 + labels-29511 + var-ids-29512 + vars-29513 + vals-29514 + bindings-29515))) + (if (null? ids-29510) + (build-sequence-4532 #f - (map (lambda (x-25703) - (let ((e-25707 (cdr x-25703)) - (r-25708 (car x-25703))) - (call-with-values - (lambda () - (syntax-type-6584 - e-25707 - r-25708 - '(()) - (source-annotation-6542 - e-25707) - #f - mod-25326 - #f)) - (lambda (type-25712 - value-25713 - form-25714 - e-25715 - w-25716 - s-25717 - mod-25718) - (expand-expr-6586 - type-25712 - value-25713 - form-25714 - e-25715 - r-25708 - w-25716 - s-25717 - mod-25718))))) - (cons (cons er-25163 - (wrap-6578 - (begin - (if (if (pair? e-25323) - s-25325 + (map (lambda (x-30896) + (expand-4586 + (cdr x-30896) + (car x-30896) + '(()) + mod-29711)) + (cons (cons er-29517 + (let ((x-30971 + (begin + (if (if (pair? e-29708) + s-29710 + #f) + (set-source-properties! + e-29708 + s-29710)) + e-29708))) + (if (if (null? (car w-29709)) + (null? (cdr w-29709)) + #f) + x-30971 + (if (if (vector? + x-30971) + (if (= (vector-length + x-30971) + 4) + (eq? (vector-ref + x-30971 + 0) + 'syntax-object) + #f) #f) - (set-source-properties! - e-25323 - s-25325)) - e-25323) - w-25324 - mod-25326)) - (cdr body-25155)))) + (let ((expression-31003 + (vector-ref + x-30971 + 1)) + (wrap-31004 + (let ((w2-31012 + (vector-ref + x-30971 + 2))) + (let ((m1-31013 + (car w-29709)) + (s1-31014 + (cdr w-29709))) + (if (null? m1-31013) + (if (null? s1-31014) + w2-31012 + (cons (car w2-31012) + (let ((m2-31029 + (cdr w2-31012))) + (if (null? m2-31029) + s1-31014 + (append + s1-31014 + m2-31029))))) + (cons (let ((m2-31037 + (car w2-31012))) + (if (null? m2-31037) + m1-31013 + (append + m1-31013 + m2-31037))) + (let ((m2-31045 + (cdr w2-31012))) + (if (null? m2-31045) + s1-31014 + (append + s1-31014 + m2-31045)))))))) + (module-31005 + (vector-ref + x-30971 + 3))) + (vector + 'syntax-object + expression-31003 + wrap-31004 + module-31005)) + (if (null? x-30971) + x-30971 + (vector + 'syntax-object + x-30971 + w-29709 + mod-29711)))))) + (cdr body-29509)))) (begin - (if (not (valid-bound-ids?-6575 - ids-25156)) + (if (not (valid-bound-ids?-4576 + ids-29510)) (syntax-violation #f "invalid or duplicate identifier in definition" - outer-form-25135)) + outer-form-29394)) (letrec* - ((loop-25819 - (lambda (bs-25822 - er-cache-25823 - r-cache-25824) - (if (not (null? bs-25822)) - (let ((b-25825 - (car bs-25822))) - (if (eq? (car b-25825) - 'macro) - (let ((er-25827 - (car (cdr b-25825)))) - (let ((r-cache-25828 - (if (eq? er-25827 - er-cache-25823) - r-cache-25824 - (macros-only-env-6545 - er-25827)))) + ((loop-31144 + (lambda (bs-31147 + er-cache-31148 + r-cache-31149) + (if (not (null? bs-31147)) + (let ((b-31150 + (car bs-31147))) + (if (let ((t-31153 + (car b-31150))) + (if (eq? t-31153 + 'macro) + #t + (eq? t-31153 + 'syntax-parameter))) + (let ((er-31155 + (car (cdr b-31150)))) + (let ((r-cache-31156 + (if (eq? er-31155 + er-cache-31148) + r-cache-31149 + (macros-only-env-4547 + er-31155)))) (begin (set-cdr! - b-25825 - (eval-local-transformer-6591 - (expand-6585 - (cdr (cdr b-25825)) - r-cache-25828 + b-31150 + (eval-local-transformer-4592 + (expand-4586 + (cdr (cdr b-31150)) + r-cache-31156 '(()) - mod-25326) - mod-25326)) - (loop-25819 - (cdr bs-25822) - er-25827 - r-cache-25828)))) - (loop-25819 - (cdr bs-25822) - er-cache-25823 - r-cache-25824))))))) - (loop-25819 bindings-25161 #f #f)) + mod-29711) + mod-29711)) + (if (eq? (car b-31150) + 'syntax-parameter) + (set-cdr! + b-31150 + (list (cdr b-31150)))) + (loop-31144 + (cdr bs-31147) + er-31155 + r-cache-31156)))) + (loop-31144 + (cdr bs-31147) + er-cache-31148 + r-cache-31149))))))) + (loop-31144 bindings-29515 #f #f)) (set-cdr! - r-25139 - (extend-env-6543 - labels-25157 - bindings-25161 - (cdr r-25139))) - (build-letrec-6533 + r-29398 + (extend-env-4545 + labels-29511 + bindings-29515 + (cdr r-29398))) + (build-letrec-4535 #f #t (reverse (map syntax->datum - var-ids-25158)) - (reverse vars-25159) - (map (lambda (x-26171) - (let ((e-26175 - (cdr x-26171)) - (r-26176 - (car x-26171))) - (call-with-values - (lambda () - (syntax-type-6584 - e-26175 - r-26176 - '(()) - (source-annotation-6542 - e-26175) - #f - mod-25326 - #f)) - (lambda (type-26180 - value-26181 - form-26182 - e-26183 - w-26184 - s-26185 - mod-26186) - (expand-expr-6586 - type-26180 - value-26181 - form-26182 - e-26183 - r-26176 - w-26184 - s-26185 - mod-26186))))) - (reverse vals-25160)) - (let ((exps-26192 - (map (lambda (x-26193) - (let ((e-26196 - (cdr x-26193)) - (r-26197 - (car x-26193))) - (call-with-values - (lambda () - (syntax-type-6584 - e-26196 - r-26197 - '(()) - (source-annotation-6542 - e-26196) - #f - mod-25326 - #f)) - (lambda (type-26201 - value-26202 - form-26203 - e-26204 - w-26205 - s-26206 - mod-26207) - (expand-expr-6586 - type-26201 - value-26202 - form-26203 - e-26204 - r-26197 - w-26205 - s-26206 - mod-26207))))) - (cons (cons er-25163 - (wrap-6578 + var-ids-29512)) + (reverse vars-29513) + (map (lambda (x-31576) + (expand-4586 + (cdr x-31576) + (car x-31576) + '(()) + mod-29711)) + (reverse vals-29514)) + (build-sequence-4532 + #f + (map (lambda (x-31712) + (expand-4586 + (cdr x-31712) + (car x-31712) + '(()) + mod-29711)) + (cons (cons er-29517 + (let ((x-31787 (begin - (if (if (pair? e-25323) - s-25325 + (if (if (pair? e-29708) + s-29710 #f) (set-source-properties! - e-25323 - s-25325)) - e-25323) - w-25324 - mod-25326)) - (cdr body-25155))))) - (if (null? (cdr exps-26192)) - (car exps-26192) - (make-struct/no-tail - (vector-ref - %expanded-vtables - 12) - #f - exps-26192))))))))))))))))) - (parse-25142 - (map (lambda (x-25145) - (cons r-25139 - (wrap-6578 x-25145 w-25141 mod-25138))) - body-25134) + e-29708 + s-29710)) + e-29708))) + (if (if (null? (car w-29709)) + (null? (cdr w-29709)) + #f) + x-31787 + (if (if (vector? + x-31787) + (if (= (vector-length + x-31787) + 4) + (eq? (vector-ref + x-31787 + 0) + 'syntax-object) + #f) + #f) + (let ((expression-31819 + (vector-ref + x-31787 + 1)) + (wrap-31820 + (let ((w2-31828 + (vector-ref + x-31787 + 2))) + (let ((m1-31829 + (car w-29709)) + (s1-31830 + (cdr w-29709))) + (if (null? m1-31829) + (if (null? s1-31830) + w2-31828 + (cons (car w2-31828) + (let ((m2-31845 + (cdr w2-31828))) + (if (null? m2-31845) + s1-31830 + (append + s1-31830 + m2-31845))))) + (cons (let ((m2-31853 + (car w2-31828))) + (if (null? m2-31853) + m1-31829 + (append + m1-31829 + m2-31853))) + (let ((m2-31861 + (cdr w2-31828))) + (if (null? m2-31861) + s1-31830 + (append + s1-31830 + m2-31861)))))))) + (module-31821 + (vector-ref + x-31787 + 3))) + (vector + 'syntax-object + expression-31819 + wrap-31820 + module-31821)) + (if (null? x-31787) + x-31787 + (vector + 'syntax-object + x-31787 + w-29709 + mod-29711)))))) + (cdr body-29509)))))))))))))))))) + (parse-29401 + (map (lambda (x-29404) + (cons r-29398 + (if (if (null? (car w-29400)) + (null? (cdr w-29400)) + #f) + x-29404 + (if (if (vector? x-29404) + (if (= (vector-length x-29404) 4) + (eq? (vector-ref x-29404 0) + 'syntax-object) + #f) + #f) + (let ((expression-29440 + (vector-ref x-29404 1)) + (wrap-29441 + (let ((w2-29451 + (vector-ref x-29404 2))) + (let ((m1-29452 (car w-29400)) + (s1-29453 (cdr w-29400))) + (if (null? m1-29452) + (if (null? s1-29453) + w2-29451 + (cons (car w2-29451) + (let ((m2-29470 + (cdr w2-29451))) + (if (null? m2-29470) + s1-29453 + (append + s1-29453 + m2-29470))))) + (cons (let ((m2-29478 + (car w2-29451))) + (if (null? m2-29478) + m1-29452 + (append + m1-29452 + m2-29478))) + (let ((m2-29486 + (cdr w2-29451))) + (if (null? m2-29486) + s1-29453 + (append + s1-29453 + m2-29486)))))))) + (module-29442 + (vector-ref x-29404 3))) + (vector + 'syntax-object + expression-29440 + wrap-29441 + module-29442)) + (if (null? x-29404) + x-29404 + (vector + 'syntax-object + x-29404 + w-29400 + mod-29397)))))) + body-29393) '() '() '() '() '() '()))))))) - (expand-local-syntax-6590 - (lambda (rec?-26233 - e-26234 - r-26235 - w-26236 - s-26237 - mod-26238 - k-26239) - (let ((tmp-26241 + (expand-local-syntax-4591 + (lambda (rec?-31876 + e-31877 + r-31878 + w-31879 + s-31880 + mod-31881 + k-31882) + (let ((tmp-31884 ($sc-dispatch - e-26234 + e-31877 '(_ #(each (any any)) any . each-any)))) - (if tmp-26241 + (if tmp-31884 (@apply - (lambda (id-26245 val-26246 e1-26247 e2-26248) - (if (not (valid-bound-ids?-6575 id-26245)) + (lambda (id-31888 val-31889 e1-31890 e2-31891) + (if (not (valid-bound-ids?-4576 id-31888)) (syntax-violation #f "duplicate bound keyword" - e-26234) - (let ((labels-26338 (gen-labels-6552 id-26245))) - (let ((new-w-26339 - (make-binding-wrap-6563 - id-26245 - labels-26338 - w-26236))) - (k-26239 - (cons e1-26247 e2-26248) - (extend-env-6543 - labels-26338 - (let ((trans-r-26375 - (macros-only-env-6545 r-26235))) + e-31877) + (let ((labels-31988 (gen-labels-4553 id-31888))) + (let ((new-w-31989 + (make-binding-wrap-4564 + id-31888 + labels-31988 + w-31879))) + (k-31882 + (cons e1-31890 e2-31891) + (extend-env-4545 + labels-31988 + (let ((trans-r-32027 + (macros-only-env-4547 r-31878))) (begin - (if rec?-26233 new-w-26339 w-26236) - (map (lambda (x-26376) + (if rec?-31876 new-w-31989 w-31879) + (map (lambda (x-32028) (cons 'macro - (eval-local-transformer-6591 - (expand-6585 - x-26376 - trans-r-26375 + (eval-local-transformer-4592 + (expand-4586 + x-32028 + trans-r-32027 (values - (if rec?-26233 - new-w-26339 - w-26236)) - mod-26238) - mod-26238))) - val-26246))) - r-26235) - new-w-26339 - s-26237 - mod-26238))))) - tmp-26241) + (if rec?-31876 + new-w-31989 + w-31879)) + mod-31881) + mod-31881))) + val-31889))) + r-31878) + new-w-31989 + s-31880 + mod-31881))))) + tmp-31884) (syntax-violation #f "bad local syntax definition" - (wrap-6578 - (begin - (if (if (pair? e-26234) s-26237 #f) - (set-source-properties! e-26234 s-26237)) - e-26234) - w-26236 - mod-26238)))))) - (eval-local-transformer-6591 - (lambda (expanded-26656 mod-26657) - (let ((p-26658 (primitive-eval expanded-26656))) - (if (procedure? p-26658) - p-26658 + (let ((x-32335 + (begin + (if (if (pair? e-31877) s-31880 #f) + (set-source-properties! e-31877 s-31880)) + e-31877))) + (if (if (null? (car w-31879)) + (null? (cdr w-31879)) + #f) + x-32335 + (if (if (vector? x-32335) + (if (= (vector-length x-32335) 4) + (eq? (vector-ref x-32335 0) 'syntax-object) + #f) + #f) + (let ((expression-32367 (vector-ref x-32335 1)) + (wrap-32368 + (let ((w2-32376 (vector-ref x-32335 2))) + (let ((m1-32377 (car w-31879)) + (s1-32378 (cdr w-31879))) + (if (null? m1-32377) + (if (null? s1-32378) + w2-32376 + (cons (car w2-32376) + (let ((m2-32393 (cdr w2-32376))) + (if (null? m2-32393) + s1-32378 + (append s1-32378 m2-32393))))) + (cons (let ((m2-32401 (car w2-32376))) + (if (null? m2-32401) + m1-32377 + (append m1-32377 m2-32401))) + (let ((m2-32409 (cdr w2-32376))) + (if (null? m2-32409) + s1-32378 + (append s1-32378 m2-32409)))))))) + (module-32369 (vector-ref x-32335 3))) + (vector + 'syntax-object + expression-32367 + wrap-32368 + module-32369)) + (if (null? x-32335) + x-32335 + (vector + 'syntax-object + x-32335 + w-31879 + mod-31881)))))))))) + (eval-local-transformer-4592 + (lambda (expanded-32427 mod-32428) + (let ((p-32429 (primitive-eval expanded-32427))) + (if (procedure? p-32429) + p-32429 (syntax-violation #f "nonprocedure transformer" - p-26658))))) - (ellipsis?-6593 - (lambda (x-7254) - (if (if (if (vector? x-7254) - (if (= (vector-length x-7254) 4) - (eq? (vector-ref x-7254 0) 'syntax-object) + p-32429))))) + (ellipsis?-4594 + (lambda (x-6134) + (if (if (if (vector? x-6134) + (if (= (vector-length x-6134) 4) + (eq? (vector-ref x-6134 0) 'syntax-object) #f) #f) - (symbol? (vector-ref x-7254 1)) + (symbol? (vector-ref x-6134 1)) #f) - (if (eq? (if (if (vector? x-7254) - (if (= (vector-length x-7254) 4) - (eq? (vector-ref x-7254 0) 'syntax-object) - #f) - #f) - (vector-ref x-7254 1) - x-7254) - (if (if (= (vector-length - '#(syntax-object - ... - ((top) - #(ribcage () () ()) - #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-4404")) - #(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=? - with-transformer-environment - transformer-environment - resolve-identifier - locally-bound-identifiers - 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 - session-id - 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) - (top) - (top) - (top) - (top)) - ("l-*-2527" - "l-*-2525" - "l-*-2523" - "l-*-2521" - "l-*-2519" - "l-*-2517" - "l-*-2515" - "l-*-2513" - "l-*-2511" - "l-*-2509" - "l-*-2507" - "l-*-2505" - "l-*-2503" - "l-*-2501" - "l-*-2499" - "l-*-2497" - "l-*-2495" - "l-*-2493" - "l-*-2491" - "l-*-2489" - "l-*-2487" - "l-*-2485" - "l-*-2483" - "l-*-2481" - "l-*-2479" - "l-*-2477" - "l-*-2475" - "l-*-2473" - "l-*-2471" - "l-*-2469" - "l-*-2467" - "l-*-2465" - "l-*-2463" - "l-*-2461" - "l-*-2459" - "l-*-2457" - "l-*-2455" - "l-*-2453" - "l-*-2451" - "l-*-2450" - "l-*-2448" - "l-*-2445" - "l-*-2444" - "l-*-2443" - "l-*-2441" - "l-*-2440" - "l-*-2438" - "l-*-2436" - "l-*-2434" - "l-*-2432" - "l-*-2430" - "l-*-2428" - "l-*-2426" - "l-*-2424" - "l-*-2421" - "l-*-2419" - "l-*-2418" - "l-*-2416" - "l-*-2414" - "l-*-2412" - "l-*-2410" - "l-*-2409" - "l-*-2408" - "l-*-2407" - "l-*-2405" - "l-*-2404" - "l-*-2401" - "l-*-2399" - "l-*-2397" - "l-*-2395" - "l-*-2393" - "l-*-2391" - "l-*-2389" - "l-*-2388" - "l-*-2387" - "l-*-2385" - "l-*-2383" - "l-*-2382" - "l-*-2379" - "l-*-2378" - "l-*-2376" - "l-*-2374" - "l-*-2372" - "l-*-2370" - "l-*-2368" - "l-*-2366" - "l-*-2364" - "l-*-2362" - "l-*-2360" - "l-*-2357" - "l-*-2355" - "l-*-2353" - "l-*-2351" - "l-*-2349" - "l-*-2347" - "l-*-2345" - "l-*-2343" - "l-*-2341" - "l-*-2339" - "l-*-2337" - "l-*-2335" - "l-*-2333" - "l-*-2331" - "l-*-2329" - "l-*-2327" - "l-*-2325" - "l-*-2323" - "l-*-2321" - "l-*-2319" - "l-*-2317" - "l-*-2315" - "l-*-2313" - "l-*-2311" - "l-*-2309" - "l-*-2307" - "l-*-2306" - "l-*-2305" - "l-*-2304" - "l-*-2303" - "l-*-2301" - "l-*-2299" - "l-*-2297" - "l-*-2294" - "l-*-2292" - "l-*-2290" - "l-*-2288" - "l-*-2286" - "l-*-2284" - "l-*-2282" - "l-*-2280" - "l-*-2278" - "l-*-2276" - "l-*-2274" - "l-*-2272" - "l-*-2270" - "l-*-2268" - "l-*-2266" - "l-*-2264" - "l-*-2262" - "l-*-2260")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("l-*-2098" "l-*-2097" "l-*-2096"))) - (hygiene guile))) - 4) - #t - #f) - '... - '#(syntax-object - ... - ((top) - #(ribcage () () ()) - #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-4404")) - #(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=? - with-transformer-environment - transformer-environment - resolve-identifier - locally-bound-identifiers - 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 - session-id - 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) - (top) - (top) - (top) - (top)) - ("l-*-2527" - "l-*-2525" - "l-*-2523" - "l-*-2521" - "l-*-2519" - "l-*-2517" - "l-*-2515" - "l-*-2513" - "l-*-2511" - "l-*-2509" - "l-*-2507" - "l-*-2505" - "l-*-2503" - "l-*-2501" - "l-*-2499" - "l-*-2497" - "l-*-2495" - "l-*-2493" - "l-*-2491" - "l-*-2489" - "l-*-2487" - "l-*-2485" - "l-*-2483" - "l-*-2481" - "l-*-2479" - "l-*-2477" - "l-*-2475" - "l-*-2473" - "l-*-2471" - "l-*-2469" - "l-*-2467" - "l-*-2465" - "l-*-2463" - "l-*-2461" - "l-*-2459" - "l-*-2457" - "l-*-2455" - "l-*-2453" - "l-*-2451" - "l-*-2450" - "l-*-2448" - "l-*-2445" - "l-*-2444" - "l-*-2443" - "l-*-2441" - "l-*-2440" - "l-*-2438" - "l-*-2436" - "l-*-2434" - "l-*-2432" - "l-*-2430" - "l-*-2428" - "l-*-2426" - "l-*-2424" - "l-*-2421" - "l-*-2419" - "l-*-2418" - "l-*-2416" - "l-*-2414" - "l-*-2412" - "l-*-2410" - "l-*-2409" - "l-*-2408" - "l-*-2407" - "l-*-2405" - "l-*-2404" - "l-*-2401" - "l-*-2399" - "l-*-2397" - "l-*-2395" - "l-*-2393" - "l-*-2391" - "l-*-2389" - "l-*-2388" - "l-*-2387" - "l-*-2385" - "l-*-2383" - "l-*-2382" - "l-*-2379" - "l-*-2378" - "l-*-2376" - "l-*-2374" - "l-*-2372" - "l-*-2370" - "l-*-2368" - "l-*-2366" - "l-*-2364" - "l-*-2362" - "l-*-2360" - "l-*-2357" - "l-*-2355" - "l-*-2353" - "l-*-2351" - "l-*-2349" - "l-*-2347" - "l-*-2345" - "l-*-2343" - "l-*-2341" - "l-*-2339" - "l-*-2337" - "l-*-2335" - "l-*-2333" - "l-*-2331" - "l-*-2329" - "l-*-2327" - "l-*-2325" - "l-*-2323" - "l-*-2321" - "l-*-2319" - "l-*-2317" - "l-*-2315" - "l-*-2313" - "l-*-2311" - "l-*-2309" - "l-*-2307" - "l-*-2306" - "l-*-2305" - "l-*-2304" - "l-*-2303" - "l-*-2301" - "l-*-2299" - "l-*-2297" - "l-*-2294" - "l-*-2292" - "l-*-2290" - "l-*-2288" - "l-*-2286" - "l-*-2284" - "l-*-2282" - "l-*-2280" - "l-*-2278" - "l-*-2276" - "l-*-2274" - "l-*-2272" - "l-*-2270" - "l-*-2268" - "l-*-2266" - "l-*-2264" - "l-*-2262" - "l-*-2260")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("l-*-2098" "l-*-2097" "l-*-2096"))) - (hygiene guile)))) - (eq? (id-var-name-6568 x-7254 '(())) - (id-var-name-6568 - '#(syntax-object - ... - ((top) - #(ribcage () () ()) - #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-4404")) - #(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=? - with-transformer-environment - transformer-environment - resolve-identifier - locally-bound-identifiers - 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 - session-id - 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) - (top) - (top) - (top) - (top)) - ("l-*-2527" - "l-*-2525" - "l-*-2523" - "l-*-2521" - "l-*-2519" - "l-*-2517" - "l-*-2515" - "l-*-2513" - "l-*-2511" - "l-*-2509" - "l-*-2507" - "l-*-2505" - "l-*-2503" - "l-*-2501" - "l-*-2499" - "l-*-2497" - "l-*-2495" - "l-*-2493" - "l-*-2491" - "l-*-2489" - "l-*-2487" - "l-*-2485" - "l-*-2483" - "l-*-2481" - "l-*-2479" - "l-*-2477" - "l-*-2475" - "l-*-2473" - "l-*-2471" - "l-*-2469" - "l-*-2467" - "l-*-2465" - "l-*-2463" - "l-*-2461" - "l-*-2459" - "l-*-2457" - "l-*-2455" - "l-*-2453" - "l-*-2451" - "l-*-2450" - "l-*-2448" - "l-*-2445" - "l-*-2444" - "l-*-2443" - "l-*-2441" - "l-*-2440" - "l-*-2438" - "l-*-2436" - "l-*-2434" - "l-*-2432" - "l-*-2430" - "l-*-2428" - "l-*-2426" - "l-*-2424" - "l-*-2421" - "l-*-2419" - "l-*-2418" - "l-*-2416" - "l-*-2414" - "l-*-2412" - "l-*-2410" - "l-*-2409" - "l-*-2408" - "l-*-2407" - "l-*-2405" - "l-*-2404" - "l-*-2401" - "l-*-2399" - "l-*-2397" - "l-*-2395" - "l-*-2393" - "l-*-2391" - "l-*-2389" - "l-*-2388" - "l-*-2387" - "l-*-2385" - "l-*-2383" - "l-*-2382" - "l-*-2379" - "l-*-2378" - "l-*-2376" - "l-*-2374" - "l-*-2372" - "l-*-2370" - "l-*-2368" - "l-*-2366" - "l-*-2364" - "l-*-2362" - "l-*-2360" - "l-*-2357" - "l-*-2355" - "l-*-2353" - "l-*-2351" - "l-*-2349" - "l-*-2347" - "l-*-2345" - "l-*-2343" - "l-*-2341" - "l-*-2339" - "l-*-2337" - "l-*-2335" - "l-*-2333" - "l-*-2331" - "l-*-2329" - "l-*-2327" - "l-*-2325" - "l-*-2323" - "l-*-2321" - "l-*-2319" - "l-*-2317" - "l-*-2315" - "l-*-2313" - "l-*-2311" - "l-*-2309" - "l-*-2307" - "l-*-2306" - "l-*-2305" - "l-*-2304" - "l-*-2303" - "l-*-2301" - "l-*-2299" - "l-*-2297" - "l-*-2294" - "l-*-2292" - "l-*-2290" - "l-*-2288" - "l-*-2286" - "l-*-2284" - "l-*-2282" - "l-*-2280" - "l-*-2278" - "l-*-2276" - "l-*-2274" - "l-*-2272" - "l-*-2270" - "l-*-2268" - "l-*-2266" - "l-*-2264" - "l-*-2262" - "l-*-2260")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("l-*-2098" "l-*-2097" "l-*-2096"))) - (hygiene guile)) - '(()))) - #f) + (free-id=?-4574 + x-6134 + '#(syntax-object + ... + ((top) + #(ribcage () () ()) + #(ribcage () () ()) + #(ribcage #(x) #((top)) #("l-*-2416")) + #(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=? + with-transformer-environment + transformer-environment + resolve-identifier + locally-bound-identifiers + 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 + session-id + 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) + (top) + (top) + (top)) + ("l-*-478" + "l-*-476" + "l-*-474" + "l-*-472" + "l-*-470" + "l-*-468" + "l-*-466" + "l-*-464" + "l-*-462" + "l-*-460" + "l-*-458" + "l-*-456" + "l-*-454" + "l-*-452" + "l-*-450" + "l-*-448" + "l-*-446" + "l-*-444" + "l-*-442" + "l-*-440" + "l-*-438" + "l-*-436" + "l-*-434" + "l-*-432" + "l-*-430" + "l-*-428" + "l-*-426" + "l-*-424" + "l-*-422" + "l-*-420" + "l-*-418" + "l-*-416" + "l-*-414" + "l-*-412" + "l-*-410" + "l-*-408" + "l-*-406" + "l-*-404" + "l-*-402" + "l-*-401" + "l-*-399" + "l-*-396" + "l-*-395" + "l-*-394" + "l-*-392" + "l-*-391" + "l-*-389" + "l-*-387" + "l-*-385" + "l-*-383" + "l-*-381" + "l-*-379" + "l-*-377" + "l-*-375" + "l-*-372" + "l-*-370" + "l-*-369" + "l-*-367" + "l-*-365" + "l-*-363" + "l-*-361" + "l-*-360" + "l-*-359" + "l-*-358" + "l-*-356" + "l-*-355" + "l-*-352" + "l-*-350" + "l-*-348" + "l-*-346" + "l-*-344" + "l-*-342" + "l-*-341" + "l-*-340" + "l-*-338" + "l-*-336" + "l-*-335" + "l-*-332" + "l-*-331" + "l-*-329" + "l-*-327" + "l-*-325" + "l-*-323" + "l-*-321" + "l-*-319" + "l-*-317" + "l-*-315" + "l-*-313" + "l-*-310" + "l-*-308" + "l-*-306" + "l-*-304" + "l-*-302" + "l-*-300" + "l-*-298" + "l-*-296" + "l-*-294" + "l-*-292" + "l-*-290" + "l-*-288" + "l-*-286" + "l-*-284" + "l-*-282" + "l-*-280" + "l-*-278" + "l-*-276" + "l-*-274" + "l-*-272" + "l-*-270" + "l-*-268" + "l-*-266" + "l-*-264" + "l-*-262" + "l-*-260" + "l-*-258" + "l-*-257" + "l-*-256" + "l-*-255" + "l-*-254" + "l-*-252" + "l-*-250" + "l-*-248" + "l-*-245" + "l-*-243" + "l-*-241" + "l-*-239" + "l-*-237" + "l-*-235" + "l-*-233" + "l-*-231" + "l-*-229" + "l-*-227" + "l-*-225" + "l-*-223" + "l-*-221" + "l-*-219" + "l-*-217" + "l-*-215" + "l-*-213" + "l-*-211" + "l-*-209")) + #(ribcage + (define-structure + define-expansion-accessors + define-expansion-constructors) + ((top) (top) (top)) + ("l-*-47" "l-*-46" "l-*-45")) + #(ribcage () () ())) + (hygiene guile))) #f))) - (lambda-formals-6594 - (lambda (orig-args-26663) + (lambda-formals-4595 + (lambda (orig-args-32434) (letrec* - ((req-26664 - (lambda (args-26668 rreq-26669) - (let ((tmp-26671 ($sc-dispatch args-26668 '()))) - (if tmp-26671 + ((req-32435 + (lambda (args-32439 rreq-32440) + (let ((tmp-32442 ($sc-dispatch args-32439 '()))) + (if tmp-32442 (@apply - (lambda () (check-26665 (reverse rreq-26669) #f)) - tmp-26671) - (let ((tmp-26794 - ($sc-dispatch args-26668 '(any . any)))) - (if (if tmp-26794 + (lambda () (check-32436 (reverse rreq-32440) #f)) + tmp-32442) + (let ((tmp-32558 + ($sc-dispatch args-32439 '(any . any)))) + (if (if tmp-32558 (@apply - (lambda (a-26798 b-26799) - (if (symbol? a-26798) + (lambda (a-32562 b-32563) + (if (symbol? a-32562) #t - (if (if (vector? a-26798) - (if (= (vector-length a-26798) 4) - (eq? (vector-ref a-26798 0) + (if (if (vector? a-32562) + (if (= (vector-length a-32562) 4) + (eq? (vector-ref a-32562 0) 'syntax-object) #f) #f) - (symbol? (vector-ref a-26798 1)) + (symbol? (vector-ref a-32562 1)) #f))) - tmp-26794) + tmp-32558) #f) (@apply - (lambda (a-26826 b-26827) - (req-26664 b-26827 (cons a-26826 rreq-26669))) - tmp-26794) - (let ((tmp-26828 (list args-26668))) + (lambda (a-32590 b-32591) + (req-32435 b-32591 (cons a-32590 rreq-32440))) + tmp-32558) + (let ((tmp-32592 (list args-32439))) (if (@apply - (lambda (r-26830) - (if (symbol? r-26830) + (lambda (r-32594) + (if (symbol? r-32594) #t - (if (if (vector? r-26830) - (if (= (vector-length r-26830) 4) - (eq? (vector-ref r-26830 0) + (if (if (vector? r-32594) + (if (= (vector-length r-32594) 4) + (eq? (vector-ref r-32594 0) 'syntax-object) #f) #f) - (symbol? (vector-ref r-26830 1)) + (symbol? (vector-ref r-32594 1)) #f))) - tmp-26828) + tmp-32592) (@apply - (lambda (r-26860) - (check-26665 (reverse rreq-26669) r-26860)) - tmp-26828) + (lambda (r-32624) + (check-32436 (reverse rreq-32440) r-32624)) + tmp-32592) (syntax-violation 'lambda "invalid argument list" - orig-args-26663 - args-26668))))))))) - (check-26665 - (lambda (req-26991 rest-26992) - (if (distinct-bound-ids?-6576 - (if rest-26992 - (cons rest-26992 req-26991) - req-26991)) - (values req-26991 #f rest-26992 #f) + orig-args-32434 + args-32439))))))))) + (check-32436 + (lambda (req-32748 rest-32749) + (if (distinct-bound-ids?-4577 + (if rest-32749 + (cons rest-32749 req-32748) + req-32748)) + (values req-32748 #f rest-32749 #f) (syntax-violation 'lambda "duplicate identifier in argument list" - orig-args-26663))))) - (req-26664 orig-args-26663 '())))) - (expand-simple-lambda-6595 - (lambda (e-27108 - r-27109 - w-27110 - s-27111 - mod-27112 - req-27113 - rest-27114 - meta-27115 - body-27116) - (let ((ids-27117 - (if rest-27114 - (append req-27113 (list rest-27114)) - req-27113))) - (let ((vars-27118 (map gen-var-6599 ids-27117))) - (let ((labels-27119 (gen-labels-6552 ids-27117))) - (build-simple-lambda-6525 - s-27111 - (map syntax->datum req-27113) - (if rest-27114 (syntax->datum rest-27114) #f) - vars-27118 - meta-27115 - (expand-body-6589 - body-27116 - (wrap-6578 - (begin - (if (if (pair? e-27108) s-27111 #f) - (set-source-properties! e-27108 s-27111)) - e-27108) - w-27110 - mod-27112) - (extend-var-env-6544 - labels-27119 - vars-27118 - r-27109) - (make-binding-wrap-6563 - ids-27117 - labels-27119 - w-27110) - mod-27112))))))) - (lambda*-formals-6596 - (lambda (orig-args-27399) + orig-args-32434))))) + (req-32435 orig-args-32434 '())))) + (expand-simple-lambda-4596 + (lambda (e-32858 + r-32859 + w-32860 + s-32861 + mod-32862 + req-32863 + rest-32864 + meta-32865 + body-32866) + (let ((ids-32867 + (if rest-32864 + (append req-32863 (list rest-32864)) + req-32863))) + (let ((vars-32868 (map gen-var-4600 ids-32867))) + (let ((labels-32869 (gen-labels-4553 ids-32867))) + (build-simple-lambda-4526 + s-32861 + (map syntax->datum req-32863) + (if rest-32864 (syntax->datum rest-32864) #f) + vars-32868 + meta-32865 + (expand-body-4590 + body-32866 + (let ((x-33052 + (begin + (if (if (pair? e-32858) s-32861 #f) + (set-source-properties! e-32858 s-32861)) + e-32858))) + (if (if (null? (car w-32860)) + (null? (cdr w-32860)) + #f) + x-33052 + (if (if (vector? x-33052) + (if (= (vector-length x-33052) 4) + (eq? (vector-ref x-33052 0) 'syntax-object) + #f) + #f) + (let ((expression-33084 (vector-ref x-33052 1)) + (wrap-33085 + (let ((w2-33093 (vector-ref x-33052 2))) + (let ((m1-33094 (car w-32860)) + (s1-33095 (cdr w-32860))) + (if (null? m1-33094) + (if (null? s1-33095) + w2-33093 + (cons (car w2-33093) + (let ((m2-33110 (cdr w2-33093))) + (if (null? m2-33110) + s1-33095 + (append + s1-33095 + m2-33110))))) + (cons (let ((m2-33118 (car w2-33093))) + (if (null? m2-33118) + m1-33094 + (append m1-33094 m2-33118))) + (let ((m2-33126 (cdr w2-33093))) + (if (null? m2-33126) + s1-33095 + (append + s1-33095 + m2-33126)))))))) + (module-33086 (vector-ref x-33052 3))) + (vector + 'syntax-object + expression-33084 + wrap-33085 + module-33086)) + (if (null? x-33052) + x-33052 + (vector + 'syntax-object + x-33052 + w-32860 + mod-32862))))) + (extend-var-env-4546 + labels-32869 + vars-32868 + r-32859) + (make-binding-wrap-4564 + ids-32867 + labels-32869 + w-32860) + mod-32862))))))) + (lambda*-formals-4597 + (lambda (orig-args-33335) (letrec* - ((req-27400 - (lambda (args-27407 rreq-27408) - (let ((tmp-27410 ($sc-dispatch args-27407 '()))) - (if tmp-27410 + ((req-33336 + (lambda (args-33343 rreq-33344) + (let ((tmp-33346 ($sc-dispatch args-33343 '()))) + (if tmp-33346 (@apply (lambda () - (check-27404 (reverse rreq-27408) '() #f '())) - tmp-27410) - (let ((tmp-27416 - ($sc-dispatch args-27407 '(any . any)))) - (if (if tmp-27416 + (check-33340 (reverse rreq-33344) '() #f '())) + tmp-33346) + (let ((tmp-33465 + ($sc-dispatch args-33343 '(any . any)))) + (if (if tmp-33465 (@apply - (lambda (a-27420 b-27421) - (if (symbol? a-27420) + (lambda (a-33469 b-33470) + (if (symbol? a-33469) #t - (if (if (vector? a-27420) - (if (= (vector-length a-27420) 4) - (eq? (vector-ref a-27420 0) + (if (if (vector? a-33469) + (if (= (vector-length a-33469) 4) + (eq? (vector-ref a-33469 0) 'syntax-object) #f) #f) - (symbol? (vector-ref a-27420 1)) + (symbol? (vector-ref a-33469 1)) #f))) - tmp-27416) + tmp-33465) #f) (@apply - (lambda (a-27448 b-27449) - (req-27400 b-27449 (cons a-27448 rreq-27408))) - tmp-27416) - (let ((tmp-27450 - ($sc-dispatch args-27407 '(any . any)))) - (if (if tmp-27450 + (lambda (a-33497 b-33498) + (req-33336 b-33498 (cons a-33497 rreq-33344))) + tmp-33465) + (let ((tmp-33499 + ($sc-dispatch args-33343 '(any . any)))) + (if (if tmp-33499 (@apply - (lambda (a-27454 b-27455) - (eq? (syntax->datum a-27454) #:optional)) - tmp-27450) + (lambda (a-33503 b-33504) + (eq? (syntax->datum a-33503) #:optional)) + tmp-33499) #f) (@apply - (lambda (a-27456 b-27457) - (opt-27401 b-27457 (reverse rreq-27408) '())) - tmp-27450) - (let ((tmp-27460 - ($sc-dispatch args-27407 '(any . any)))) - (if (if tmp-27460 + (lambda (a-33505 b-33506) + (opt-33337 b-33506 (reverse rreq-33344) '())) + tmp-33499) + (let ((tmp-33509 + ($sc-dispatch args-33343 '(any . any)))) + (if (if tmp-33509 (@apply - (lambda (a-27464 b-27465) - (eq? (syntax->datum a-27464) #:key)) - tmp-27460) + (lambda (a-33513 b-33514) + (eq? (syntax->datum a-33513) #:key)) + tmp-33509) #f) (@apply - (lambda (a-27466 b-27467) - (key-27402 - b-27467 - (reverse rreq-27408) + (lambda (a-33515 b-33516) + (key-33338 + b-33516 + (reverse rreq-33344) '() '())) - tmp-27460) - (let ((tmp-27470 - ($sc-dispatch args-27407 '(any any)))) - (if (if tmp-27470 + tmp-33509) + (let ((tmp-33519 + ($sc-dispatch args-33343 '(any any)))) + (if (if tmp-33519 (@apply - (lambda (a-27474 b-27475) - (eq? (syntax->datum a-27474) + (lambda (a-33523 b-33524) + (eq? (syntax->datum a-33523) #:rest)) - tmp-27470) + tmp-33519) #f) (@apply - (lambda (a-27476 b-27477) - (rest-27403 - b-27477 - (reverse rreq-27408) + (lambda (a-33525 b-33526) + (rest-33339 + b-33526 + (reverse rreq-33344) '() '())) - tmp-27470) - (let ((tmp-27480 (list args-27407))) + tmp-33519) + (let ((tmp-33529 (list args-33343))) (if (@apply - (lambda (r-27482) - (if (symbol? r-27482) + (lambda (r-33531) + (if (symbol? r-33531) #t - (if (if (vector? r-27482) + (if (if (vector? r-33531) (if (= (vector-length - r-27482) + r-33531) 4) (eq? (vector-ref - r-27482 + r-33531 0) 'syntax-object) #f) #f) (symbol? - (vector-ref r-27482 1)) + (vector-ref r-33531 1)) #f))) - tmp-27480) + tmp-33529) (@apply - (lambda (r-27512) - (rest-27403 - r-27512 - (reverse rreq-27408) + (lambda (r-33561) + (rest-33339 + r-33561 + (reverse rreq-33344) '() '())) - tmp-27480) + tmp-33529) (syntax-violation 'lambda* "invalid argument list" - orig-args-27399 - args-27407))))))))))))))) - (opt-27401 - (lambda (args-27531 req-27532 ropt-27533) - (let ((tmp-27535 ($sc-dispatch args-27531 '()))) - (if tmp-27535 + orig-args-33335 + args-33343))))))))))))))) + (opt-33337 + (lambda (args-33580 req-33581 ropt-33582) + (let ((tmp-33584 ($sc-dispatch args-33580 '()))) + (if tmp-33584 (@apply (lambda () - (check-27404 - req-27532 - (reverse ropt-27533) + (check-33340 + req-33581 + (reverse ropt-33582) #f '())) - tmp-27535) - (let ((tmp-27541 - ($sc-dispatch args-27531 '(any . any)))) - (if (if tmp-27541 + tmp-33584) + (let ((tmp-33705 + ($sc-dispatch args-33580 '(any . any)))) + (if (if tmp-33705 (@apply - (lambda (a-27545 b-27546) - (if (symbol? a-27545) + (lambda (a-33709 b-33710) + (if (symbol? a-33709) #t - (if (if (vector? a-27545) - (if (= (vector-length a-27545) 4) - (eq? (vector-ref a-27545 0) + (if (if (vector? a-33709) + (if (= (vector-length a-33709) 4) + (eq? (vector-ref a-33709 0) 'syntax-object) #f) #f) - (symbol? (vector-ref a-27545 1)) + (symbol? (vector-ref a-33709 1)) #f))) - tmp-27541) + tmp-33705) #f) (@apply - (lambda (a-27573 b-27574) - (opt-27401 - b-27574 - req-27532 - (cons (cons a-27573 + (lambda (a-33737 b-33738) + (opt-33337 + b-33738 + req-33581 + (cons (cons a-33737 '(#(syntax-object #f ((top) #(ribcage #(a b) #((top) (top)) - #("l-*-4543" "l-*-4544")) + #("l-*-2555" "l-*-2556")) #(ribcage () () ()) #(ribcage #(args req ropt) #((top) (top) (top)) - #("l-*-4533" - "l-*-4534" - "l-*-4535")) + #("l-*-2545" + "l-*-2546" + "l-*-2547")) #(ribcage (check rest key opt req) ((top) @@ -6400,15 +7320,15 @@ (top) (top) (top)) - ("l-*-4479" - "l-*-4477" - "l-*-4475" - "l-*-4473" - "l-*-4471")) + ("l-*-2491" + "l-*-2489" + "l-*-2487" + "l-*-2485" + "l-*-2483")) #(ribcage #(orig-args) #((top)) - #("l-*-4470")) + #("l-*-2482")) #(ribcage (lambda-var-list gen-var @@ -6423,7 +7343,7 @@ expand-local-syntax expand-body expand-macro - expand-application + expand-call expand-expr expand syntax-type @@ -6479,7 +7399,6 @@ id? nonsymbol-id? global-extend - lookup macros-only-env extend-var-env extend-env @@ -6505,6 +7424,7 @@ build-sequence build-data build-primref + build-primcall build-lambda-case build-case-lambda build-simple-lambda @@ -6516,7 +7436,7 @@ build-lexical-reference build-dynlet build-conditional - build-application + build-call build-void maybe-name-value! decorate-source @@ -6537,8 +7457,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 @@ -6689,286 +7610,287 @@ (top) (top) (top) + (top) (top)) - ("l-*-2527" - "l-*-2525" - "l-*-2523" - "l-*-2521" - "l-*-2519" - "l-*-2517" - "l-*-2515" - "l-*-2513" - "l-*-2511" - "l-*-2509" - "l-*-2507" - "l-*-2505" - "l-*-2503" - "l-*-2501" - "l-*-2499" - "l-*-2497" - "l-*-2495" - "l-*-2493" - "l-*-2491" - "l-*-2489" - "l-*-2487" - "l-*-2485" - "l-*-2483" - "l-*-2481" - "l-*-2479" - "l-*-2477" - "l-*-2475" - "l-*-2473" - "l-*-2471" - "l-*-2469" - "l-*-2467" - "l-*-2465" - "l-*-2463" - "l-*-2461" - "l-*-2459" - "l-*-2457" - "l-*-2455" - "l-*-2453" - "l-*-2451" - "l-*-2450" - "l-*-2448" - "l-*-2445" - "l-*-2444" - "l-*-2443" - "l-*-2441" - "l-*-2440" - "l-*-2438" - "l-*-2436" - "l-*-2434" - "l-*-2432" - "l-*-2430" - "l-*-2428" - "l-*-2426" - "l-*-2424" - "l-*-2421" - "l-*-2419" - "l-*-2418" - "l-*-2416" - "l-*-2414" - "l-*-2412" - "l-*-2410" - "l-*-2409" - "l-*-2408" - "l-*-2407" - "l-*-2405" - "l-*-2404" - "l-*-2401" - "l-*-2399" - "l-*-2397" - "l-*-2395" - "l-*-2393" - "l-*-2391" - "l-*-2389" - "l-*-2388" - "l-*-2387" - "l-*-2385" - "l-*-2383" - "l-*-2382" - "l-*-2379" - "l-*-2378" - "l-*-2376" - "l-*-2374" - "l-*-2372" - "l-*-2370" - "l-*-2368" - "l-*-2366" - "l-*-2364" - "l-*-2362" - "l-*-2360" - "l-*-2357" - "l-*-2355" - "l-*-2353" - "l-*-2351" - "l-*-2349" - "l-*-2347" - "l-*-2345" - "l-*-2343" - "l-*-2341" - "l-*-2339" - "l-*-2337" - "l-*-2335" - "l-*-2333" - "l-*-2331" - "l-*-2329" - "l-*-2327" - "l-*-2325" - "l-*-2323" - "l-*-2321" - "l-*-2319" - "l-*-2317" - "l-*-2315" - "l-*-2313" - "l-*-2311" - "l-*-2309" - "l-*-2307" - "l-*-2306" - "l-*-2305" - "l-*-2304" - "l-*-2303" - "l-*-2301" - "l-*-2299" - "l-*-2297" - "l-*-2294" - "l-*-2292" - "l-*-2290" - "l-*-2288" - "l-*-2286" - "l-*-2284" - "l-*-2282" - "l-*-2280" - "l-*-2278" - "l-*-2276" - "l-*-2274" - "l-*-2272" - "l-*-2270" - "l-*-2268" - "l-*-2266" - "l-*-2264" - "l-*-2262" - "l-*-2260")) + ("l-*-478" + "l-*-476" + "l-*-474" + "l-*-472" + "l-*-470" + "l-*-468" + "l-*-466" + "l-*-464" + "l-*-462" + "l-*-460" + "l-*-458" + "l-*-456" + "l-*-454" + "l-*-452" + "l-*-450" + "l-*-448" + "l-*-446" + "l-*-444" + "l-*-442" + "l-*-440" + "l-*-438" + "l-*-436" + "l-*-434" + "l-*-432" + "l-*-430" + "l-*-428" + "l-*-426" + "l-*-424" + "l-*-422" + "l-*-420" + "l-*-418" + "l-*-416" + "l-*-414" + "l-*-412" + "l-*-410" + "l-*-408" + "l-*-406" + "l-*-404" + "l-*-402" + "l-*-401" + "l-*-399" + "l-*-396" + "l-*-395" + "l-*-394" + "l-*-392" + "l-*-391" + "l-*-389" + "l-*-387" + "l-*-385" + "l-*-383" + "l-*-381" + "l-*-379" + "l-*-377" + "l-*-375" + "l-*-372" + "l-*-370" + "l-*-369" + "l-*-367" + "l-*-365" + "l-*-363" + "l-*-361" + "l-*-360" + "l-*-359" + "l-*-358" + "l-*-356" + "l-*-355" + "l-*-352" + "l-*-350" + "l-*-348" + "l-*-346" + "l-*-344" + "l-*-342" + "l-*-341" + "l-*-340" + "l-*-338" + "l-*-336" + "l-*-335" + "l-*-332" + "l-*-331" + "l-*-329" + "l-*-327" + "l-*-325" + "l-*-323" + "l-*-321" + "l-*-319" + "l-*-317" + "l-*-315" + "l-*-313" + "l-*-310" + "l-*-308" + "l-*-306" + "l-*-304" + "l-*-302" + "l-*-300" + "l-*-298" + "l-*-296" + "l-*-294" + "l-*-292" + "l-*-290" + "l-*-288" + "l-*-286" + "l-*-284" + "l-*-282" + "l-*-280" + "l-*-278" + "l-*-276" + "l-*-274" + "l-*-272" + "l-*-270" + "l-*-268" + "l-*-266" + "l-*-264" + "l-*-262" + "l-*-260" + "l-*-258" + "l-*-257" + "l-*-256" + "l-*-255" + "l-*-254" + "l-*-252" + "l-*-250" + "l-*-248" + "l-*-245" + "l-*-243" + "l-*-241" + "l-*-239" + "l-*-237" + "l-*-235" + "l-*-233" + "l-*-231" + "l-*-229" + "l-*-227" + "l-*-225" + "l-*-223" + "l-*-221" + "l-*-219" + "l-*-217" + "l-*-215" + "l-*-213" + "l-*-211" + "l-*-209")) #(ribcage (define-structure define-expansion-accessors define-expansion-constructors) ((top) (top) (top)) - ("l-*-2098" - "l-*-2097" - "l-*-2096"))) + ("l-*-47" "l-*-46" "l-*-45")) + #(ribcage () () ())) (hygiene guile)))) - ropt-27533))) - tmp-27541) - (let ((tmp-27575 - ($sc-dispatch args-27531 '((any any) . any)))) - (if (if tmp-27575 + ropt-33582))) + tmp-33705) + (let ((tmp-33739 + ($sc-dispatch args-33580 '((any any) . any)))) + (if (if tmp-33739 (@apply - (lambda (a-27579 init-27580 b-27581) - (if (symbol? a-27579) + (lambda (a-33743 init-33744 b-33745) + (if (symbol? a-33743) #t - (if (if (vector? a-27579) - (if (= (vector-length a-27579) 4) - (eq? (vector-ref a-27579 0) + (if (if (vector? a-33743) + (if (= (vector-length a-33743) 4) + (eq? (vector-ref a-33743 0) 'syntax-object) #f) #f) - (symbol? (vector-ref a-27579 1)) + (symbol? (vector-ref a-33743 1)) #f))) - tmp-27575) + tmp-33739) #f) (@apply - (lambda (a-27608 init-27609 b-27610) - (opt-27401 - b-27610 - req-27532 - (cons (list a-27608 init-27609) ropt-27533))) - tmp-27575) - (let ((tmp-27611 - ($sc-dispatch args-27531 '(any . any)))) - (if (if tmp-27611 + (lambda (a-33772 init-33773 b-33774) + (opt-33337 + b-33774 + req-33581 + (cons (list a-33772 init-33773) ropt-33582))) + tmp-33739) + (let ((tmp-33775 + ($sc-dispatch args-33580 '(any . any)))) + (if (if tmp-33775 (@apply - (lambda (a-27615 b-27616) - (eq? (syntax->datum a-27615) #:key)) - tmp-27611) + (lambda (a-33779 b-33780) + (eq? (syntax->datum a-33779) #:key)) + tmp-33775) #f) (@apply - (lambda (a-27617 b-27618) - (key-27402 - b-27618 - req-27532 - (reverse ropt-27533) + (lambda (a-33781 b-33782) + (key-33338 + b-33782 + req-33581 + (reverse ropt-33582) '())) - tmp-27611) - (let ((tmp-27621 - ($sc-dispatch args-27531 '(any any)))) - (if (if tmp-27621 + tmp-33775) + (let ((tmp-33785 + ($sc-dispatch args-33580 '(any any)))) + (if (if tmp-33785 (@apply - (lambda (a-27625 b-27626) - (eq? (syntax->datum a-27625) + (lambda (a-33789 b-33790) + (eq? (syntax->datum a-33789) #:rest)) - tmp-27621) + tmp-33785) #f) (@apply - (lambda (a-27627 b-27628) - (rest-27403 - b-27628 - req-27532 - (reverse ropt-27533) + (lambda (a-33791 b-33792) + (rest-33339 + b-33792 + req-33581 + (reverse ropt-33582) '())) - tmp-27621) - (let ((tmp-27631 (list args-27531))) + tmp-33785) + (let ((tmp-33795 (list args-33580))) (if (@apply - (lambda (r-27633) - (if (symbol? r-27633) + (lambda (r-33797) + (if (symbol? r-33797) #t - (if (if (vector? r-27633) + (if (if (vector? r-33797) (if (= (vector-length - r-27633) + r-33797) 4) (eq? (vector-ref - r-27633 + r-33797 0) 'syntax-object) #f) #f) (symbol? - (vector-ref r-27633 1)) + (vector-ref r-33797 1)) #f))) - tmp-27631) + tmp-33795) (@apply - (lambda (r-27663) - (rest-27403 - r-27663 - req-27532 - (reverse ropt-27533) + (lambda (r-33827) + (rest-33339 + r-33827 + req-33581 + (reverse ropt-33582) '())) - tmp-27631) + tmp-33795) (syntax-violation 'lambda* "invalid optional argument list" - orig-args-27399 - args-27531))))))))))))))) - (key-27402 - (lambda (args-27682 req-27683 opt-27684 rkey-27685) - (let ((tmp-27687 ($sc-dispatch args-27682 '()))) - (if tmp-27687 + orig-args-33335 + args-33580))))))))))))))) + (key-33338 + (lambda (args-33846 req-33847 opt-33848 rkey-33849) + (let ((tmp-33851 ($sc-dispatch args-33846 '()))) + (if tmp-33851 (@apply (lambda () - (check-27404 - req-27683 - opt-27684 + (check-33340 + req-33847 + opt-33848 #f - (cons #f (reverse rkey-27685)))) - tmp-27687) - (let ((tmp-27693 - ($sc-dispatch args-27682 '(any . any)))) - (if (if tmp-27693 + (cons #f (reverse rkey-33849)))) + tmp-33851) + (let ((tmp-33973 + ($sc-dispatch args-33846 '(any . any)))) + (if (if tmp-33973 (@apply - (lambda (a-27697 b-27698) - (if (symbol? a-27697) + (lambda (a-33977 b-33978) + (if (symbol? a-33977) #t - (if (if (vector? a-27697) - (if (= (vector-length a-27697) 4) - (eq? (vector-ref a-27697 0) + (if (if (vector? a-33977) + (if (= (vector-length a-33977) 4) + (eq? (vector-ref a-33977 0) 'syntax-object) #f) #f) - (symbol? (vector-ref a-27697 1)) + (symbol? (vector-ref a-33977 1)) #f))) - tmp-27693) + tmp-33973) #f) (@apply - (lambda (a-27725 b-27726) - (let ((tmp-27727 - (symbol->keyword (syntax->datum a-27725)))) - (key-27402 - b-27726 - req-27683 - opt-27684 - (cons (cons tmp-27727 - (cons a-27725 + (lambda (a-34005 b-34006) + (let ((tmp-34007 + (symbol->keyword (syntax->datum a-34005)))) + (key-33338 + b-34006 + req-33847 + opt-33848 + (cons (cons tmp-34007 + (cons a-34005 '(#(syntax-object #f ((top) @@ -6976,12 +7898,12 @@ #(ribcage #(k) #((top)) - #("l-*-4606")) + #("l-*-2618")) #(ribcage #(a b) #((top) (top)) - #("l-*-4600" - "l-*-4601")) + #("l-*-2612" + "l-*-2613")) #(ribcage () () ()) #(ribcage #(args req opt rkey) @@ -6989,10 +7911,10 @@ (top) (top) (top)) - #("l-*-4589" - "l-*-4590" - "l-*-4591" - "l-*-4592")) + #("l-*-2601" + "l-*-2602" + "l-*-2603" + "l-*-2604")) #(ribcage (check rest key @@ -7003,15 +7925,15 @@ (top) (top) (top)) - ("l-*-4479" - "l-*-4477" - "l-*-4475" - "l-*-4473" - "l-*-4471")) + ("l-*-2491" + "l-*-2489" + "l-*-2487" + "l-*-2485" + "l-*-2483")) #(ribcage #(orig-args) #((top)) - #("l-*-4470")) + #("l-*-2482")) #(ribcage (lambda-var-list gen-var @@ -7026,7 +7948,7 @@ expand-local-syntax expand-body expand-macro - expand-application + expand-call expand-expr expand syntax-type @@ -7082,7 +8004,6 @@ id? nonsymbol-id? global-extend - lookup macros-only-env extend-var-env extend-env @@ -7108,6 +8029,7 @@ build-sequence build-data build-primref + build-primcall build-lambda-case build-case-lambda build-simple-lambda @@ -7119,7 +8041,7 @@ build-lexical-reference build-dynlet build-conditional - build-application + build-call build-void maybe-name-value! decorate-source @@ -7140,8 +8062,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 @@ -7292,876 +8215,1100 @@ (top) (top) (top) + (top) (top)) - ("l-*-2527" - "l-*-2525" - "l-*-2523" - "l-*-2521" - "l-*-2519" - "l-*-2517" - "l-*-2515" - "l-*-2513" - "l-*-2511" - "l-*-2509" - "l-*-2507" - "l-*-2505" - "l-*-2503" - "l-*-2501" - "l-*-2499" - "l-*-2497" - "l-*-2495" - "l-*-2493" - "l-*-2491" - "l-*-2489" - "l-*-2487" - "l-*-2485" - "l-*-2483" - "l-*-2481" - "l-*-2479" - "l-*-2477" - "l-*-2475" - "l-*-2473" - "l-*-2471" - "l-*-2469" - "l-*-2467" - "l-*-2465" - "l-*-2463" - "l-*-2461" - "l-*-2459" - "l-*-2457" - "l-*-2455" - "l-*-2453" - "l-*-2451" - "l-*-2450" - "l-*-2448" - "l-*-2445" - "l-*-2444" - "l-*-2443" - "l-*-2441" - "l-*-2440" - "l-*-2438" - "l-*-2436" - "l-*-2434" - "l-*-2432" - "l-*-2430" - "l-*-2428" - "l-*-2426" - "l-*-2424" - "l-*-2421" - "l-*-2419" - "l-*-2418" - "l-*-2416" - "l-*-2414" - "l-*-2412" - "l-*-2410" - "l-*-2409" - "l-*-2408" - "l-*-2407" - "l-*-2405" - "l-*-2404" - "l-*-2401" - "l-*-2399" - "l-*-2397" - "l-*-2395" - "l-*-2393" - "l-*-2391" - "l-*-2389" - "l-*-2388" - "l-*-2387" - "l-*-2385" - "l-*-2383" - "l-*-2382" - "l-*-2379" - "l-*-2378" - "l-*-2376" - "l-*-2374" - "l-*-2372" - "l-*-2370" - "l-*-2368" - "l-*-2366" - "l-*-2364" - "l-*-2362" - "l-*-2360" - "l-*-2357" - "l-*-2355" - "l-*-2353" - "l-*-2351" - "l-*-2349" - "l-*-2347" - "l-*-2345" - "l-*-2343" - "l-*-2341" - "l-*-2339" - "l-*-2337" - "l-*-2335" - "l-*-2333" - "l-*-2331" - "l-*-2329" - "l-*-2327" - "l-*-2325" - "l-*-2323" - "l-*-2321" - "l-*-2319" - "l-*-2317" - "l-*-2315" - "l-*-2313" - "l-*-2311" - "l-*-2309" - "l-*-2307" - "l-*-2306" - "l-*-2305" - "l-*-2304" - "l-*-2303" - "l-*-2301" - "l-*-2299" - "l-*-2297" - "l-*-2294" - "l-*-2292" - "l-*-2290" - "l-*-2288" - "l-*-2286" - "l-*-2284" - "l-*-2282" - "l-*-2280" - "l-*-2278" - "l-*-2276" - "l-*-2274" - "l-*-2272" - "l-*-2270" - "l-*-2268" - "l-*-2266" - "l-*-2264" - "l-*-2262" - "l-*-2260")) + ("l-*-478" + "l-*-476" + "l-*-474" + "l-*-472" + "l-*-470" + "l-*-468" + "l-*-466" + "l-*-464" + "l-*-462" + "l-*-460" + "l-*-458" + "l-*-456" + "l-*-454" + "l-*-452" + "l-*-450" + "l-*-448" + "l-*-446" + "l-*-444" + "l-*-442" + "l-*-440" + "l-*-438" + "l-*-436" + "l-*-434" + "l-*-432" + "l-*-430" + "l-*-428" + "l-*-426" + "l-*-424" + "l-*-422" + "l-*-420" + "l-*-418" + "l-*-416" + "l-*-414" + "l-*-412" + "l-*-410" + "l-*-408" + "l-*-406" + "l-*-404" + "l-*-402" + "l-*-401" + "l-*-399" + "l-*-396" + "l-*-395" + "l-*-394" + "l-*-392" + "l-*-391" + "l-*-389" + "l-*-387" + "l-*-385" + "l-*-383" + "l-*-381" + "l-*-379" + "l-*-377" + "l-*-375" + "l-*-372" + "l-*-370" + "l-*-369" + "l-*-367" + "l-*-365" + "l-*-363" + "l-*-361" + "l-*-360" + "l-*-359" + "l-*-358" + "l-*-356" + "l-*-355" + "l-*-352" + "l-*-350" + "l-*-348" + "l-*-346" + "l-*-344" + "l-*-342" + "l-*-341" + "l-*-340" + "l-*-338" + "l-*-336" + "l-*-335" + "l-*-332" + "l-*-331" + "l-*-329" + "l-*-327" + "l-*-325" + "l-*-323" + "l-*-321" + "l-*-319" + "l-*-317" + "l-*-315" + "l-*-313" + "l-*-310" + "l-*-308" + "l-*-306" + "l-*-304" + "l-*-302" + "l-*-300" + "l-*-298" + "l-*-296" + "l-*-294" + "l-*-292" + "l-*-290" + "l-*-288" + "l-*-286" + "l-*-284" + "l-*-282" + "l-*-280" + "l-*-278" + "l-*-276" + "l-*-274" + "l-*-272" + "l-*-270" + "l-*-268" + "l-*-266" + "l-*-264" + "l-*-262" + "l-*-260" + "l-*-258" + "l-*-257" + "l-*-256" + "l-*-255" + "l-*-254" + "l-*-252" + "l-*-250" + "l-*-248" + "l-*-245" + "l-*-243" + "l-*-241" + "l-*-239" + "l-*-237" + "l-*-235" + "l-*-233" + "l-*-231" + "l-*-229" + "l-*-227" + "l-*-225" + "l-*-223" + "l-*-221" + "l-*-219" + "l-*-217" + "l-*-215" + "l-*-213" + "l-*-211" + "l-*-209")) #(ribcage (define-structure define-expansion-accessors define-expansion-constructors) ((top) (top) (top)) - ("l-*-2098" - "l-*-2097" - "l-*-2096"))) + ("l-*-47" + "l-*-46" + "l-*-45")) + #(ribcage () () ())) (hygiene guile))))) - rkey-27685)))) - tmp-27693) - (let ((tmp-27730 - ($sc-dispatch args-27682 '((any any) . any)))) - (if (if tmp-27730 + rkey-33849)))) + tmp-33973) + (let ((tmp-34010 + ($sc-dispatch args-33846 '((any any) . any)))) + (if (if tmp-34010 (@apply - (lambda (a-27734 init-27735 b-27736) - (if (symbol? a-27734) + (lambda (a-34014 init-34015 b-34016) + (if (symbol? a-34014) #t - (if (if (vector? a-27734) - (if (= (vector-length a-27734) 4) - (eq? (vector-ref a-27734 0) + (if (if (vector? a-34014) + (if (= (vector-length a-34014) 4) + (eq? (vector-ref a-34014 0) 'syntax-object) #f) #f) - (symbol? (vector-ref a-27734 1)) + (symbol? (vector-ref a-34014 1)) #f))) - tmp-27730) + tmp-34010) #f) (@apply - (lambda (a-27763 init-27764 b-27765) - (let ((tmp-27766 + (lambda (a-34043 init-34044 b-34045) + (let ((tmp-34046 (symbol->keyword - (syntax->datum a-27763)))) - (key-27402 - b-27765 - req-27683 - opt-27684 - (cons (list tmp-27766 a-27763 init-27764) - rkey-27685)))) - tmp-27730) - (let ((tmp-27769 + (syntax->datum a-34043)))) + (key-33338 + b-34045 + req-33847 + opt-33848 + (cons (list tmp-34046 a-34043 init-34044) + rkey-33849)))) + tmp-34010) + (let ((tmp-34049 ($sc-dispatch - args-27682 + args-33846 '((any any any) . any)))) - (if (if tmp-27769 + (if (if tmp-34049 (@apply - (lambda (a-27773 - init-27774 - k-27775 - b-27776) - (if (if (symbol? a-27773) + (lambda (a-34053 + init-34054 + k-34055 + b-34056) + (if (if (symbol? a-34053) #t - (if (if (vector? a-27773) + (if (if (vector? a-34053) (if (= (vector-length - a-27773) + a-34053) 4) (eq? (vector-ref - a-27773 + a-34053 0) 'syntax-object) #f) #f) (symbol? - (vector-ref a-27773 1)) + (vector-ref a-34053 1)) #f)) - (keyword? (syntax->datum k-27775)) + (keyword? (syntax->datum k-34055)) #f)) - tmp-27769) + tmp-34049) #f) (@apply - (lambda (a-27803 init-27804 k-27805 b-27806) - (key-27402 - b-27806 - req-27683 - opt-27684 - (cons (list k-27805 a-27803 init-27804) - rkey-27685))) - tmp-27769) - (let ((tmp-27807 - ($sc-dispatch args-27682 '(any)))) - (if (if tmp-27807 + (lambda (a-34083 init-34084 k-34085 b-34086) + (key-33338 + b-34086 + req-33847 + opt-33848 + (cons (list k-34085 a-34083 init-34084) + rkey-33849))) + tmp-34049) + (let ((tmp-34087 + ($sc-dispatch args-33846 '(any)))) + (if (if tmp-34087 (@apply - (lambda (aok-27811) - (eq? (syntax->datum aok-27811) + (lambda (aok-34091) + (eq? (syntax->datum aok-34091) #:allow-other-keys)) - tmp-27807) + tmp-34087) #f) (@apply - (lambda (aok-27812) - (check-27404 - req-27683 - opt-27684 + (lambda (aok-34092) + (check-33340 + req-33847 + opt-33848 #f - (cons #t (reverse rkey-27685)))) - tmp-27807) - (let ((tmp-27815 + (cons #t (reverse rkey-33849)))) + tmp-34087) + (let ((tmp-34211 ($sc-dispatch - args-27682 + args-33846 '(any any any)))) - (if (if tmp-27815 + (if (if tmp-34211 (@apply - (lambda (aok-27819 - a-27820 - b-27821) + (lambda (aok-34215 + a-34216 + b-34217) (if (eq? (syntax->datum - aok-27819) + aok-34215) #:allow-other-keys) - (eq? (syntax->datum a-27820) + (eq? (syntax->datum a-34216) #:rest) #f)) - tmp-27815) + tmp-34211) #f) (@apply - (lambda (aok-27822 a-27823 b-27824) - (rest-27403 - b-27824 - req-27683 - opt-27684 - (cons #t (reverse rkey-27685)))) - tmp-27815) - (let ((tmp-27827 + (lambda (aok-34218 a-34219 b-34220) + (rest-33339 + b-34220 + req-33847 + opt-33848 + (cons #t (reverse rkey-33849)))) + tmp-34211) + (let ((tmp-34223 ($sc-dispatch - args-27682 + args-33846 '(any . any)))) - (if (if tmp-27827 + (if (if tmp-34223 (@apply - (lambda (aok-27831 r-27832) + (lambda (aok-34227 r-34228) (if (eq? (syntax->datum - aok-27831) + aok-34227) #:allow-other-keys) - (if (symbol? r-27832) + (if (symbol? r-34228) #t (if (if (vector? - r-27832) + r-34228) (if (= (vector-length - r-27832) + r-34228) 4) (eq? (vector-ref - r-27832 + r-34228 0) 'syntax-object) #f) #f) (symbol? (vector-ref - r-27832 + r-34228 1)) #f)) #f)) - tmp-27827) + tmp-34223) #f) (@apply - (lambda (aok-27859 r-27860) - (rest-27403 - r-27860 - req-27683 - opt-27684 + (lambda (aok-34255 r-34256) + (rest-33339 + r-34256 + req-33847 + opt-33848 (cons #t - (reverse rkey-27685)))) - tmp-27827) - (let ((tmp-27863 + (reverse rkey-33849)))) + tmp-34223) + (let ((tmp-34259 ($sc-dispatch - args-27682 + args-33846 '(any any)))) - (if (if tmp-27863 + (if (if tmp-34259 (@apply - (lambda (a-27867 b-27868) + (lambda (a-34263 b-34264) (eq? (syntax->datum - a-27867) + a-34263) #:rest)) - tmp-27863) + tmp-34259) #f) (@apply - (lambda (a-27869 b-27870) - (rest-27403 - b-27870 - req-27683 - opt-27684 + (lambda (a-34265 b-34266) + (rest-33339 + b-34266 + req-33847 + opt-33848 (cons #f (reverse - rkey-27685)))) - tmp-27863) - (let ((tmp-27873 - (list args-27682))) + rkey-33849)))) + tmp-34259) + (let ((tmp-34269 + (list args-33846))) (if (@apply - (lambda (r-27875) - (if (symbol? r-27875) + (lambda (r-34271) + (if (symbol? r-34271) #t (if (if (vector? - r-27875) + r-34271) (if (= (vector-length - r-27875) + r-34271) 4) (eq? (vector-ref - r-27875 + r-34271 0) 'syntax-object) #f) #f) (symbol? (vector-ref - r-27875 + r-34271 1)) #f))) - tmp-27873) + tmp-34269) (@apply - (lambda (r-27905) - (rest-27403 - r-27905 - req-27683 - opt-27684 + (lambda (r-34301) + (rest-33339 + r-34301 + req-33847 + opt-33848 (cons #f (reverse - rkey-27685)))) - tmp-27873) + rkey-33849)))) + tmp-34269) (syntax-violation 'lambda* "invalid keyword argument list" - orig-args-27399 - args-27682))))))))))))))))))))) - (rest-27403 - (lambda (args-27933 req-27934 opt-27935 kw-27936) - (let ((tmp-27938 (list args-27933))) + orig-args-33335 + args-33846))))))))))))))))))))) + (rest-33339 + (lambda (args-34329 req-34330 opt-34331 kw-34332) + (let ((tmp-34334 (list args-34329))) (if (@apply - (lambda (r-27940) - (if (symbol? r-27940) + (lambda (r-34336) + (if (symbol? r-34336) #t - (if (if (vector? r-27940) - (if (= (vector-length r-27940) 4) - (eq? (vector-ref r-27940 0) 'syntax-object) + (if (if (vector? r-34336) + (if (= (vector-length r-34336) 4) + (eq? (vector-ref r-34336 0) 'syntax-object) #f) #f) - (symbol? (vector-ref r-27940 1)) + (symbol? (vector-ref r-34336 1)) #f))) - tmp-27938) + tmp-34334) (@apply - (lambda (r-27970) - (check-27404 - req-27934 - opt-27935 - r-27970 - kw-27936)) - tmp-27938) + (lambda (r-34366) + (check-33340 + req-34330 + opt-34331 + r-34366 + kw-34332)) + tmp-34334) (syntax-violation 'lambda* "invalid rest argument" - orig-args-27399 - args-27933))))) - (check-27404 - (lambda (req-27974 opt-27975 rest-27976 kw-27977) - (if (distinct-bound-ids?-6576 + orig-args-33335 + args-34329))))) + (check-33340 + (lambda (req-34494 opt-34495 rest-34496 kw-34497) + (if (distinct-bound-ids?-4577 (append - req-27974 - (map car opt-27975) - (if rest-27976 (list rest-27976) '()) - (if (pair? kw-27977) - (map cadr (cdr kw-27977)) + req-34494 + (map car opt-34495) + (if rest-34496 (list rest-34496) '()) + (if (pair? kw-34497) + (map cadr (cdr kw-34497)) '()))) - (values req-27974 opt-27975 rest-27976 kw-27977) + (values req-34494 opt-34495 rest-34496 kw-34497) (syntax-violation 'lambda* "duplicate identifier in argument list" - orig-args-27399))))) - (req-27400 orig-args-27399 '())))) - (expand-lambda-case-6597 - (lambda (e-28093 - r-28094 - w-28095 - s-28096 - mod-28097 - get-formals-28098 - clauses-28099) + orig-args-33335))))) + (req-33336 orig-args-33335 '())))) + (expand-lambda-case-4598 + (lambda (e-34606 + r-34607 + w-34608 + s-34609 + mod-34610 + get-formals-34611 + clauses-34612) (letrec* - ((parse-req-28100 - (lambda (req-28231 - opt-28232 - rest-28233 - kw-28234 - body-28235) - (let ((vars-28236 (map gen-var-6599 req-28231)) - (labels-28237 (gen-labels-6552 req-28231))) - (let ((r*-28238 - (extend-var-env-6544 - labels-28237 - vars-28236 - r-28094)) - (w*-28239 - (make-binding-wrap-6563 - req-28231 - labels-28237 - w-28095))) - (parse-opt-28101 - (map syntax->datum req-28231) - opt-28232 - rest-28233 - kw-28234 - body-28235 - (reverse vars-28236) - r*-28238 - w*-28239 + ((parse-req-34613 + (lambda (req-34746 + opt-34747 + rest-34748 + kw-34749 + body-34750) + (let ((vars-34751 (map gen-var-4600 req-34746)) + (labels-34752 (gen-labels-4553 req-34746))) + (let ((r*-34753 + (extend-var-env-4546 + labels-34752 + vars-34751 + r-34607)) + (w*-34754 + (make-binding-wrap-4564 + req-34746 + labels-34752 + w-34608))) + (parse-opt-34614 + (map syntax->datum req-34746) + opt-34747 + rest-34748 + kw-34749 + body-34750 + (reverse vars-34751) + r*-34753 + w*-34754 '() '()))))) - (parse-opt-28101 - (lambda (req-28425 - opt-28426 - rest-28427 - kw-28428 - body-28429 - vars-28430 - r*-28431 - w*-28432 - out-28433 - inits-28434) - (if (pair? opt-28426) - (let ((tmp-28435 (car opt-28426))) - (let ((tmp-28436 ($sc-dispatch tmp-28435 '(any any)))) - (if tmp-28436 + (parse-opt-34614 + (lambda (req-34951 + opt-34952 + rest-34953 + kw-34954 + body-34955 + vars-34956 + r*-34957 + w*-34958 + out-34959 + inits-34960) + (if (pair? opt-34952) + (let ((tmp-34961 (car opt-34952))) + (let ((tmp-34962 ($sc-dispatch tmp-34961 '(any any)))) + (if tmp-34962 (@apply - (lambda (id-28438 i-28439) - (let ((v-28440 - (let ((id-28448 - (if (if (vector? id-28438) + (lambda (id-34964 i-34965) + (let ((v-34966 + (let ((id-34974 + (if (if (vector? id-34964) (if (= (vector-length - id-28438) + id-34964) 4) (eq? (vector-ref - id-28438 + id-34964 0) 'syntax-object) #f) #f) - (vector-ref id-28438 1) - id-28438))) + (vector-ref id-34964 1) + id-34964))) (gensym (string-append - (symbol->string id-28448) + (symbol->string id-34974) "-"))))) - (let ((l-28441 (gen-labels-6552 (list v-28440)))) - (let ((r**-28442 - (extend-var-env-6544 - l-28441 - (list v-28440) - r*-28431))) - (let ((w**-28443 - (make-binding-wrap-6563 - (list id-28438) - l-28441 - w*-28432))) - (parse-opt-28101 - req-28425 - (cdr opt-28426) - rest-28427 - kw-28428 - body-28429 - (cons v-28440 vars-28430) - r**-28442 - w**-28443 - (cons (syntax->datum id-28438) out-28433) - (cons (expand-6585 - i-28439 - r*-28431 - w*-28432 - mod-28097) - inits-28434))))))) - tmp-28436) + (let ((l-34967 (gen-labels-4553 (list v-34966)))) + (let ((r**-34968 + (extend-var-env-4546 + l-34967 + (list v-34966) + r*-34957))) + (let ((w**-34969 + (make-binding-wrap-4564 + (list id-34964) + l-34967 + w*-34958))) + (parse-opt-34614 + req-34951 + (cdr opt-34952) + rest-34953 + kw-34954 + body-34955 + (cons v-34966 vars-34956) + r**-34968 + w**-34969 + (cons (syntax->datum id-34964) out-34959) + (cons (expand-4586 + i-34965 + r*-34957 + w*-34958 + mod-34610) + inits-34960))))))) + tmp-34962) (syntax-violation #f "source expression failed to match any pattern" - tmp-28435)))) - (if rest-28427 - (let ((v-28686 - (let ((id-28696 - (if (if (vector? rest-28427) - (if (= (vector-length rest-28427) 4) - (eq? (vector-ref rest-28427 0) + tmp-34961)))) + (if rest-34953 + (let ((v-35232 + (let ((id-35242 + (if (if (vector? rest-34953) + (if (= (vector-length rest-34953) 4) + (eq? (vector-ref rest-34953 0) 'syntax-object) #f) #f) - (vector-ref rest-28427 1) - rest-28427))) + (vector-ref rest-34953 1) + rest-34953))) (gensym (string-append - (symbol->string id-28696) + (symbol->string id-35242) "-"))))) - (let ((l-28687 (gen-labels-6552 (list v-28686)))) - (let ((r*-28688 - (extend-var-env-6544 - l-28687 - (list v-28686) - r*-28431))) - (let ((w*-28689 - (make-binding-wrap-6563 - (list rest-28427) - l-28687 - w*-28432))) - (parse-kw-28102 - req-28425 - (if (pair? out-28433) (reverse out-28433) #f) - (syntax->datum rest-28427) - (if (pair? kw-28428) (cdr kw-28428) kw-28428) - body-28429 - (cons v-28686 vars-28430) - r*-28688 - w*-28689 - (if (pair? kw-28428) (car kw-28428) #f) + (let ((l-35233 (gen-labels-4553 (list v-35232)))) + (let ((r*-35234 + (extend-var-env-4546 + l-35233 + (list v-35232) + r*-34957))) + (let ((w*-35235 + (make-binding-wrap-4564 + (list rest-34953) + l-35233 + w*-34958))) + (parse-kw-34615 + req-34951 + (if (pair? out-34959) (reverse out-34959) #f) + (syntax->datum rest-34953) + (if (pair? kw-34954) (cdr kw-34954) kw-34954) + body-34955 + (cons v-35232 vars-34956) + r*-35234 + w*-35235 + (if (pair? kw-34954) (car kw-34954) #f) '() - inits-28434))))) - (parse-kw-28102 - req-28425 - (if (pair? out-28433) (reverse out-28433) #f) + inits-34960))))) + (parse-kw-34615 + req-34951 + (if (pair? out-34959) (reverse out-34959) #f) #f - (if (pair? kw-28428) (cdr kw-28428) kw-28428) - body-28429 - vars-28430 - r*-28431 - w*-28432 - (if (pair? kw-28428) (car kw-28428) #f) + (if (pair? kw-34954) (cdr kw-34954) kw-34954) + body-34955 + vars-34956 + r*-34957 + w*-34958 + (if (pair? kw-34954) (car kw-34954) #f) '() - inits-28434))))) - (parse-kw-28102 - (lambda (req-28867 - opt-28868 - rest-28869 - kw-28870 - body-28871 - vars-28872 - r*-28873 - w*-28874 - aok-28875 - out-28876 - inits-28877) - (if (pair? kw-28870) - (let ((tmp-28878 (car kw-28870))) - (let ((tmp-28879 - ($sc-dispatch tmp-28878 '(any any any)))) - (if tmp-28879 + inits-34960))))) + (parse-kw-34615 + (lambda (req-35425 + opt-35426 + rest-35427 + kw-35428 + body-35429 + vars-35430 + r*-35431 + w*-35432 + aok-35433 + out-35434 + inits-35435) + (if (pair? kw-35428) + (let ((tmp-35436 (car kw-35428))) + (let ((tmp-35437 + ($sc-dispatch tmp-35436 '(any any any)))) + (if tmp-35437 (@apply - (lambda (k-28881 id-28882 i-28883) - (let ((v-28884 - (let ((id-28892 - (if (if (vector? id-28882) + (lambda (k-35439 id-35440 i-35441) + (let ((v-35442 + (let ((id-35450 + (if (if (vector? id-35440) (if (= (vector-length - id-28882) + id-35440) 4) (eq? (vector-ref - id-28882 + id-35440 0) 'syntax-object) #f) #f) - (vector-ref id-28882 1) - id-28882))) + (vector-ref id-35440 1) + id-35440))) (gensym (string-append - (symbol->string id-28892) + (symbol->string id-35450) "-"))))) - (let ((l-28885 (gen-labels-6552 (list v-28884)))) - (let ((r**-28886 - (extend-var-env-6544 - l-28885 - (list v-28884) - r*-28873))) - (let ((w**-28887 - (make-binding-wrap-6563 - (list id-28882) - l-28885 - w*-28874))) - (parse-kw-28102 - req-28867 - opt-28868 - rest-28869 - (cdr kw-28870) - body-28871 - (cons v-28884 vars-28872) - r**-28886 - w**-28887 - aok-28875 - (cons (list (syntax->datum k-28881) - (syntax->datum id-28882) - v-28884) - out-28876) - (cons (expand-6585 - i-28883 - r*-28873 - w*-28874 - mod-28097) - inits-28877))))))) - tmp-28879) + (let ((l-35443 (gen-labels-4553 (list v-35442)))) + (let ((r**-35444 + (extend-var-env-4546 + l-35443 + (list v-35442) + r*-35431))) + (let ((w**-35445 + (make-binding-wrap-4564 + (list id-35440) + l-35443 + w*-35432))) + (parse-kw-34615 + req-35425 + opt-35426 + rest-35427 + (cdr kw-35428) + body-35429 + (cons v-35442 vars-35430) + r**-35444 + w**-35445 + aok-35433 + (cons (list (syntax->datum k-35439) + (syntax->datum id-35440) + v-35442) + out-35434) + (cons (expand-4586 + i-35441 + r*-35431 + w*-35432 + mod-34610) + inits-35435))))))) + tmp-35437) (syntax-violation #f "source expression failed to match any pattern" - tmp-28878)))) - (parse-body-28103 - req-28867 - opt-28868 - rest-28869 - (if (if aok-28875 aok-28875 (pair? out-28876)) - (cons aok-28875 (reverse out-28876)) + tmp-35436)))) + (parse-body-34616 + req-35425 + opt-35426 + rest-35427 + (if (if aok-35433 aok-35433 (pair? out-35434)) + (cons aok-35433 (reverse out-35434)) #f) - body-28871 - (reverse vars-28872) - r*-28873 - w*-28874 - (reverse inits-28877) + body-35429 + (reverse vars-35430) + r*-35431 + w*-35432 + (reverse inits-35435) '())))) - (parse-body-28103 - (lambda (req-29139 - opt-29140 - rest-29141 - kw-29142 - body-29143 - vars-29144 - r*-29145 - w*-29146 - inits-29147 - meta-29148) - (let ((tmp-29150 - ($sc-dispatch body-29143 '(any any . each-any)))) - (if (if tmp-29150 + (parse-body-34616 + (lambda (req-35717 + opt-35718 + rest-35719 + kw-35720 + body-35721 + vars-35722 + r*-35723 + w*-35724 + inits-35725 + meta-35726) + (let ((tmp-35728 + ($sc-dispatch body-35721 '(any any . each-any)))) + (if (if tmp-35728 (@apply - (lambda (docstring-29154 e1-29155 e2-29156) - (string? (syntax->datum docstring-29154))) - tmp-29150) + (lambda (docstring-35732 e1-35733 e2-35734) + (string? (syntax->datum docstring-35732))) + tmp-35728) #f) (@apply - (lambda (docstring-29157 e1-29158 e2-29159) - (parse-body-28103 - req-29139 - opt-29140 - rest-29141 - kw-29142 - (cons e1-29158 e2-29159) - vars-29144 - r*-29145 - w*-29146 - inits-29147 + (lambda (docstring-35735 e1-35736 e2-35737) + (parse-body-34616 + req-35717 + opt-35718 + rest-35719 + kw-35720 + (cons e1-35736 e2-35737) + vars-35722 + r*-35723 + w*-35724 + inits-35725 (append - meta-29148 + meta-35726 (list (cons 'documentation - (syntax->datum docstring-29157)))))) - tmp-29150) - (let ((tmp-29160 + (syntax->datum docstring-35735)))))) + tmp-35728) + (let ((tmp-35738 ($sc-dispatch - body-29143 + body-35721 '(#(vector #(each (any . any))) any . each-any)))) - (if tmp-29160 + (if tmp-35738 (@apply - (lambda (k-29164 v-29165 e1-29166 e2-29167) - (parse-body-28103 - req-29139 - opt-29140 - rest-29141 - kw-29142 - (cons e1-29166 e2-29167) - vars-29144 - r*-29145 - w*-29146 - inits-29147 + (lambda (k-35742 v-35743 e1-35744 e2-35745) + (parse-body-34616 + req-35717 + opt-35718 + rest-35719 + kw-35720 + (cons e1-35744 e2-35745) + vars-35722 + r*-35723 + w*-35724 + inits-35725 (append - meta-29148 - (syntax->datum (map cons k-29164 v-29165))))) - tmp-29160) - (let ((tmp-29168 - ($sc-dispatch body-29143 '(any . each-any)))) - (if tmp-29168 + meta-35726 + (syntax->datum (map cons k-35742 v-35743))))) + tmp-35738) + (let ((tmp-35746 + ($sc-dispatch body-35721 '(any . each-any)))) + (if tmp-35746 (@apply - (lambda (e1-29172 e2-29173) + (lambda (e1-35750 e2-35751) (values - meta-29148 - req-29139 - opt-29140 - rest-29141 - kw-29142 - inits-29147 - vars-29144 - (expand-body-6589 - (cons e1-29172 e2-29173) - (wrap-6578 - (begin - (if (if (pair? e-28093) s-28096 #f) - (set-source-properties! - e-28093 - s-28096)) - e-28093) - w-28095 - mod-28097) - r*-29145 - w*-29146 - mod-28097))) - tmp-29168) + meta-35726 + req-35717 + opt-35718 + rest-35719 + kw-35720 + inits-35725 + vars-35722 + (expand-body-4590 + (cons e1-35750 e2-35751) + (let ((x-35763 + (begin + (if (if (pair? e-34606) + s-34609 + #f) + (set-source-properties! + e-34606 + s-34609)) + e-34606))) + (if (if (null? (car w-34608)) + (null? (cdr w-34608)) + #f) + x-35763 + (if (if (vector? x-35763) + (if (= (vector-length x-35763) 4) + (eq? (vector-ref x-35763 0) + 'syntax-object) + #f) + #f) + (let ((expression-35795 + (vector-ref x-35763 1)) + (wrap-35796 + (let ((w2-35804 + (vector-ref + x-35763 + 2))) + (let ((m1-35805 + (car w-34608)) + (s1-35806 + (cdr w-34608))) + (if (null? m1-35805) + (if (null? s1-35806) + w2-35804 + (cons (car w2-35804) + (let ((m2-35821 + (cdr w2-35804))) + (if (null? m2-35821) + s1-35806 + (append + s1-35806 + m2-35821))))) + (cons (let ((m2-35829 + (car w2-35804))) + (if (null? m2-35829) + m1-35805 + (append + m1-35805 + m2-35829))) + (let ((m2-35837 + (cdr w2-35804))) + (if (null? m2-35837) + s1-35806 + (append + s1-35806 + m2-35837)))))))) + (module-35797 + (vector-ref x-35763 3))) + (vector + 'syntax-object + expression-35795 + wrap-35796 + module-35797)) + (if (null? x-35763) + x-35763 + (vector + 'syntax-object + x-35763 + w-34608 + mod-34610))))) + r*-35723 + w*-35724 + mod-34610))) + tmp-35746) (syntax-violation #f "source expression failed to match any pattern" - body-29143)))))))))) - (let ((tmp-28105 ($sc-dispatch clauses-28099 '()))) - (if tmp-28105 - (@apply (lambda () (values '() #f)) tmp-28105) - (let ((tmp-28109 + body-35721)))))))))) + (let ((tmp-34618 ($sc-dispatch clauses-34612 '()))) + (if tmp-34618 + (@apply (lambda () (values '() #f)) tmp-34618) + (let ((tmp-34622 ($sc-dispatch - clauses-28099 + clauses-34612 '((any any . each-any) . #(each (any any . each-any)))))) - (if tmp-28109 + (if tmp-34622 (@apply - (lambda (args-28113 - e1-28114 - e2-28115 - args*-28116 - e1*-28117 - e2*-28118) + (lambda (args-34626 + e1-34627 + e2-34628 + args*-34629 + e1*-34630 + e2*-34631) (call-with-values - (lambda () (get-formals-28098 args-28113)) - (lambda (req-28119 opt-28120 rest-28121 kw-28122) + (lambda () (get-formals-34611 args-34626)) + (lambda (req-34632 opt-34633 rest-34634 kw-34635) (call-with-values (lambda () - (parse-req-28100 - req-28119 - opt-28120 - rest-28121 - kw-28122 - (cons e1-28114 e2-28115))) - (lambda (meta-28187 - req-28188 - opt-28189 - rest-28190 - kw-28191 - inits-28192 - vars-28193 - body-28194) + (parse-req-34613 + req-34632 + opt-34633 + rest-34634 + kw-34635 + (cons e1-34627 e2-34628))) + (lambda (meta-34702 + req-34703 + opt-34704 + rest-34705 + kw-34706 + inits-34707 + vars-34708 + body-34709) (call-with-values (lambda () - (expand-lambda-case-6597 - e-28093 - r-28094 - w-28095 - s-28096 - mod-28097 - get-formals-28098 - (map (lambda (tmp-4949-28195 - tmp-4948-28196 - tmp-4947-28197) - (cons tmp-4947-28197 - (cons tmp-4948-28196 - tmp-4949-28195))) - e2*-28118 - e1*-28117 - args*-28116))) - (lambda (meta*-28198 else*-28199) + (expand-lambda-case-4598 + e-34606 + r-34607 + w-34608 + s-34609 + mod-34610 + get-formals-34611 + (map (lambda (tmp-2961-34710 + tmp-2960-34711 + tmp-2959-34712) + (cons tmp-2959-34712 + (cons tmp-2960-34711 + tmp-2961-34710))) + e2*-34631 + e1*-34630 + args*-34629))) + (lambda (meta*-34713 else*-34714) (values - (append meta-28187 meta*-28198) + (append meta-34702 meta*-34713) (make-struct/no-tail - (vector-ref %expanded-vtables 14) - s-28096 - req-28188 - opt-28189 - rest-28190 - kw-28191 - inits-28192 - vars-28193 - body-28194 - else*-28199))))))))) - tmp-28109) + (vector-ref %expanded-vtables 15) + s-34609 + req-34703 + opt-34704 + rest-34705 + kw-34706 + inits-34707 + vars-34708 + body-34709 + else*-34714))))))))) + tmp-34622) (syntax-violation #f "source expression failed to match any pattern" - clauses-28099)))))))) - (strip-6598 - (lambda (x-29210 w-29211) - (if (memq 'top (car w-29211)) - x-29210 + clauses-34612)))))))) + (strip-4599 + (lambda (x-35864 w-35865) + (if (memq 'top (car w-35865)) + x-35864 (letrec* - ((f-29212 - (lambda (x-29215) - (if (if (vector? x-29215) - (if (= (vector-length x-29215) 4) - (eq? (vector-ref x-29215 0) 'syntax-object) + ((f-35866 + (lambda (x-35869) + (if (if (vector? x-35869) + (if (= (vector-length x-35869) 4) + (eq? (vector-ref x-35869 0) 'syntax-object) #f) #f) - (strip-6598 - (vector-ref x-29215 1) - (vector-ref x-29215 2)) - (if (pair? x-29215) - (let ((a-29234 (f-29212 (car x-29215))) - (d-29235 (f-29212 (cdr x-29215)))) - (if (if (eq? a-29234 (car x-29215)) - (eq? d-29235 (cdr x-29215)) + (strip-4599 + (vector-ref x-35869 1) + (vector-ref x-35869 2)) + (if (pair? x-35869) + (let ((a-35888 (f-35866 (car x-35869))) + (d-35889 (f-35866 (cdr x-35869)))) + (if (if (eq? a-35888 (car x-35869)) + (eq? d-35889 (cdr x-35869)) #f) - x-29215 - (cons a-29234 d-29235))) - (if (vector? x-29215) - (let ((old-29238 (vector->list x-29215))) - (let ((new-29239 (map f-29212 old-29238))) + x-35869 + (cons a-35888 d-35889))) + (if (vector? x-35869) + (let ((old-35892 (vector->list x-35869))) + (let ((new-35893 (map f-35866 old-35892))) (letrec* - ((lp-29240 - (lambda (l1-29316 l2-29317) - (if (null? l1-29316) - x-29215 - (if (eq? (car l1-29316) (car l2-29317)) - (lp-29240 (cdr l1-29316) (cdr l2-29317)) - (list->vector new-29239)))))) - (lp-29240 old-29238 new-29239)))) - x-29215)))))) - (f-29212 x-29210))))) - (gen-var-6599 - (lambda (id-28243) - (let ((id-28244 - (if (if (vector? id-28243) - (if (= (vector-length id-28243) 4) - (eq? (vector-ref id-28243 0) 'syntax-object) + ((lp-35894 + (lambda (l1-35991 l2-35992) + (if (null? l1-35991) + x-35869 + (if (eq? (car l1-35991) (car l2-35992)) + (lp-35894 (cdr l1-35991) (cdr l2-35992)) + (list->vector new-35893)))))) + (lp-35894 old-35892 new-35893)))) + x-35869)))))) + (f-35866 x-35864))))) + (gen-var-4600 + (lambda (id-34758) + (let ((id-34759 + (if (if (vector? id-34758) + (if (= (vector-length id-34758) 4) + (eq? (vector-ref id-34758 0) 'syntax-object) #f) #f) - (vector-ref id-28243 1) - id-28243))) + (vector-ref id-34758 1) + id-34758))) (gensym - (string-append (symbol->string id-28244) "-")))))) + (string-append (symbol->string id-34759) "-"))))) + (lambda-var-list-4601 + (lambda (vars-35993) + (letrec* + ((lvl-35994 + (lambda (vars-35997 ls-35998 w-35999) + (if (pair? vars-35997) + (lvl-35994 + (cdr vars-35997) + (cons (let ((x-36003 (car vars-35997))) + (if (if (null? (car w-35999)) + (null? (cdr w-35999)) + #f) + x-36003 + (if (if (vector? x-36003) + (if (= (vector-length x-36003) 4) + (eq? (vector-ref x-36003 0) + 'syntax-object) + #f) + #f) + (let ((expression-36021 (vector-ref x-36003 1)) + (wrap-36022 + (let ((w2-36030 + (vector-ref x-36003 2))) + (let ((m1-36031 (car w-35999)) + (s1-36032 (cdr w-35999))) + (if (null? m1-36031) + (if (null? s1-36032) + w2-36030 + (cons (car w2-36030) + (let ((m2-36047 + (cdr w2-36030))) + (if (null? m2-36047) + s1-36032 + (append + s1-36032 + m2-36047))))) + (cons (let ((m2-36055 + (car w2-36030))) + (if (null? m2-36055) + m1-36031 + (append + m1-36031 + m2-36055))) + (let ((m2-36063 + (cdr w2-36030))) + (if (null? m2-36063) + s1-36032 + (append + s1-36032 + m2-36063)))))))) + (module-36023 (vector-ref x-36003 3))) + (vector + 'syntax-object + expression-36021 + wrap-36022 + module-36023)) + (if (null? x-36003) + x-36003 + (vector + 'syntax-object + x-36003 + w-35999 + #f))))) + ls-35998) + w-35999) + (if (if (symbol? vars-35997) + #t + (if (if (vector? vars-35997) + (if (= (vector-length vars-35997) 4) + (eq? (vector-ref vars-35997 0) 'syntax-object) + #f) + #f) + (symbol? (vector-ref vars-35997 1)) + #f)) + (cons (if (if (null? (car w-35999)) + (null? (cdr w-35999)) + #f) + vars-35997 + (if (if (vector? vars-35997) + (if (= (vector-length vars-35997) 4) + (eq? (vector-ref vars-35997 0) + 'syntax-object) + #f) + #f) + (let ((expression-36133 + (vector-ref vars-35997 1)) + (wrap-36134 + (let ((w2-36144 + (vector-ref vars-35997 2))) + (let ((m1-36145 (car w-35999)) + (s1-36146 (cdr w-35999))) + (if (null? m1-36145) + (if (null? s1-36146) + w2-36144 + (cons (car w2-36144) + (let ((m2-36163 + (cdr w2-36144))) + (if (null? m2-36163) + s1-36146 + (append + s1-36146 + m2-36163))))) + (cons (let ((m2-36171 + (car w2-36144))) + (if (null? m2-36171) + m1-36145 + (append + m1-36145 + m2-36171))) + (let ((m2-36179 + (cdr w2-36144))) + (if (null? m2-36179) + s1-36146 + (append + s1-36146 + m2-36179)))))))) + (module-36135 (vector-ref vars-35997 3))) + (vector + 'syntax-object + expression-36133 + wrap-36134 + module-36135)) + (if (null? vars-35997) + vars-35997 + (vector + 'syntax-object + vars-35997 + w-35999 + #f)))) + ls-35998) + (if (null? vars-35997) + ls-35998 + (if (if (vector? vars-35997) + (if (= (vector-length vars-35997) 4) + (eq? (vector-ref vars-35997 0) 'syntax-object) + #f) + #f) + (lvl-35994 + (vector-ref vars-35997 1) + ls-35998 + (let ((w2-36220 (vector-ref vars-35997 2))) + (let ((m1-36221 (car w-35999)) + (s1-36222 (cdr w-35999))) + (if (null? m1-36221) + (if (null? s1-36222) + w2-36220 + (cons (car w2-36220) + (let ((m2-36233 (cdr w2-36220))) + (if (null? m2-36233) + s1-36222 + (append s1-36222 m2-36233))))) + (cons (let ((m2-36241 (car w2-36220))) + (if (null? m2-36241) + m1-36221 + (append m1-36221 m2-36241))) + (let ((m2-36249 (cdr w2-36220))) + (if (null? m2-36249) + s1-36222 + (append s1-36222 m2-36249)))))))) + (cons vars-35997 ls-35998)))))))) + (lvl-35994 vars-35993 '() '(())))))) (begin - (set! session-id-6510 - (let ((v-17707 + (set! session-id-4511 + (let ((v-18812 (module-variable (current-module) 'syntax-session-id))) - (lambda () ((variable-ref v-17707))))) - (set! transformer-environment-6571 + (lambda () ((variable-ref v-18812))))) + (set! transformer-environment-4572 (make-fluid - (lambda (k-16750) + (lambda (k-17456) (error "called outside the dynamic extent of a syntax transformer")))) (module-define! (current-module) @@ -8177,1683 +9324,2389 @@ 'let-syntax 'local-syntax #f)) - (global-extend-6547 + (global-extend-4548 'core 'syntax-parameterize - (lambda (e-6720 r-6721 w-6722 s-6723 mod-6724) - (let ((tmp-6726 + (lambda (e-4728 r-4729 w-4730 s-4731 mod-4732) + (let ((tmp-4734 ($sc-dispatch - e-6720 + e-4728 '(_ #(each (any any)) any . each-any)))) - (if (if tmp-6726 + (if (if tmp-4734 (@apply - (lambda (var-6730 val-6731 e1-6732 e2-6733) - (valid-bound-ids?-6575 var-6730)) - tmp-6726) + (lambda (var-4738 val-4739 e1-4740 e2-4741) + (valid-bound-ids?-4576 var-4738)) + tmp-4734) #f) (@apply - (lambda (var-6811 val-6812 e1-6813 e2-6814) - (let ((names-6815 - (map (lambda (x-6865) - (id-var-name-6568 x-6865 w-6722)) - var-6811))) - (begin - (for-each - (lambda (id-6816 n-6817) - (let ((atom-key-6818 - (car (let ((t-6825 (assq n-6817 r-6721))) - (if t-6825 - (cdr t-6825) - (if (symbol? n-6817) - (let ((t-6830 - (get-global-definition-hook-6512 - n-6817 - mod-6724))) - (if t-6830 t-6830 '(global))) - '(displaced-lexical))))))) - (if (eqv? atom-key-6818 'displaced-lexical) - (syntax-violation - 'syntax-parameterize - "identifier out of context" - e-6720 - (wrap-6578 - (begin - (if (if (pair? id-6816) s-6723 #f) - (set-source-properties! id-6816 s-6723)) - id-6816) - w-6722 - mod-6724))))) - var-6811 - names-6815) - (expand-body-6589 - (cons e1-6813 e2-6814) - (wrap-6578 - (begin - (if (if (pair? e-6720) s-6723 #f) - (set-source-properties! e-6720 s-6723)) - e-6720) - w-6722 - mod-6724) - (extend-env-6543 - names-6815 - (let ((trans-r-6951 (macros-only-env-6545 r-6721))) - (map (lambda (x-6952) + (lambda (var-4826 val-4827 e1-4828 e2-4829) + (let ((names-4830 + (map (lambda (x-5170) + (call-with-values + (lambda () + (resolve-identifier-4571 + x-5170 + w-4730 + r-4729 + mod-4732 + #f)) + (lambda (type-5173 value-5174 mod-5175) + (if (eqv? type-5173 'displaced-lexical) + (syntax-violation + 'syntax-parameterize + "identifier out of context" + e-4728 + (let ((x-5188 + (begin + (if (if (pair? x-5170) + s-4731 + #f) + (set-source-properties! + x-5170 + s-4731)) + x-5170))) + (if (if (null? (car w-4730)) + (null? (cdr w-4730)) + #f) + x-5188 + (if (if (vector? x-5188) + (if (= (vector-length + x-5188) + 4) + (eq? (vector-ref x-5188 0) + 'syntax-object) + #f) + #f) + (let ((expression-5220 + (vector-ref x-5188 1)) + (wrap-5221 + (let ((w2-5229 + (vector-ref + x-5188 + 2))) + (let ((m1-5230 + (car w-4730)) + (s1-5231 + (cdr w-4730))) + (if (null? m1-5230) + (if (null? s1-5231) + w2-5229 + (cons (car w2-5229) + (let ((m2-5246 + (cdr w2-5229))) + (if (null? m2-5246) + s1-5231 + (append + s1-5231 + m2-5246))))) + (cons (let ((m2-5254 + (car w2-5229))) + (if (null? m2-5254) + m1-5230 + (append + m1-5230 + m2-5254))) + (let ((m2-5262 + (cdr w2-5229))) + (if (null? m2-5262) + s1-5231 + (append + s1-5231 + m2-5262)))))))) + (module-5222 + (vector-ref x-5188 3))) + (vector + 'syntax-object + expression-5220 + wrap-5221 + module-5222)) + (if (null? x-5188) + x-5188 + (vector + 'syntax-object + x-5188 + w-4730 + mod-5175)))))) + (if (eqv? type-5173 'syntax-parameter) + value-5174 + (syntax-violation + 'syntax-parameterize + "invalid syntax parameter" + e-4728 + (let ((x-5289 + (begin + (if (if (pair? x-5170) + s-4731 + #f) + (set-source-properties! + x-5170 + s-4731)) + x-5170))) + (if (if (null? (car w-4730)) + (null? (cdr w-4730)) + #f) + x-5289 + (if (if (vector? x-5289) + (if (= (vector-length + x-5289) + 4) + (eq? (vector-ref + x-5289 + 0) + 'syntax-object) + #f) + #f) + (let ((expression-5321 + (vector-ref x-5289 1)) + (wrap-5322 + (let ((w2-5330 + (vector-ref + x-5289 + 2))) + (let ((m1-5331 + (car w-4730)) + (s1-5332 + (cdr w-4730))) + (if (null? m1-5331) + (if (null? s1-5332) + w2-5330 + (cons (car w2-5330) + (let ((m2-5347 + (cdr w2-5330))) + (if (null? m2-5347) + s1-5332 + (append + s1-5332 + m2-5347))))) + (cons (let ((m2-5355 + (car w2-5330))) + (if (null? m2-5355) + m1-5331 + (append + m1-5331 + m2-5355))) + (let ((m2-5363 + (cdr w2-5330))) + (if (null? m2-5363) + s1-5332 + (append + s1-5332 + m2-5363)))))))) + (module-5323 + (vector-ref + x-5289 + 3))) + (vector + 'syntax-object + expression-5321 + wrap-5322 + module-5323)) + (if (null? x-5289) + x-5289 + (vector + 'syntax-object + x-5289 + w-4730 + mod-5175))))))))))) + var-4826)) + (bindings-4831 + (let ((trans-r-5378 (macros-only-env-4547 r-4729))) + (map (lambda (x-5379) (cons 'macro - (eval-local-transformer-6591 - (expand-6585 - x-6952 - trans-r-6951 - w-6722 - mod-6724) - mod-6724))) - val-6812)) - r-6721) - w-6722 - mod-6724)))) - tmp-6726) + (eval-local-transformer-4592 + (expand-4586 + x-5379 + trans-r-5378 + w-4730 + mod-4732) + mod-4732))) + val-4827)))) + (expand-body-4590 + (cons e1-4828 e2-4829) + (let ((x-4843 + (begin + (if (if (pair? e-4728) s-4731 #f) + (set-source-properties! e-4728 s-4731)) + e-4728))) + (if (if (null? (car w-4730)) (null? (cdr w-4730)) #f) + x-4843 + (if (if (vector? x-4843) + (if (= (vector-length x-4843) 4) + (eq? (vector-ref x-4843 0) 'syntax-object) + #f) + #f) + (let ((expression-4875 (vector-ref x-4843 1)) + (wrap-4876 + (let ((w2-4884 (vector-ref x-4843 2))) + (let ((m1-4885 (car w-4730)) + (s1-4886 (cdr w-4730))) + (if (null? m1-4885) + (if (null? s1-4886) + w2-4884 + (cons (car w2-4884) + (let ((m2-4901 + (cdr w2-4884))) + (if (null? m2-4901) + s1-4886 + (append + s1-4886 + m2-4901))))) + (cons (let ((m2-4909 (car w2-4884))) + (if (null? m2-4909) + m1-4885 + (append m1-4885 m2-4909))) + (let ((m2-4917 (cdr w2-4884))) + (if (null? m2-4917) + s1-4886 + (append + s1-4886 + m2-4917)))))))) + (module-4877 (vector-ref x-4843 3))) + (vector + 'syntax-object + expression-4875 + wrap-4876 + module-4877)) + (if (null? x-4843) + x-4843 + (vector + 'syntax-object + x-4843 + w-4730 + mod-4732))))) + (extend-env-4545 names-4830 bindings-4831 r-4729) + w-4730 + mod-4732))) + tmp-4734) (syntax-violation 'syntax-parameterize "bad syntax" - (wrap-6578 - (begin - (if (if (pair? e-6720) s-6723 #f) - (set-source-properties! e-6720 s-6723)) - e-6720) - w-6722 - mod-6724)))))) + (let ((x-5599 + (begin + (if (if (pair? e-4728) s-4731 #f) + (set-source-properties! e-4728 s-4731)) + e-4728))) + (if (if (null? (car w-4730)) (null? (cdr w-4730)) #f) + x-5599 + (if (if (vector? x-5599) + (if (= (vector-length x-5599) 4) + (eq? (vector-ref x-5599 0) 'syntax-object) + #f) + #f) + (let ((expression-5631 (vector-ref x-5599 1)) + (wrap-5632 + (let ((w2-5640 (vector-ref x-5599 2))) + (let ((m1-5641 (car w-4730)) + (s1-5642 (cdr w-4730))) + (if (null? m1-5641) + (if (null? s1-5642) + w2-5640 + (cons (car w2-5640) + (let ((m2-5657 (cdr w2-5640))) + (if (null? m2-5657) + s1-5642 + (append s1-5642 m2-5657))))) + (cons (let ((m2-5665 (car w2-5640))) + (if (null? m2-5665) + m1-5641 + (append m1-5641 m2-5665))) + (let ((m2-5673 (cdr w2-5640))) + (if (null? m2-5673) + s1-5642 + (append s1-5642 m2-5673)))))))) + (module-5633 (vector-ref x-5599 3))) + (vector + 'syntax-object + expression-5631 + wrap-5632 + module-5633)) + (if (null? x-5599) + x-5599 + (vector 'syntax-object x-5599 w-4730 mod-4732)))))))))) (module-define! (current-module) 'quote (make-syntax-transformer 'quote 'core - (lambda (e-7161 r-7162 w-7163 s-7164 mod-7165) - (let ((tmp-7167 ($sc-dispatch e-7161 '(_ any)))) - (if tmp-7167 + (lambda (e-5701 r-5702 w-5703 s-5704 mod-5705) + (let ((tmp-5707 ($sc-dispatch e-5701 '(_ any)))) + (if tmp-5707 (@apply - (lambda (e-7170) - (let ((exp-7174 (strip-6598 e-7170 w-7163))) + (lambda (e-5710) + (let ((exp-5714 (strip-4599 e-5710 w-5703))) (make-struct/no-tail (vector-ref %expanded-vtables 1) - s-7164 - exp-7174))) - tmp-7167) + s-5704 + exp-5714))) + tmp-5707) (syntax-violation 'quote "bad syntax" - (wrap-6578 - (begin - (if (if (pair? e-7161) s-7164 #f) - (set-source-properties! e-7161 s-7164)) - e-7161) - w-7163 - mod-7165))))))) - (global-extend-6547 + (let ((x-5728 + (begin + (if (if (pair? e-5701) s-5704 #f) + (set-source-properties! e-5701 s-5704)) + e-5701))) + (if (if (null? (car w-5703)) (null? (cdr w-5703)) #f) + x-5728 + (if (if (vector? x-5728) + (if (= (vector-length x-5728) 4) + (eq? (vector-ref x-5728 0) 'syntax-object) + #f) + #f) + (let ((expression-5760 (vector-ref x-5728 1)) + (wrap-5761 + (let ((w2-5769 (vector-ref x-5728 2))) + (let ((m1-5770 (car w-5703)) + (s1-5771 (cdr w-5703))) + (if (null? m1-5770) + (if (null? s1-5771) + w2-5769 + (cons (car w2-5769) + (let ((m2-5786 (cdr w2-5769))) + (if (null? m2-5786) + s1-5771 + (append s1-5771 m2-5786))))) + (cons (let ((m2-5794 (car w2-5769))) + (if (null? m2-5794) + m1-5770 + (append m1-5770 m2-5794))) + (let ((m2-5802 (cdr w2-5769))) + (if (null? m2-5802) + s1-5771 + (append s1-5771 m2-5802)))))))) + (module-5762 (vector-ref x-5728 3))) + (vector + 'syntax-object + expression-5760 + wrap-5761 + module-5762)) + (if (null? x-5728) + x-5728 + (vector + 'syntax-object + x-5728 + w-5703 + mod-5705))))))))))) + (global-extend-4548 'core 'syntax (letrec* - ((gen-syntax-7394 - (lambda (src-7496 - e-7497 - r-7498 - maps-7499 - ellipsis?-7500 - mod-7501) - (if (if (symbol? e-7497) + ((gen-syntax-6020 + (lambda (src-6451 + e-6452 + r-6453 + maps-6454 + ellipsis?-6455 + mod-6456) + (if (if (symbol? e-6452) #t - (if (if (vector? e-7497) - (if (= (vector-length e-7497) 4) - (eq? (vector-ref e-7497 0) 'syntax-object) + (if (if (vector? e-6452) + (if (= (vector-length e-6452) 4) + (eq? (vector-ref e-6452 0) 'syntax-object) #f) #f) - (symbol? (vector-ref e-7497 1)) + (symbol? (vector-ref e-6452 1)) + #f)) + (call-with-values + (lambda () + (resolve-identifier-4571 + e-6452 + '(()) + r-6453 + mod-6456 #f)) - (let ((label-7528 (id-var-name-6568 e-7497 '(())))) - (let ((b-7529 - (let ((t-7536 (assq label-7528 r-7498))) - (if t-7536 - (cdr t-7536) - (if (symbol? label-7528) - (let ((t-7542 - (get-global-definition-hook-6512 - label-7528 - mod-7501))) - (if t-7542 t-7542 '(global))) - '(displaced-lexical)))))) - (if (eq? (car b-7529) 'syntax) + (lambda (type-6485 value-6486 mod-6487) + (if (eqv? type-6485 'syntax) (call-with-values (lambda () - (let ((var.lev-7551 (cdr b-7529))) - (gen-ref-7395 - src-7496 - (car var.lev-7551) - (cdr var.lev-7551) - maps-7499))) - (lambda (var-7555 maps-7556) - (values (list 'ref var-7555) maps-7556))) - (if (ellipsis?-7500 e-7497) + (gen-ref-6021 + src-6451 + (car value-6486) + (cdr value-6486) + maps-6454)) + (lambda (var-6493 maps-6494) + (values (list 'ref var-6493) maps-6494))) + (if (ellipsis?-6455 e-6452) (syntax-violation 'syntax "misplaced ellipsis" - src-7496) - (values (list 'quote e-7497) maps-7499))))) - (let ((tmp-7558 ($sc-dispatch e-7497 '(any any)))) - (if (if tmp-7558 + src-6451) + (values (list 'quote e-6452) maps-6454))))) + (let ((tmp-6496 ($sc-dispatch e-6452 '(any any)))) + (if (if tmp-6496 (@apply - (lambda (dots-7562 e-7563) - (ellipsis?-7500 dots-7562)) - tmp-7558) + (lambda (dots-6500 e-6501) + (ellipsis?-6455 dots-6500)) + tmp-6496) #f) (@apply - (lambda (dots-7564 e-7565) - (gen-syntax-7394 - src-7496 - e-7565 - r-7498 - maps-7499 - (lambda (x-7566) #f) - mod-7501)) - tmp-7558) - (let ((tmp-7567 ($sc-dispatch e-7497 '(any any . any)))) - (if (if tmp-7567 + (lambda (dots-6502 e-6503) + (gen-syntax-6020 + src-6451 + e-6503 + r-6453 + maps-6454 + (lambda (x-6504) #f) + mod-6456)) + tmp-6496) + (let ((tmp-6505 ($sc-dispatch e-6452 '(any any . any)))) + (if (if tmp-6505 (@apply - (lambda (x-7571 dots-7572 y-7573) - (ellipsis?-7500 dots-7572)) - tmp-7567) + (lambda (x-6509 dots-6510 y-6511) + (ellipsis?-6455 dots-6510)) + tmp-6505) #f) (@apply - (lambda (x-7574 dots-7575 y-7576) + (lambda (x-6512 dots-6513 y-6514) (letrec* - ((f-7577 - (lambda (y-7585 k-7586) - (let ((tmp-7588 + ((f-6515 + (lambda (y-6523 k-6524) + (let ((tmp-6526 ($sc-dispatch - y-7585 + y-6523 '(any . any)))) - (if (if tmp-7588 + (if (if tmp-6526 (@apply - (lambda (dots-7592 y-7593) - (ellipsis?-7500 dots-7592)) - tmp-7588) + (lambda (dots-6530 y-6531) + (ellipsis?-6455 dots-6530)) + tmp-6526) #f) (@apply - (lambda (dots-7594 y-7595) - (f-7577 - y-7595 - (lambda (maps-7596) + (lambda (dots-6532 y-6533) + (f-6515 + y-6533 + (lambda (maps-6534) (call-with-values (lambda () - (k-7586 - (cons '() maps-7596))) - (lambda (x-7597 maps-7598) - (if (null? (car maps-7598)) + (k-6524 + (cons '() maps-6534))) + (lambda (x-6535 maps-6536) + (if (null? (car maps-6536)) (syntax-violation 'syntax "extra ellipsis" - src-7496) + src-6451) (values - (let ((map-env-7602 - (car maps-7598))) + (let ((map-env-6540 + (car maps-6536))) (list 'apply '(primitive append) - (gen-map-7397 - x-7597 - map-env-7602))) - (cdr maps-7598)))))))) - tmp-7588) + (gen-map-6023 + x-6535 + map-env-6540))) + (cdr maps-6536)))))))) + tmp-6526) (call-with-values (lambda () - (gen-syntax-7394 - src-7496 - y-7585 - r-7498 - maps-7499 - ellipsis?-7500 - mod-7501)) - (lambda (y-7605 maps-7606) + (gen-syntax-6020 + src-6451 + y-6523 + r-6453 + maps-6454 + ellipsis?-6455 + mod-6456)) + (lambda (y-6543 maps-6544) (call-with-values - (lambda () (k-7586 maps-7606)) - (lambda (x-7607 maps-7608) + (lambda () (k-6524 maps-6544)) + (lambda (x-6545 maps-6546) (values - (if (equal? y-7605 ''()) - x-7607 + (if (equal? y-6543 ''()) + x-6545 (list 'append - x-7607 - y-7605)) - maps-7608)))))))))) - (f-7577 - y-7576 - (lambda (maps-7580) + x-6545 + y-6543)) + maps-6546)))))))))) + (f-6515 + y-6514 + (lambda (maps-6518) (call-with-values (lambda () - (gen-syntax-7394 - src-7496 - x-7574 - r-7498 - (cons '() maps-7580) - ellipsis?-7500 - mod-7501)) - (lambda (x-7581 maps-7582) - (if (null? (car maps-7582)) + (gen-syntax-6020 + src-6451 + x-6512 + r-6453 + (cons '() maps-6518) + ellipsis?-6455 + mod-6456)) + (lambda (x-6519 maps-6520) + (if (null? (car maps-6520)) (syntax-violation 'syntax "extra ellipsis" - src-7496) + src-6451) (values - (gen-map-7397 - x-7581 - (car maps-7582)) - (cdr maps-7582))))))))) - tmp-7567) - (let ((tmp-7624 ($sc-dispatch e-7497 '(any . any)))) - (if tmp-7624 + (gen-map-6023 + x-6519 + (car maps-6520)) + (cdr maps-6520))))))))) + tmp-6505) + (let ((tmp-6562 ($sc-dispatch e-6452 '(any . any)))) + (if tmp-6562 (@apply - (lambda (x-7628 y-7629) + (lambda (x-6566 y-6567) (call-with-values (lambda () - (gen-syntax-7394 - src-7496 - x-7628 - r-7498 - maps-7499 - ellipsis?-7500 - mod-7501)) - (lambda (x-7630 maps-7631) + (gen-syntax-6020 + src-6451 + x-6566 + r-6453 + maps-6454 + ellipsis?-6455 + mod-6456)) + (lambda (x-6568 maps-6569) (call-with-values (lambda () - (gen-syntax-7394 - src-7496 - y-7629 - r-7498 - maps-7631 - ellipsis?-7500 - mod-7501)) - (lambda (y-7632 maps-7633) + (gen-syntax-6020 + src-6451 + y-6567 + r-6453 + maps-6569 + ellipsis?-6455 + mod-6456)) + (lambda (y-6570 maps-6571) (values - (let ((atom-key-7638 (car y-7632))) - (if (eqv? atom-key-7638 'quote) - (if (eq? (car x-7630) 'quote) + (let ((atom-key-6576 (car y-6570))) + (if (eqv? atom-key-6576 'quote) + (if (eq? (car x-6568) 'quote) (list 'quote - (cons (car (cdr x-7630)) - (car (cdr y-7632)))) - (if (eq? (car (cdr y-7632)) + (cons (car (cdr x-6568)) + (car (cdr y-6570)))) + (if (eq? (car (cdr y-6570)) '()) - (list 'list x-7630) - (list 'cons x-7630 y-7632))) - (if (eqv? atom-key-7638 'list) + (list 'list x-6568) + (list 'cons x-6568 y-6570))) + (if (eqv? atom-key-6576 'list) (cons 'list - (cons x-7630 - (cdr y-7632))) - (list 'cons x-7630 y-7632)))) - maps-7633)))))) - tmp-7624) - (let ((tmp-7667 + (cons x-6568 + (cdr y-6570))) + (list 'cons x-6568 y-6570)))) + maps-6571)))))) + tmp-6562) + (let ((tmp-6605 ($sc-dispatch - e-7497 + e-6452 '#(vector (any . each-any))))) - (if tmp-7667 + (if tmp-6605 (@apply - (lambda (e1-7671 e2-7672) + (lambda (e1-6609 e2-6610) (call-with-values (lambda () - (gen-syntax-7394 - src-7496 - (cons e1-7671 e2-7672) - r-7498 - maps-7499 - ellipsis?-7500 - mod-7501)) - (lambda (e-7673 maps-7674) + (gen-syntax-6020 + src-6451 + (cons e1-6609 e2-6610) + r-6453 + maps-6454 + ellipsis?-6455 + mod-6456)) + (lambda (e-6611 maps-6612) (values - (if (eq? (car e-7673) 'list) - (cons 'vector (cdr e-7673)) - (if (eq? (car e-7673) 'quote) + (if (eq? (car e-6611) 'list) + (cons 'vector (cdr e-6611)) + (if (eq? (car e-6611) 'quote) (list 'quote (list->vector - (car (cdr e-7673)))) - (list 'list->vector e-7673))) - maps-7674)))) - tmp-7667) + (car (cdr e-6611)))) + (list 'list->vector e-6611))) + maps-6612)))) + tmp-6605) (values - (list 'quote e-7497) - maps-7499)))))))))))) - (gen-ref-7395 - (lambda (src-7701 var-7702 level-7703 maps-7704) - (if (= level-7703 0) - (values var-7702 maps-7704) - (if (null? maps-7704) + (list 'quote e-6452) + maps-6454)))))))))))) + (gen-ref-6021 + (lambda (src-6639 var-6640 level-6641 maps-6642) + (if (= level-6641 0) + (values var-6640 maps-6642) + (if (null? maps-6642) (syntax-violation 'syntax "missing ellipsis" - src-7701) + src-6639) (call-with-values (lambda () - (gen-ref-7395 - src-7701 - var-7702 - (#{1-}# level-7703) - (cdr maps-7704))) - (lambda (outer-var-7705 outer-maps-7706) - (let ((b-7707 (assq outer-var-7705 (car maps-7704)))) - (if b-7707 - (values (cdr b-7707) maps-7704) - (let ((inner-var-7709 + (gen-ref-6021 + src-6639 + var-6640 + (#{1-}# level-6641) + (cdr maps-6642))) + (lambda (outer-var-6643 outer-maps-6644) + (let ((b-6645 (assq outer-var-6643 (car maps-6642)))) + (if b-6645 + (values (cdr b-6645) maps-6642) + (let ((inner-var-6647 (gensym (string-append (symbol->string 'tmp) "-")))) (values - inner-var-7709 - (cons (cons (cons outer-var-7705 inner-var-7709) - (car maps-7704)) - outer-maps-7706))))))))))) - (gen-map-7397 - (lambda (e-7723 map-env-7724) - (let ((formals-7725 (map cdr map-env-7724)) - (actuals-7726 - (map (lambda (x-7728) (list 'ref (car x-7728))) - map-env-7724))) - (if (eq? (car e-7723) 'ref) - (car actuals-7726) + inner-var-6647 + (cons (cons (cons outer-var-6643 inner-var-6647) + (car maps-6642)) + outer-maps-6644))))))))))) + (gen-map-6023 + (lambda (e-6661 map-env-6662) + (let ((formals-6663 (map cdr map-env-6662)) + (actuals-6664 + (map (lambda (x-6666) (list 'ref (car x-6666))) + map-env-6662))) + (if (eq? (car e-6661) 'ref) + (car actuals-6664) (if (and-map - (lambda (x-7729) - (if (eq? (car x-7729) 'ref) - (memq (car (cdr x-7729)) formals-7725) + (lambda (x-6667) + (if (eq? (car x-6667) 'ref) + (memq (car (cdr x-6667)) formals-6663) #f)) - (cdr e-7723)) + (cdr e-6661)) (cons 'map - (cons (list 'primitive (car e-7723)) - (map (let ((r-7731 + (cons (list 'primitive (car e-6661)) + (map (let ((r-6669 (map cons - formals-7725 - actuals-7726))) - (lambda (x-7732) - (cdr (assq (car (cdr x-7732)) - r-7731)))) - (cdr e-7723)))) + formals-6663 + actuals-6664))) + (lambda (x-6670) + (cdr (assq (car (cdr x-6670)) + r-6669)))) + (cdr e-6661)))) (cons 'map - (cons (list 'lambda formals-7725 e-7723) - actuals-7726))))))) - (regen-7401 - (lambda (x-7734) - (let ((atom-key-7735 (car x-7734))) - (if (eqv? atom-key-7735 'ref) - (let ((name-7745 (car (cdr x-7734))) - (var-7746 (car (cdr x-7734)))) + (cons (list 'lambda formals-6663 e-6661) + actuals-6664))))))) + (regen-6027 + (lambda (x-6672) + (let ((atom-key-6673 (car x-6672))) + (if (eqv? atom-key-6673 'ref) + (let ((name-6683 (car (cdr x-6672))) + (var-6684 (car (cdr x-6672)))) (make-struct/no-tail (vector-ref %expanded-vtables 3) #f - name-7745 - var-7746)) - (if (eqv? atom-key-7735 'primitive) - (let ((name-7758 (car (cdr x-7734)))) - (if (equal? (module-name (current-module)) '(guile)) - (make-struct/no-tail - (vector-ref %expanded-vtables 7) - #f - name-7758) - (make-struct/no-tail - (vector-ref %expanded-vtables 5) - #f - '(guile) - name-7758 - #f))) - (if (eqv? atom-key-7735 'quote) - (let ((exp-7776 (car (cdr x-7734)))) + name-6683 + var-6684)) + (if (eqv? atom-key-6673 'primitive) + (let ((name-6695 (car (cdr x-6672)))) + (make-struct/no-tail + (vector-ref %expanded-vtables 2) + #f + name-6695)) + (if (eqv? atom-key-6673 'quote) + (let ((exp-6706 (car (cdr x-6672)))) (make-struct/no-tail (vector-ref %expanded-vtables 1) #f - exp-7776)) - (if (eqv? atom-key-7735 'lambda) - (if (list? (car (cdr x-7734))) - (let ((req-7787 (car (cdr x-7734))) - (vars-7789 (car (cdr x-7734))) - (exp-7791 - (regen-7401 (car (cdr (cdr x-7734)))))) - (let ((body-7796 + exp-6706)) + (if (eqv? atom-key-6673 'lambda) + (if (list? (car (cdr x-6672))) + (let ((req-6717 (car (cdr x-6672))) + (vars-6719 (car (cdr x-6672))) + (exp-6721 + (regen-6027 (car (cdr (cdr x-6672)))))) + (let ((body-6726 (make-struct/no-tail - (vector-ref %expanded-vtables 14) + (vector-ref %expanded-vtables 15) #f - req-7787 + req-6717 #f #f #f '() - vars-7789 - exp-7791 + vars-6719 + exp-6721 #f))) (make-struct/no-tail - (vector-ref %expanded-vtables 13) + (vector-ref %expanded-vtables 14) #f '() - body-7796))) - (error "how did we get here" x-7734)) - (let ((fun-exp-7812 - (let ((name-7821 (car x-7734))) - (if (equal? - (module-name (current-module)) - '(guile)) - (make-struct/no-tail - (vector-ref %expanded-vtables 7) - #f - name-7821) - (make-struct/no-tail - (vector-ref %expanded-vtables 5) - #f - '(guile) - name-7821 - #f)))) - (arg-exps-7813 (map regen-7401 (cdr x-7734)))) + body-6726))) + (error "how did we get here" x-6672)) + (let ((name-6742 (car x-6672)) + (args-6743 (map regen-6027 (cdr x-6672)))) (make-struct/no-tail - (vector-ref %expanded-vtables 11) + (vector-ref %expanded-vtables 12) #f - fun-exp-7812 - arg-exps-7813)))))))))) - (lambda (e-7402 r-7403 w-7404 s-7405 mod-7406) - (let ((e-7407 - (wrap-6578 - (begin - (if (if (pair? e-7402) s-7405 #f) - (set-source-properties! e-7402 s-7405)) - e-7402) - w-7404 - mod-7406))) - (let ((tmp-7409 ($sc-dispatch e-7407 '(_ any)))) - (if tmp-7409 - (@apply - (lambda (x-7434) - (call-with-values - (lambda () - (gen-syntax-7394 - e-7407 - x-7434 - r-7403 - '() - ellipsis?-6593 - mod-7406)) - (lambda (e-7488 maps-7489) (regen-7401 e-7488)))) - tmp-7409) - (syntax-violation - 'syntax - "bad `syntax' form" - e-7407))))))) - (global-extend-6547 + name-6742 + args-6743)))))))))) + (lambda (e-6028 r-6029 w-6030 s-6031 mod-6032) + (let ((e-6033 + (let ((x-6362 + (begin + (if (if (pair? e-6028) s-6031 #f) + (set-source-properties! e-6028 s-6031)) + e-6028))) + (if (if (null? (car w-6030)) (null? (cdr w-6030)) #f) + x-6362 + (if (if (vector? x-6362) + (if (= (vector-length x-6362) 4) + (eq? (vector-ref x-6362 0) 'syntax-object) + #f) + #f) + (let ((expression-6394 (vector-ref x-6362 1)) + (wrap-6395 + (let ((w2-6403 (vector-ref x-6362 2))) + (let ((m1-6404 (car w-6030)) + (s1-6405 (cdr w-6030))) + (if (null? m1-6404) + (if (null? s1-6405) + w2-6403 + (cons (car w2-6403) + (let ((m2-6420 (cdr w2-6403))) + (if (null? m2-6420) + s1-6405 + (append + s1-6405 + m2-6420))))) + (cons (let ((m2-6428 (car w2-6403))) + (if (null? m2-6428) + m1-6404 + (append m1-6404 m2-6428))) + (let ((m2-6436 (cdr w2-6403))) + (if (null? m2-6436) + s1-6405 + (append + s1-6405 + m2-6436)))))))) + (module-6396 (vector-ref x-6362 3))) + (vector + 'syntax-object + expression-6394 + wrap-6395 + module-6396)) + (if (null? x-6362) + x-6362 + (vector + 'syntax-object + x-6362 + w-6030 + mod-6032))))))) + (let ((tmp-6034 e-6033)) + (let ((tmp-6035 ($sc-dispatch tmp-6034 '(_ any)))) + (if tmp-6035 + (@apply + (lambda (x-6083) + (call-with-values + (lambda () + (gen-syntax-6020 + e-6033 + x-6083 + r-6029 + '() + ellipsis?-4594 + mod-6032)) + (lambda (e-6160 maps-6161) (regen-6027 e-6160)))) + tmp-6035) + (syntax-violation + 'syntax + "bad `syntax' form" + e-6033)))))))) + (global-extend-4548 'core 'lambda - (lambda (e-8009 r-8010 w-8011 s-8012 mod-8013) - (let ((tmp-8015 - ($sc-dispatch e-8009 '(_ any any . each-any)))) - (if tmp-8015 + (lambda (e-6974 r-6975 w-6976 s-6977 mod-6978) + (let ((tmp-6980 + ($sc-dispatch e-6974 '(_ any any . each-any)))) + (if tmp-6980 (@apply - (lambda (args-8019 e1-8020 e2-8021) + (lambda (args-6984 e1-6985 e2-6986) (call-with-values - (lambda () (lambda-formals-6594 args-8019)) - (lambda (req-8024 opt-8025 rest-8026 kw-8027) + (lambda () (lambda-formals-4595 args-6984)) + (lambda (req-6989 opt-6990 rest-6991 kw-6992) (letrec* - ((lp-8028 - (lambda (body-8031 meta-8032) - (let ((tmp-8034 + ((lp-6993 + (lambda (body-6996 meta-6997) + (let ((tmp-6999 ($sc-dispatch - body-8031 + body-6996 '(any any . each-any)))) - (if (if tmp-8034 + (if (if tmp-6999 (@apply - (lambda (docstring-8038 e1-8039 e2-8040) + (lambda (docstring-7003 e1-7004 e2-7005) (string? - (syntax->datum docstring-8038))) - tmp-8034) + (syntax->datum docstring-7003))) + tmp-6999) #f) (@apply - (lambda (docstring-8041 e1-8042 e2-8043) - (lp-8028 - (cons e1-8042 e2-8043) + (lambda (docstring-7006 e1-7007 e2-7008) + (lp-6993 + (cons e1-7007 e2-7008) (append - meta-8032 + meta-6997 (list (cons 'documentation (syntax->datum - docstring-8041)))))) - tmp-8034) - (let ((tmp-8044 + docstring-7006)))))) + tmp-6999) + (let ((tmp-7009 ($sc-dispatch - body-8031 + body-6996 '(#(vector #(each (any . any))) any . each-any)))) - (if tmp-8044 + (if tmp-7009 (@apply - (lambda (k-8048 v-8049 e1-8050 e2-8051) - (lp-8028 - (cons e1-8050 e2-8051) + (lambda (k-7013 v-7014 e1-7015 e2-7016) + (lp-6993 + (cons e1-7015 e2-7016) (append - meta-8032 + meta-6997 (syntax->datum - (map cons k-8048 v-8049))))) - tmp-8044) - (expand-simple-lambda-6595 - e-8009 - r-8010 - w-8011 - s-8012 - mod-8013 - req-8024 - rest-8026 - meta-8032 - body-8031)))))))) - (lp-8028 (cons e1-8020 e2-8021) '()))))) - tmp-8015) - (syntax-violation 'lambda "bad lambda" e-8009))))) - (global-extend-6547 + (map cons k-7013 v-7014))))) + tmp-7009) + (expand-simple-lambda-4596 + e-6974 + r-6975 + w-6976 + s-6977 + mod-6978 + req-6989 + rest-6991 + meta-6997 + body-6996)))))))) + (lp-6993 (cons e1-6985 e2-6986) '()))))) + tmp-6980) + (syntax-violation 'lambda "bad lambda" e-6974))))) + (global-extend-4548 'core 'lambda* - (lambda (e-8340 r-8341 w-8342 s-8343 mod-8344) - (let ((tmp-8346 - ($sc-dispatch e-8340 '(_ any any . each-any)))) - (if tmp-8346 + (lambda (e-7391 r-7392 w-7393 s-7394 mod-7395) + (let ((tmp-7397 + ($sc-dispatch e-7391 '(_ any any . each-any)))) + (if tmp-7397 (@apply - (lambda (args-8350 e1-8351 e2-8352) + (lambda (args-7401 e1-7402 e2-7403) (call-with-values (lambda () - (expand-lambda-case-6597 - e-8340 - r-8341 - w-8342 - s-8343 - mod-8344 - lambda*-formals-6596 - (list (cons args-8350 (cons e1-8351 e2-8352))))) - (lambda (meta-8355 lcase-8356) + (expand-lambda-case-4598 + e-7391 + r-7392 + w-7393 + s-7394 + mod-7395 + lambda*-formals-4597 + (list (cons args-7401 (cons e1-7402 e2-7403))))) + (lambda (meta-7406 lcase-7407) (make-struct/no-tail - (vector-ref %expanded-vtables 13) - s-8343 - meta-8355 - lcase-8356)))) - tmp-8346) - (syntax-violation 'lambda "bad lambda*" e-8340))))) - (global-extend-6547 + (vector-ref %expanded-vtables 14) + s-7394 + meta-7406 + lcase-7407)))) + tmp-7397) + (syntax-violation 'lambda "bad lambda*" e-7391))))) + (global-extend-4548 'core 'case-lambda - (lambda (e-8526 r-8527 w-8528 s-8529 mod-8530) - (let ((tmp-8532 + (lambda (e-7570 r-7571 w-7572 s-7573 mod-7574) + (let ((tmp-7576 ($sc-dispatch - e-8526 + e-7570 '(_ (any any . each-any) . #(each (any any . each-any)))))) - (if tmp-8532 + (if tmp-7576 (@apply - (lambda (args-8536 - e1-8537 - e2-8538 - args*-8539 - e1*-8540 - e2*-8541) + (lambda (args-7580 + e1-7581 + e2-7582 + args*-7583 + e1*-7584 + e2*-7585) (call-with-values (lambda () - (expand-lambda-case-6597 - e-8526 - r-8527 - w-8528 - s-8529 - mod-8530 - lambda-formals-6594 - (cons (cons args-8536 (cons e1-8537 e2-8538)) - (map (lambda (tmp-5448-8544 - tmp-5447-8545 - tmp-5446-8546) - (cons tmp-5446-8546 - (cons tmp-5447-8545 tmp-5448-8544))) - e2*-8541 - e1*-8540 - args*-8539)))) - (lambda (meta-8547 lcase-8548) + (expand-lambda-case-4598 + e-7570 + r-7571 + w-7572 + s-7573 + mod-7574 + lambda-formals-4595 + (cons (cons args-7580 (cons e1-7581 e2-7582)) + (map (lambda (tmp-3460-7588 + tmp-3459-7589 + tmp-3458-7590) + (cons tmp-3458-7590 + (cons tmp-3459-7589 tmp-3460-7588))) + e2*-7585 + e1*-7584 + args*-7583)))) + (lambda (meta-7591 lcase-7592) (make-struct/no-tail - (vector-ref %expanded-vtables 13) - s-8529 - meta-8547 - lcase-8548)))) - tmp-8532) + (vector-ref %expanded-vtables 14) + s-7573 + meta-7591 + lcase-7592)))) + tmp-7576) (syntax-violation 'case-lambda "bad case-lambda" - e-8526))))) - (global-extend-6547 + e-7570))))) + (global-extend-4548 'core 'case-lambda* - (lambda (e-8710 r-8711 w-8712 s-8713 mod-8714) - (let ((tmp-8716 + (lambda (e-7761 r-7762 w-7763 s-7764 mod-7765) + (let ((tmp-7767 ($sc-dispatch - e-8710 + e-7761 '(_ (any any . each-any) . #(each (any any . each-any)))))) - (if tmp-8716 + (if tmp-7767 (@apply - (lambda (args-8720 - e1-8721 - e2-8722 - args*-8723 - e1*-8724 - e2*-8725) + (lambda (args-7771 + e1-7772 + e2-7773 + args*-7774 + e1*-7775 + e2*-7776) (call-with-values (lambda () - (expand-lambda-case-6597 - e-8710 - r-8711 - w-8712 - s-8713 - mod-8714 - lambda*-formals-6596 - (cons (cons args-8720 (cons e1-8721 e2-8722)) - (map (lambda (tmp-5483-8728 - tmp-5482-8729 - tmp-5481-8730) - (cons tmp-5481-8730 - (cons tmp-5482-8729 tmp-5483-8728))) - e2*-8725 - e1*-8724 - args*-8723)))) - (lambda (meta-8731 lcase-8732) + (expand-lambda-case-4598 + e-7761 + r-7762 + w-7763 + s-7764 + mod-7765 + lambda*-formals-4597 + (cons (cons args-7771 (cons e1-7772 e2-7773)) + (map (lambda (tmp-3495-7779 + tmp-3494-7780 + tmp-3493-7781) + (cons tmp-3493-7781 + (cons tmp-3494-7780 tmp-3495-7779))) + e2*-7776 + e1*-7775 + args*-7774)))) + (lambda (meta-7782 lcase-7783) (make-struct/no-tail - (vector-ref %expanded-vtables 13) - s-8713 - meta-8731 - lcase-8732)))) - tmp-8716) + (vector-ref %expanded-vtables 14) + s-7764 + meta-7782 + lcase-7783)))) + tmp-7767) (syntax-violation 'case-lambda "bad case-lambda*" - e-8710))))) - (global-extend-6547 + e-7761))))) + (global-extend-4548 'core 'let (letrec* - ((expand-let-8923 - (lambda (e-9072 - r-9073 - w-9074 - s-9075 - mod-9076 - constructor-9077 - ids-9078 - vals-9079 - exps-9080) - (if (not (valid-bound-ids?-6575 ids-9078)) + ((expand-let-7991 + (lambda (e-8201 + r-8202 + w-8203 + s-8204 + mod-8205 + constructor-8206 + ids-8207 + vals-8208 + exps-8209) + (if (not (valid-bound-ids?-4576 ids-8207)) (syntax-violation 'let "duplicate bound variable" - e-9072) - (let ((labels-9158 (gen-labels-6552 ids-9078)) - (new-vars-9159 (map gen-var-6599 ids-9078))) - (let ((nw-9160 - (make-binding-wrap-6563 - ids-9078 - labels-9158 - w-9074)) - (nr-9161 - (extend-var-env-6544 - labels-9158 - new-vars-9159 - r-9073))) - (constructor-9077 - s-9075 - (map syntax->datum ids-9078) - new-vars-9159 - (map (lambda (x-9178) - (expand-6585 x-9178 r-9073 w-9074 mod-9076)) - vals-9079) - (expand-body-6589 - exps-9080 - (source-wrap-6579 e-9072 nw-9160 s-9075 mod-9076) - nr-9161 - nw-9160 - mod-9076)))))))) - (lambda (e-8924 r-8925 w-8926 s-8927 mod-8928) - (let ((tmp-8930 + e-8201) + (let ((labels-8294 (gen-labels-4553 ids-8207)) + (new-vars-8295 (map gen-var-4600 ids-8207))) + (let ((nw-8296 + (make-binding-wrap-4564 + ids-8207 + labels-8294 + w-8203)) + (nr-8297 + (extend-var-env-4546 + labels-8294 + new-vars-8295 + r-8202))) + (constructor-8206 + s-8204 + (map syntax->datum ids-8207) + new-vars-8295 + (map (lambda (x-8314) + (expand-4586 x-8314 r-8202 w-8203 mod-8205)) + vals-8208) + (expand-body-4590 + exps-8209 + (source-wrap-4580 e-8201 nw-8296 s-8204 mod-8205) + nr-8297 + nw-8296 + mod-8205)))))))) + (lambda (e-7992 r-7993 w-7994 s-7995 mod-7996) + (let ((tmp-7998 ($sc-dispatch - e-8924 + e-7992 '(_ #(each (any any)) any . each-any)))) - (if (if tmp-8930 + (if (if tmp-7998 (@apply - (lambda (id-8934 val-8935 e1-8936 e2-8937) - (and-map id?-6549 id-8934)) - tmp-8930) + (lambda (id-8002 val-8003 e1-8004 e2-8005) + (and-map id?-4550 id-8002)) + tmp-7998) #f) (@apply - (lambda (id-8953 val-8954 e1-8955 e2-8956) - (expand-let-8923 - e-8924 - r-8925 - w-8926 - s-8927 - mod-8928 - build-let-6531 - id-8953 - val-8954 - (cons e1-8955 e2-8956))) - tmp-8930) - (let ((tmp-8986 + (lambda (id-8021 val-8022 e1-8023 e2-8024) + (expand-let-7991 + e-7992 + r-7993 + w-7994 + s-7995 + mod-7996 + (lambda (src-8028 + ids-8029 + vars-8030 + val-exps-8031 + body-exp-8032) + (begin + (for-each + maybe-name-value!-4515 + ids-8029 + val-exps-8031) + (if (null? vars-8030) + body-exp-8032 + (make-struct/no-tail + (vector-ref %expanded-vtables 16) + src-8028 + ids-8029 + vars-8030 + val-exps-8031 + body-exp-8032)))) + id-8021 + val-8022 + (cons e1-8023 e2-8024))) + tmp-7998) + (let ((tmp-8039 ($sc-dispatch - e-8924 + e-7992 '(_ any #(each (any any)) any . each-any)))) - (if (if tmp-8986 + (if (if tmp-8039 (@apply - (lambda (f-8990 id-8991 val-8992 e1-8993 e2-8994) - (if (if (symbol? f-8990) + (lambda (f-8043 id-8044 val-8045 e1-8046 e2-8047) + (if (if (symbol? f-8043) #t - (if (if (vector? f-8990) - (if (= (vector-length f-8990) 4) - (eq? (vector-ref f-8990 0) + (if (if (vector? f-8043) + (if (= (vector-length f-8043) 4) + (eq? (vector-ref f-8043 0) 'syntax-object) #f) #f) - (symbol? (vector-ref f-8990 1)) + (symbol? (vector-ref f-8043 1)) #f)) - (and-map id?-6549 id-8991) + (and-map id?-4550 id-8044) #f)) - tmp-8986) + tmp-8039) #f) (@apply - (lambda (f-9036 id-9037 val-9038 e1-9039 e2-9040) - (expand-let-8923 - e-8924 - r-8925 - w-8926 - s-8927 - mod-8928 - build-named-let-6532 - (cons f-9036 id-9037) - val-9038 - (cons e1-9039 e2-9040))) - tmp-8986) + (lambda (f-8089 id-8090 val-8091 e1-8092 e2-8093) + (expand-let-7991 + e-7992 + r-7993 + w-7994 + s-7995 + mod-7996 + build-named-let-4534 + (cons f-8089 id-8090) + val-8091 + (cons e1-8092 e2-8093))) + tmp-8039) (syntax-violation 'let "bad let" - (wrap-6578 - (begin - (if (if (pair? e-8924) s-8927 #f) - (set-source-properties! e-8924 s-8927)) - e-8924) - w-8926 - mod-8928))))))))) - (global-extend-6547 + (let ((x-8106 + (begin + (if (if (pair? e-7992) s-7995 #f) + (set-source-properties! e-7992 s-7995)) + e-7992))) + (if (if (null? (car w-7994)) (null? (cdr w-7994)) #f) + x-8106 + (if (if (vector? x-8106) + (if (= (vector-length x-8106) 4) + (eq? (vector-ref x-8106 0) 'syntax-object) + #f) + #f) + (let ((expression-8138 (vector-ref x-8106 1)) + (wrap-8139 + (let ((w2-8147 (vector-ref x-8106 2))) + (let ((m1-8148 (car w-7994)) + (s1-8149 (cdr w-7994))) + (if (null? m1-8148) + (if (null? s1-8149) + w2-8147 + (cons (car w2-8147) + (let ((m2-8164 + (cdr w2-8147))) + (if (null? m2-8164) + s1-8149 + (append + s1-8149 + m2-8164))))) + (cons (let ((m2-8172 (car w2-8147))) + (if (null? m2-8172) + m1-8148 + (append m1-8148 m2-8172))) + (let ((m2-8180 (cdr w2-8147))) + (if (null? m2-8180) + s1-8149 + (append + s1-8149 + m2-8180)))))))) + (module-8140 (vector-ref x-8106 3))) + (vector + 'syntax-object + expression-8138 + wrap-8139 + module-8140)) + (if (null? x-8106) + x-8106 + (vector + 'syntax-object + x-8106 + w-7994 + mod-7996))))))))))))) + (global-extend-4548 'core 'letrec - (lambda (e-9590 r-9591 w-9592 s-9593 mod-9594) - (let ((tmp-9596 + (lambda (e-8744 r-8745 w-8746 s-8747 mod-8748) + (let ((tmp-8750 ($sc-dispatch - e-9590 + e-8744 '(_ #(each (any any)) any . each-any)))) - (if (if tmp-9596 + (if (if tmp-8750 (@apply - (lambda (id-9600 val-9601 e1-9602 e2-9603) - (and-map id?-6549 id-9600)) - tmp-9596) + (lambda (id-8754 val-8755 e1-8756 e2-8757) + (and-map id?-4550 id-8754)) + tmp-8750) #f) (@apply - (lambda (id-9619 val-9620 e1-9621 e2-9622) - (if (not (valid-bound-ids?-6575 id-9619)) + (lambda (id-8773 val-8774 e1-8775 e2-8776) + (if (not (valid-bound-ids?-4576 id-8773)) (syntax-violation 'letrec "duplicate bound variable" - e-9590) - (let ((labels-9712 (gen-labels-6552 id-9619)) - (new-vars-9713 (map gen-var-6599 id-9619))) - (let ((w-9714 - (make-binding-wrap-6563 - id-9619 - labels-9712 - w-9592)) - (r-9715 - (extend-var-env-6544 - labels-9712 - new-vars-9713 - r-9591))) - (build-letrec-6533 - s-9593 + e-8744) + (let ((labels-8873 (gen-labels-4553 id-8773)) + (new-vars-8874 (map gen-var-4600 id-8773))) + (let ((w-8875 + (make-binding-wrap-4564 + id-8773 + labels-8873 + w-8746)) + (r-8876 + (extend-var-env-4546 + labels-8873 + new-vars-8874 + r-8745))) + (build-letrec-4535 + s-8747 #f - (map syntax->datum id-9619) - new-vars-9713 - (map (lambda (x-9800) - (expand-6585 x-9800 r-9715 w-9714 mod-9594)) - val-9620) - (expand-body-6589 - (cons e1-9621 e2-9622) - (wrap-6578 - (begin - (if (if (pair? e-9590) s-9593 #f) - (set-source-properties! e-9590 s-9593)) - e-9590) - w-9714 - mod-9594) - r-9715 - w-9714 - mod-9594)))))) - tmp-9596) + (map syntax->datum id-8773) + new-vars-8874 + (map (lambda (x-8953) + (expand-4586 x-8953 r-8876 w-8875 mod-8748)) + val-8774) + (expand-body-4590 + (cons e1-8775 e2-8776) + (let ((x-9015 + (begin + (if (if (pair? e-8744) s-8747 #f) + (set-source-properties! e-8744 s-8747)) + e-8744))) + (if (if (null? (car w-8875)) + (null? (cdr w-8875)) + #f) + x-9015 + (if (if (vector? x-9015) + (if (= (vector-length x-9015) 4) + (eq? (vector-ref x-9015 0) + 'syntax-object) + #f) + #f) + (let ((expression-9047 (vector-ref x-9015 1)) + (wrap-9048 + (let ((w2-9056 + (vector-ref x-9015 2))) + (let ((m1-9057 (car w-8875)) + (s1-9058 (cdr w-8875))) + (if (null? m1-9057) + (if (null? s1-9058) + w2-9056 + (cons (car w2-9056) + (let ((m2-9073 + (cdr w2-9056))) + (if (null? m2-9073) + s1-9058 + (append + s1-9058 + m2-9073))))) + (cons (let ((m2-9081 + (car w2-9056))) + (if (null? m2-9081) + m1-9057 + (append + m1-9057 + m2-9081))) + (let ((m2-9089 + (cdr w2-9056))) + (if (null? m2-9089) + s1-9058 + (append + s1-9058 + m2-9089)))))))) + (module-9049 (vector-ref x-9015 3))) + (vector + 'syntax-object + expression-9047 + wrap-9048 + module-9049)) + (if (null? x-9015) + x-9015 + (vector + 'syntax-object + x-9015 + w-8875 + mod-8748))))) + r-8876 + w-8875 + mod-8748)))))) + tmp-8750) (syntax-violation 'letrec "bad letrec" - (wrap-6578 - (begin - (if (if (pair? e-9590) s-9593 #f) - (set-source-properties! e-9590 s-9593)) - e-9590) - w-9592 - mod-9594)))))) - (global-extend-6547 + (let ((x-9300 + (begin + (if (if (pair? e-8744) s-8747 #f) + (set-source-properties! e-8744 s-8747)) + e-8744))) + (if (if (null? (car w-8746)) (null? (cdr w-8746)) #f) + x-9300 + (if (if (vector? x-9300) + (if (= (vector-length x-9300) 4) + (eq? (vector-ref x-9300 0) 'syntax-object) + #f) + #f) + (let ((expression-9332 (vector-ref x-9300 1)) + (wrap-9333 + (let ((w2-9341 (vector-ref x-9300 2))) + (let ((m1-9342 (car w-8746)) + (s1-9343 (cdr w-8746))) + (if (null? m1-9342) + (if (null? s1-9343) + w2-9341 + (cons (car w2-9341) + (let ((m2-9358 (cdr w2-9341))) + (if (null? m2-9358) + s1-9343 + (append s1-9343 m2-9358))))) + (cons (let ((m2-9366 (car w2-9341))) + (if (null? m2-9366) + m1-9342 + (append m1-9342 m2-9366))) + (let ((m2-9374 (cdr w2-9341))) + (if (null? m2-9374) + s1-9343 + (append s1-9343 m2-9374)))))))) + (module-9334 (vector-ref x-9300 3))) + (vector + 'syntax-object + expression-9332 + wrap-9333 + module-9334)) + (if (null? x-9300) + x-9300 + (vector 'syntax-object x-9300 w-8746 mod-8748)))))))))) + (global-extend-4548 'core 'letrec* - (lambda (e-10195 r-10196 w-10197 s-10198 mod-10199) - (let ((tmp-10201 + (lambda (e-9525 r-9526 w-9527 s-9528 mod-9529) + (let ((tmp-9531 ($sc-dispatch - e-10195 + e-9525 '(_ #(each (any any)) any . each-any)))) - (if (if tmp-10201 + (if (if tmp-9531 (@apply - (lambda (id-10205 val-10206 e1-10207 e2-10208) - (and-map id?-6549 id-10205)) - tmp-10201) + (lambda (id-9535 val-9536 e1-9537 e2-9538) + (and-map id?-4550 id-9535)) + tmp-9531) #f) (@apply - (lambda (id-10224 val-10225 e1-10226 e2-10227) - (if (not (valid-bound-ids?-6575 id-10224)) + (lambda (id-9554 val-9555 e1-9556 e2-9557) + (if (not (valid-bound-ids?-4576 id-9554)) (syntax-violation 'letrec* "duplicate bound variable" - e-10195) - (let ((labels-10317 (gen-labels-6552 id-10224)) - (new-vars-10318 (map gen-var-6599 id-10224))) - (let ((w-10319 - (make-binding-wrap-6563 - id-10224 - labels-10317 - w-10197)) - (r-10320 - (extend-var-env-6544 - labels-10317 - new-vars-10318 - r-10196))) - (build-letrec-6533 - s-10198 + e-9525) + (let ((labels-9654 (gen-labels-4553 id-9554)) + (new-vars-9655 (map gen-var-4600 id-9554))) + (let ((w-9656 + (make-binding-wrap-4564 + id-9554 + labels-9654 + w-9527)) + (r-9657 + (extend-var-env-4546 + labels-9654 + new-vars-9655 + r-9526))) + (build-letrec-4535 + s-9528 #t - (map syntax->datum id-10224) - new-vars-10318 - (map (lambda (x-10405) - (expand-6585 - x-10405 - r-10320 - w-10319 - mod-10199)) - val-10225) - (expand-body-6589 - (cons e1-10226 e2-10227) - (wrap-6578 - (begin - (if (if (pair? e-10195) s-10198 #f) - (set-source-properties! e-10195 s-10198)) - e-10195) - w-10319 - mod-10199) - r-10320 - w-10319 - mod-10199)))))) - tmp-10201) + (map syntax->datum id-9554) + new-vars-9655 + (map (lambda (x-9734) + (expand-4586 x-9734 r-9657 w-9656 mod-9529)) + val-9555) + (expand-body-4590 + (cons e1-9556 e2-9557) + (let ((x-9796 + (begin + (if (if (pair? e-9525) s-9528 #f) + (set-source-properties! e-9525 s-9528)) + e-9525))) + (if (if (null? (car w-9656)) + (null? (cdr w-9656)) + #f) + x-9796 + (if (if (vector? x-9796) + (if (= (vector-length x-9796) 4) + (eq? (vector-ref x-9796 0) + 'syntax-object) + #f) + #f) + (let ((expression-9828 (vector-ref x-9796 1)) + (wrap-9829 + (let ((w2-9837 + (vector-ref x-9796 2))) + (let ((m1-9838 (car w-9656)) + (s1-9839 (cdr w-9656))) + (if (null? m1-9838) + (if (null? s1-9839) + w2-9837 + (cons (car w2-9837) + (let ((m2-9854 + (cdr w2-9837))) + (if (null? m2-9854) + s1-9839 + (append + s1-9839 + m2-9854))))) + (cons (let ((m2-9862 + (car w2-9837))) + (if (null? m2-9862) + m1-9838 + (append + m1-9838 + m2-9862))) + (let ((m2-9870 + (cdr w2-9837))) + (if (null? m2-9870) + s1-9839 + (append + s1-9839 + m2-9870)))))))) + (module-9830 (vector-ref x-9796 3))) + (vector + 'syntax-object + expression-9828 + wrap-9829 + module-9830)) + (if (null? x-9796) + x-9796 + (vector + 'syntax-object + x-9796 + w-9656 + mod-9529))))) + r-9657 + w-9656 + mod-9529)))))) + tmp-9531) (syntax-violation 'letrec* "bad letrec*" - (wrap-6578 - (begin - (if (if (pair? e-10195) s-10198 #f) - (set-source-properties! e-10195 s-10198)) - e-10195) - w-10197 - mod-10199)))))) - (global-extend-6547 + (let ((x-10081 + (begin + (if (if (pair? e-9525) s-9528 #f) + (set-source-properties! e-9525 s-9528)) + e-9525))) + (if (if (null? (car w-9527)) (null? (cdr w-9527)) #f) + x-10081 + (if (if (vector? x-10081) + (if (= (vector-length x-10081) 4) + (eq? (vector-ref x-10081 0) 'syntax-object) + #f) + #f) + (let ((expression-10113 (vector-ref x-10081 1)) + (wrap-10114 + (let ((w2-10122 (vector-ref x-10081 2))) + (let ((m1-10123 (car w-9527)) + (s1-10124 (cdr w-9527))) + (if (null? m1-10123) + (if (null? s1-10124) + w2-10122 + (cons (car w2-10122) + (let ((m2-10139 (cdr w2-10122))) + (if (null? m2-10139) + s1-10124 + (append s1-10124 m2-10139))))) + (cons (let ((m2-10147 (car w2-10122))) + (if (null? m2-10147) + m1-10123 + (append m1-10123 m2-10147))) + (let ((m2-10155 (cdr w2-10122))) + (if (null? m2-10155) + s1-10124 + (append s1-10124 m2-10155)))))))) + (module-10115 (vector-ref x-10081 3))) + (vector + 'syntax-object + expression-10113 + wrap-10114 + module-10115)) + (if (null? x-10081) + x-10081 + (vector + 'syntax-object + x-10081 + w-9527 + mod-9529)))))))))) + (global-extend-4548 'core 'set! - (lambda (e-10839 r-10840 w-10841 s-10842 mod-10843) - (let ((tmp-10845 ($sc-dispatch e-10839 '(_ any any)))) - (if (if tmp-10845 + (lambda (e-10314 r-10315 w-10316 s-10317 mod-10318) + (let ((tmp-10320 ($sc-dispatch e-10314 '(_ any any)))) + (if (if tmp-10320 (@apply - (lambda (id-10849 val-10850) - (if (symbol? id-10849) + (lambda (id-10324 val-10325) + (if (symbol? id-10324) #t - (if (if (vector? id-10849) - (if (= (vector-length id-10849) 4) - (eq? (vector-ref id-10849 0) 'syntax-object) + (if (if (vector? id-10324) + (if (= (vector-length id-10324) 4) + (eq? (vector-ref id-10324 0) 'syntax-object) #f) #f) - (symbol? (vector-ref id-10849 1)) + (symbol? (vector-ref id-10324 1)) #f))) - tmp-10845) + tmp-10320) #f) (@apply - (lambda (id-10877 val-10878) - (let ((n-10879 (id-var-name-6568 id-10877 w-10841)) - (id-mod-10880 - (if (if (vector? id-10877) - (if (= (vector-length id-10877) 4) - (eq? (vector-ref id-10877 0) 'syntax-object) - #f) - #f) - (vector-ref id-10877 3) - mod-10843))) - (let ((b-10881 - (let ((t-10922 (assq n-10879 r-10840))) - (if t-10922 - (cdr t-10922) - (if (symbol? n-10879) - (let ((t-10927 - (get-global-definition-hook-6512 - n-10879 - id-mod-10880))) - (if t-10927 t-10927 '(global))) - '(displaced-lexical)))))) - (let ((atom-key-10882 (car b-10881))) - (if (eqv? atom-key-10882 'lexical) - (build-lexical-assignment-6520 - s-10842 - (syntax->datum id-10877) - (cdr b-10881) - (expand-6585 val-10878 r-10840 w-10841 mod-10843)) - (if (eqv? atom-key-10882 'global) - (build-global-assignment-6523 - s-10842 - n-10879 - (expand-6585 val-10878 r-10840 w-10841 mod-10843) - id-mod-10880) - (if (eqv? atom-key-10882 'macro) - (let ((p-11241 (cdr b-10881))) - (if (procedure-property - p-11241 - 'variable-transformer) - (expand-6585 - (expand-macro-6588 - p-11241 - e-10839 - r-10840 - w-10841 - s-10842 - #f - mod-10843) - r-10840 - '(()) - mod-10843) - (syntax-violation - 'set! - "not a variable transformer" - (wrap-6578 e-10839 w-10841 mod-10843) - (wrap-6578 - id-10877 - w-10841 - id-mod-10880)))) - (if (eqv? atom-key-10882 'displaced-lexical) - (syntax-violation - 'set! - "identifier out of context" - (wrap-6578 id-10877 w-10841 mod-10843)) - (syntax-violation - 'set! - "bad set!" - (wrap-6578 - (begin - (if (if (pair? e-10839) s-10842 #f) - (set-source-properties! - e-10839 - s-10842)) - e-10839) - w-10841 - mod-10843)))))))))) - tmp-10845) - (let ((tmp-11336 - ($sc-dispatch e-10839 '(_ (any . each-any) any)))) - (if tmp-11336 + (lambda (id-10352 val-10353) + (call-with-values + (lambda () + (resolve-identifier-4571 + id-10352 + w-10316 + r-10315 + mod-10318 + #t)) + (lambda (type-10356 value-10357 id-mod-10358) + (if (eqv? type-10356 'lexical) + (build-lexical-assignment-4521 + s-10317 + (syntax->datum id-10352) + value-10357 + (expand-4586 val-10353 r-10315 w-10316 mod-10318)) + (if (eqv? type-10356 'global) + (build-global-assignment-4524 + s-10317 + value-10357 + (expand-4586 val-10353 r-10315 w-10316 mod-10318) + id-mod-10358) + (if (eqv? type-10356 'macro) + (if (procedure-property + value-10357 + 'variable-transformer) + (expand-4586 + (expand-macro-4589 + value-10357 + e-10314 + r-10315 + w-10316 + s-10317 + #f + mod-10318) + r-10315 + '(()) + mod-10318) + (syntax-violation + 'set! + "not a variable transformer" + (if (if (null? (car w-10316)) + (null? (cdr w-10316)) + #f) + e-10314 + (if (if (vector? e-10314) + (if (= (vector-length e-10314) 4) + (eq? (vector-ref e-10314 0) + 'syntax-object) + #f) + #f) + (let ((expression-10798 + (vector-ref e-10314 1)) + (wrap-10799 + (let ((w2-10809 + (vector-ref e-10314 2))) + (let ((m1-10810 (car w-10316)) + (s1-10811 (cdr w-10316))) + (if (null? m1-10810) + (if (null? s1-10811) + w2-10809 + (cons (car w2-10809) + (let ((m2-10828 + (cdr w2-10809))) + (if (null? m2-10828) + s1-10811 + (append + s1-10811 + m2-10828))))) + (cons (let ((m2-10836 + (car w2-10809))) + (if (null? m2-10836) + m1-10810 + (append + m1-10810 + m2-10836))) + (let ((m2-10844 + (cdr w2-10809))) + (if (null? m2-10844) + s1-10811 + (append + s1-10811 + m2-10844)))))))) + (module-10800 + (vector-ref e-10314 3))) + (vector + 'syntax-object + expression-10798 + wrap-10799 + module-10800)) + (if (null? e-10314) + e-10314 + (vector + 'syntax-object + e-10314 + w-10316 + mod-10318)))) + (if (if (null? (car w-10316)) + (null? (cdr w-10316)) + #f) + id-10352 + (if (if (vector? id-10352) + (if (= (vector-length id-10352) 4) + (eq? (vector-ref id-10352 0) + 'syntax-object) + #f) + #f) + (let ((expression-10896 + (vector-ref id-10352 1)) + (wrap-10897 + (let ((w2-10907 + (vector-ref id-10352 2))) + (let ((m1-10908 (car w-10316)) + (s1-10909 (cdr w-10316))) + (if (null? m1-10908) + (if (null? s1-10909) + w2-10907 + (cons (car w2-10907) + (let ((m2-10926 + (cdr w2-10907))) + (if (null? m2-10926) + s1-10909 + (append + s1-10909 + m2-10926))))) + (cons (let ((m2-10934 + (car w2-10907))) + (if (null? m2-10934) + m1-10908 + (append + m1-10908 + m2-10934))) + (let ((m2-10942 + (cdr w2-10907))) + (if (null? m2-10942) + s1-10909 + (append + s1-10909 + m2-10942)))))))) + (module-10898 + (vector-ref id-10352 3))) + (vector + 'syntax-object + expression-10896 + wrap-10897 + module-10898)) + (if (null? id-10352) + id-10352 + (vector + 'syntax-object + id-10352 + w-10316 + id-mod-10358)))))) + (if (eqv? type-10356 'displaced-lexical) + (syntax-violation + 'set! + "identifier out of context" + (if (if (null? (car w-10316)) + (null? (cdr w-10316)) + #f) + id-10352 + (if (if (vector? id-10352) + (if (= (vector-length id-10352) 4) + (eq? (vector-ref id-10352 0) + 'syntax-object) + #f) + #f) + (let ((expression-10997 + (vector-ref id-10352 1)) + (wrap-10998 + (let ((w2-11008 + (vector-ref id-10352 2))) + (let ((m1-11009 (car w-10316)) + (s1-11010 (cdr w-10316))) + (if (null? m1-11009) + (if (null? s1-11010) + w2-11008 + (cons (car w2-11008) + (let ((m2-11027 + (cdr w2-11008))) + (if (null? m2-11027) + s1-11010 + (append + s1-11010 + m2-11027))))) + (cons (let ((m2-11035 + (car w2-11008))) + (if (null? m2-11035) + m1-11009 + (append + m1-11009 + m2-11035))) + (let ((m2-11043 + (cdr w2-11008))) + (if (null? m2-11043) + s1-11010 + (append + s1-11010 + m2-11043)))))))) + (module-10999 + (vector-ref id-10352 3))) + (vector + 'syntax-object + expression-10997 + wrap-10998 + module-10999)) + (if (null? id-10352) + id-10352 + (vector + 'syntax-object + id-10352 + w-10316 + mod-10318))))) + (syntax-violation + 'set! + "bad set!" + (let ((x-11075 + (begin + (if (if (pair? e-10314) s-10317 #f) + (set-source-properties! + e-10314 + s-10317)) + e-10314))) + (if (if (null? (car w-10316)) + (null? (cdr w-10316)) + #f) + x-11075 + (if (if (vector? x-11075) + (if (= (vector-length x-11075) 4) + (eq? (vector-ref x-11075 0) + 'syntax-object) + #f) + #f) + (let ((expression-11107 + (vector-ref x-11075 1)) + (wrap-11108 + (let ((w2-11116 + (vector-ref x-11075 2))) + (let ((m1-11117 (car w-10316)) + (s1-11118 (cdr w-10316))) + (if (null? m1-11117) + (if (null? s1-11118) + w2-11116 + (cons (car w2-11116) + (let ((m2-11133 + (cdr w2-11116))) + (if (null? m2-11133) + s1-11118 + (append + s1-11118 + m2-11133))))) + (cons (let ((m2-11141 + (car w2-11116))) + (if (null? m2-11141) + m1-11117 + (append + m1-11117 + m2-11141))) + (let ((m2-11149 + (cdr w2-11116))) + (if (null? m2-11149) + s1-11118 + (append + s1-11118 + m2-11149)))))))) + (module-11109 + (vector-ref x-11075 3))) + (vector + 'syntax-object + expression-11107 + wrap-11108 + module-11109)) + (if (null? x-11075) + x-11075 + (vector + 'syntax-object + x-11075 + w-10316 + mod-10318))))))))))))) + tmp-10320) + (let ((tmp-11164 + ($sc-dispatch e-10314 '(_ (any . each-any) any)))) + (if tmp-11164 (@apply - (lambda (head-11340 tail-11341 val-11342) + (lambda (head-11168 tail-11169 val-11170) (call-with-values (lambda () - (syntax-type-6584 - head-11340 - r-10840 + (syntax-type-4585 + head-11168 + r-10315 '(()) #f #f - mod-10843 + mod-10318 #t)) - (lambda (type-11345 - value-11346 - formform-11347 - ee-11348 - ww-11349 - ss-11350 - modmod-11351) - (if (eqv? type-11345 'module-ref) - (let ((val-11355 - (expand-6585 - val-11342 - r-10840 - w-10841 - mod-10843))) + (lambda (type-11173 + value-11174 + ee*-11175 + ee-11176 + ww-11177 + ss-11178 + modmod-11179) + (if (eqv? type-11173 'module-ref) + (let ((val-11183 + (expand-4586 + val-11170 + r-10315 + w-10316 + mod-10318))) (call-with-values (lambda () - (value-11346 - (cons head-11340 tail-11341) - r-10840 - w-10841)) - (lambda (e-11356 - r-11357 - w-11358 - s*-11359 - mod-11360) - (let ((tmp-11362 (list e-11356))) + (value-11174 + (cons head-11168 tail-11169) + r-10315 + w-10316)) + (lambda (e-11184 + r-11185 + w-11186 + s*-11187 + mod-11188) + (let ((tmp-11190 (list e-11184))) (if (@apply - (lambda (e-11364) - (if (symbol? e-11364) + (lambda (e-11192) + (if (symbol? e-11192) #t - (if (if (vector? e-11364) + (if (if (vector? e-11192) (if (= (vector-length - e-11364) + e-11192) 4) (eq? (vector-ref - e-11364 + e-11192 0) 'syntax-object) #f) #f) (symbol? - (vector-ref e-11364 1)) + (vector-ref e-11192 1)) #f))) - tmp-11362) + tmp-11190) (@apply - (lambda (e-11394) - (build-global-assignment-6523 - s-10842 - (syntax->datum e-11394) - val-11355 - mod-11360)) - tmp-11362) + (lambda (e-11222) + (build-global-assignment-4524 + s-10317 + (syntax->datum e-11222) + val-11183 + mod-11188)) + tmp-11190) (syntax-violation #f "source expression failed to match any pattern" - e-11356)))))) - (build-application-6516 - s-10842 - (let ((e-11619 - (list '#(syntax-object - setter - ((top) - #(ribcage () () ()) - #(ribcage () () ()) - #(ribcage - #(type - value - formform - ee - ww - ss - modmod) - #((top) - (top) - (top) - (top) - (top) - (top) - (top)) - #("l-*-5730" - "l-*-5731" - "l-*-5732" - "l-*-5733" - "l-*-5734" - "l-*-5735" - "l-*-5736")) - #(ribcage - #(head tail val) - #((top) (top) (top)) - #("l-*-5715" - "l-*-5716" - "l-*-5717")) - #(ribcage () () ()) - #(ribcage - #(e r w s mod) - #((top) - (top) - (top) - (top) - (top)) - #("l-*-5679" - "l-*-5680" - "l-*-5681" - "l-*-5682" - "l-*-5683")) - #(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=? - with-transformer-environment - transformer-environment - resolve-identifier - locally-bound-identifiers - 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 - session-id - 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) - (top) - (top) - (top) - (top)) - ("l-*-2527" - "l-*-2525" - "l-*-2523" - "l-*-2521" - "l-*-2519" - "l-*-2517" - "l-*-2515" - "l-*-2513" - "l-*-2511" - "l-*-2509" - "l-*-2507" - "l-*-2505" - "l-*-2503" - "l-*-2501" - "l-*-2499" - "l-*-2497" - "l-*-2495" - "l-*-2493" - "l-*-2491" - "l-*-2489" - "l-*-2487" - "l-*-2485" - "l-*-2483" - "l-*-2481" - "l-*-2479" - "l-*-2477" - "l-*-2475" - "l-*-2473" - "l-*-2471" - "l-*-2469" - "l-*-2467" - "l-*-2465" - "l-*-2463" - "l-*-2461" - "l-*-2459" - "l-*-2457" - "l-*-2455" - "l-*-2453" - "l-*-2451" - "l-*-2450" - "l-*-2448" - "l-*-2445" - "l-*-2444" - "l-*-2443" - "l-*-2441" - "l-*-2440" - "l-*-2438" - "l-*-2436" - "l-*-2434" - "l-*-2432" - "l-*-2430" - "l-*-2428" - "l-*-2426" - "l-*-2424" - "l-*-2421" - "l-*-2419" - "l-*-2418" - "l-*-2416" - "l-*-2414" - "l-*-2412" - "l-*-2410" - "l-*-2409" - "l-*-2408" - "l-*-2407" - "l-*-2405" - "l-*-2404" - "l-*-2401" - "l-*-2399" - "l-*-2397" - "l-*-2395" - "l-*-2393" - "l-*-2391" - "l-*-2389" - "l-*-2388" - "l-*-2387" - "l-*-2385" - "l-*-2383" - "l-*-2382" - "l-*-2379" - "l-*-2378" - "l-*-2376" - "l-*-2374" - "l-*-2372" - "l-*-2370" - "l-*-2368" - "l-*-2366" - "l-*-2364" - "l-*-2362" - "l-*-2360" - "l-*-2357" - "l-*-2355" - "l-*-2353" - "l-*-2351" - "l-*-2349" - "l-*-2347" - "l-*-2345" - "l-*-2343" - "l-*-2341" - "l-*-2339" - "l-*-2337" - "l-*-2335" - "l-*-2333" - "l-*-2331" - "l-*-2329" - "l-*-2327" - "l-*-2325" - "l-*-2323" - "l-*-2321" - "l-*-2319" - "l-*-2317" - "l-*-2315" - "l-*-2313" - "l-*-2311" - "l-*-2309" - "l-*-2307" - "l-*-2306" - "l-*-2305" - "l-*-2304" - "l-*-2303" - "l-*-2301" - "l-*-2299" - "l-*-2297" - "l-*-2294" - "l-*-2292" - "l-*-2290" - "l-*-2288" - "l-*-2286" - "l-*-2284" - "l-*-2282" - "l-*-2280" - "l-*-2278" - "l-*-2276" - "l-*-2274" - "l-*-2272" - "l-*-2270" - "l-*-2268" - "l-*-2266" - "l-*-2264" - "l-*-2262" - "l-*-2260")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("l-*-2098" - "l-*-2097" - "l-*-2096"))) - (hygiene guile)) - head-11340))) - (call-with-values - (lambda () - (syntax-type-6584 - e-11619 - r-10840 - w-10841 - (source-annotation-6542 e-11619) - #f - mod-10843 - #f)) - (lambda (type-11626 - value-11627 - form-11628 - e-11629 - w-11630 - s-11631 - mod-11632) - (expand-expr-6586 - type-11626 - value-11627 - form-11628 - e-11629 - r-10840 - w-11630 - s-11631 - mod-11632)))) - (map (lambda (e-11636) - (call-with-values - (lambda () - (syntax-type-6584 - e-11636 - r-10840 - w-10841 - (source-annotation-6542 e-11636) - #f - mod-10843 - #f)) - (lambda (type-11651 - value-11652 - form-11653 - e-11654 - w-11655 - s-11656 - mod-11657) - (expand-expr-6586 - type-11651 - value-11652 - form-11653 - e-11654 - r-10840 - w-11655 - s-11656 - mod-11657)))) - (append tail-11341 (list val-11342)))))))) - tmp-11336) + e-11184)))))) + (build-call-4517 + s-10317 + (expand-4586 + (list '#(syntax-object + setter + ((top) + #(ribcage () () ()) + #(ribcage () () ()) + #(ribcage + #(type value ee* ee ww ss modmod) + #((top) + (top) + (top) + (top) + (top) + (top) + (top)) + #("l-*-3734" + "l-*-3735" + "l-*-3736" + "l-*-3737" + "l-*-3738" + "l-*-3739" + "l-*-3740")) + #(ribcage + #(head tail val) + #((top) (top) (top)) + #("l-*-3719" + "l-*-3720" + "l-*-3721")) + #(ribcage () () ()) + #(ribcage + #(e r w s mod) + #((top) (top) (top) (top) (top)) + #("l-*-3691" + "l-*-3692" + "l-*-3693" + "l-*-3694" + "l-*-3695")) + #(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=? + with-transformer-environment + transformer-environment + resolve-identifier + locally-bound-identifiers + 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 + session-id + 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) + (top) + (top) + (top)) + ("l-*-478" + "l-*-476" + "l-*-474" + "l-*-472" + "l-*-470" + "l-*-468" + "l-*-466" + "l-*-464" + "l-*-462" + "l-*-460" + "l-*-458" + "l-*-456" + "l-*-454" + "l-*-452" + "l-*-450" + "l-*-448" + "l-*-446" + "l-*-444" + "l-*-442" + "l-*-440" + "l-*-438" + "l-*-436" + "l-*-434" + "l-*-432" + "l-*-430" + "l-*-428" + "l-*-426" + "l-*-424" + "l-*-422" + "l-*-420" + "l-*-418" + "l-*-416" + "l-*-414" + "l-*-412" + "l-*-410" + "l-*-408" + "l-*-406" + "l-*-404" + "l-*-402" + "l-*-401" + "l-*-399" + "l-*-396" + "l-*-395" + "l-*-394" + "l-*-392" + "l-*-391" + "l-*-389" + "l-*-387" + "l-*-385" + "l-*-383" + "l-*-381" + "l-*-379" + "l-*-377" + "l-*-375" + "l-*-372" + "l-*-370" + "l-*-369" + "l-*-367" + "l-*-365" + "l-*-363" + "l-*-361" + "l-*-360" + "l-*-359" + "l-*-358" + "l-*-356" + "l-*-355" + "l-*-352" + "l-*-350" + "l-*-348" + "l-*-346" + "l-*-344" + "l-*-342" + "l-*-341" + "l-*-340" + "l-*-338" + "l-*-336" + "l-*-335" + "l-*-332" + "l-*-331" + "l-*-329" + "l-*-327" + "l-*-325" + "l-*-323" + "l-*-321" + "l-*-319" + "l-*-317" + "l-*-315" + "l-*-313" + "l-*-310" + "l-*-308" + "l-*-306" + "l-*-304" + "l-*-302" + "l-*-300" + "l-*-298" + "l-*-296" + "l-*-294" + "l-*-292" + "l-*-290" + "l-*-288" + "l-*-286" + "l-*-284" + "l-*-282" + "l-*-280" + "l-*-278" + "l-*-276" + "l-*-274" + "l-*-272" + "l-*-270" + "l-*-268" + "l-*-266" + "l-*-264" + "l-*-262" + "l-*-260" + "l-*-258" + "l-*-257" + "l-*-256" + "l-*-255" + "l-*-254" + "l-*-252" + "l-*-250" + "l-*-248" + "l-*-245" + "l-*-243" + "l-*-241" + "l-*-239" + "l-*-237" + "l-*-235" + "l-*-233" + "l-*-231" + "l-*-229" + "l-*-227" + "l-*-225" + "l-*-223" + "l-*-221" + "l-*-219" + "l-*-217" + "l-*-215" + "l-*-213" + "l-*-211" + "l-*-209")) + #(ribcage + (define-structure + define-expansion-accessors + define-expansion-constructors) + ((top) (top) (top)) + ("l-*-47" "l-*-46" "l-*-45")) + #(ribcage () () ())) + (hygiene guile)) + head-11168) + r-10315 + w-10316 + mod-10318) + (map (lambda (e-11535) + (expand-4586 + e-11535 + r-10315 + w-10316 + mod-10318)) + (append tail-11169 (list val-11170)))))))) + tmp-11164) (syntax-violation 'set! "bad set!" - (wrap-6578 - (begin - (if (if (pair? e-10839) s-10842 #f) - (set-source-properties! e-10839 s-10842)) - e-10839) - w-10841 - mod-10843)))))))) + (let ((x-11623 + (begin + (if (if (pair? e-10314) s-10317 #f) + (set-source-properties! e-10314 s-10317)) + e-10314))) + (if (if (null? (car w-10316)) + (null? (cdr w-10316)) + #f) + x-11623 + (if (if (vector? x-11623) + (if (= (vector-length x-11623) 4) + (eq? (vector-ref x-11623 0) 'syntax-object) + #f) + #f) + (let ((expression-11655 (vector-ref x-11623 1)) + (wrap-11656 + (let ((w2-11664 (vector-ref x-11623 2))) + (let ((m1-11665 (car w-10316)) + (s1-11666 (cdr w-10316))) + (if (null? m1-11665) + (if (null? s1-11666) + w2-11664 + (cons (car w2-11664) + (let ((m2-11681 + (cdr w2-11664))) + (if (null? m2-11681) + s1-11666 + (append + s1-11666 + m2-11681))))) + (cons (let ((m2-11689 (car w2-11664))) + (if (null? m2-11689) + m1-11665 + (append m1-11665 m2-11689))) + (let ((m2-11697 (cdr w2-11664))) + (if (null? m2-11697) + s1-11666 + (append + s1-11666 + m2-11697)))))))) + (module-11657 (vector-ref x-11623 3))) + (vector + 'syntax-object + expression-11655 + wrap-11656 + module-11657)) + (if (null? x-11623) + x-11623 + (vector + 'syntax-object + x-11623 + w-10316 + mod-10318)))))))))))) (module-define! (current-module) '@ (make-syntax-transformer '@ 'module-ref - (lambda (e-11700 r-11701 w-11702) - (let ((tmp-11704 - ($sc-dispatch e-11700 '(_ each-any any)))) - (if (if tmp-11704 + (lambda (e-11728 r-11729 w-11730) + (let ((tmp-11732 + ($sc-dispatch e-11728 '(_ each-any any)))) + (if (if tmp-11732 (@apply - (lambda (mod-11707 id-11708) - (if (and-map id?-6549 mod-11707) - (if (symbol? id-11708) + (lambda (mod-11735 id-11736) + (if (and-map id?-4550 mod-11735) + (if (symbol? id-11736) #t - (if (if (vector? id-11708) - (if (= (vector-length id-11708) 4) - (eq? (vector-ref id-11708 0) + (if (if (vector? id-11736) + (if (= (vector-length id-11736) 4) + (eq? (vector-ref id-11736 0) 'syntax-object) #f) #f) - (symbol? (vector-ref id-11708 1)) + (symbol? (vector-ref id-11736 1)) #f)) #f)) - tmp-11704) + tmp-11732) #f) (@apply - (lambda (mod-11748 id-11749) + (lambda (mod-11776 id-11777) (values - (syntax->datum id-11749) - r-11701 - w-11702 + (syntax->datum id-11777) + r-11729 + w-11730 #f (syntax->datum (cons '#(syntax-object @@ -9862,12 +11715,12 @@ #(ribcage #(mod id) #((top) (top)) - #("l-*-5778" "l-*-5779")) + #("l-*-3782" "l-*-3783")) #(ribcage () () ()) #(ribcage #(e r w) #((top) (top) (top)) - #("l-*-5766" "l-*-5767" "l-*-5768")) + #("l-*-3770" "l-*-3771" "l-*-3772")) #(ribcage (lambda-var-list gen-var @@ -9882,7 +11735,7 @@ expand-local-syntax expand-body expand-macro - expand-application + expand-call expand-expr expand syntax-type @@ -9938,7 +11791,6 @@ id? nonsymbol-id? global-extend - lookup macros-only-env extend-var-env extend-env @@ -9964,6 +11816,7 @@ build-sequence build-data build-primref + build-primcall build-lambda-case build-case-lambda build-simple-lambda @@ -9975,7 +11828,7 @@ build-lexical-reference build-dynlet build-conditional - build-application + build-call build-void maybe-name-value! decorate-source @@ -9996,8 +11849,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 @@ -10148,214 +12002,217 @@ (top) (top) (top) + (top) (top)) - ("l-*-2527" - "l-*-2525" - "l-*-2523" - "l-*-2521" - "l-*-2519" - "l-*-2517" - "l-*-2515" - "l-*-2513" - "l-*-2511" - "l-*-2509" - "l-*-2507" - "l-*-2505" - "l-*-2503" - "l-*-2501" - "l-*-2499" - "l-*-2497" - "l-*-2495" - "l-*-2493" - "l-*-2491" - "l-*-2489" - "l-*-2487" - "l-*-2485" - "l-*-2483" - "l-*-2481" - "l-*-2479" - "l-*-2477" - "l-*-2475" - "l-*-2473" - "l-*-2471" - "l-*-2469" - "l-*-2467" - "l-*-2465" - "l-*-2463" - "l-*-2461" - "l-*-2459" - "l-*-2457" - "l-*-2455" - "l-*-2453" - "l-*-2451" - "l-*-2450" - "l-*-2448" - "l-*-2445" - "l-*-2444" - "l-*-2443" - "l-*-2441" - "l-*-2440" - "l-*-2438" - "l-*-2436" - "l-*-2434" - "l-*-2432" - "l-*-2430" - "l-*-2428" - "l-*-2426" - "l-*-2424" - "l-*-2421" - "l-*-2419" - "l-*-2418" - "l-*-2416" - "l-*-2414" - "l-*-2412" - "l-*-2410" - "l-*-2409" - "l-*-2408" - "l-*-2407" - "l-*-2405" - "l-*-2404" - "l-*-2401" - "l-*-2399" - "l-*-2397" - "l-*-2395" - "l-*-2393" - "l-*-2391" - "l-*-2389" - "l-*-2388" - "l-*-2387" - "l-*-2385" - "l-*-2383" - "l-*-2382" - "l-*-2379" - "l-*-2378" - "l-*-2376" - "l-*-2374" - "l-*-2372" - "l-*-2370" - "l-*-2368" - "l-*-2366" - "l-*-2364" - "l-*-2362" - "l-*-2360" - "l-*-2357" - "l-*-2355" - "l-*-2353" - "l-*-2351" - "l-*-2349" - "l-*-2347" - "l-*-2345" - "l-*-2343" - "l-*-2341" - "l-*-2339" - "l-*-2337" - "l-*-2335" - "l-*-2333" - "l-*-2331" - "l-*-2329" - "l-*-2327" - "l-*-2325" - "l-*-2323" - "l-*-2321" - "l-*-2319" - "l-*-2317" - "l-*-2315" - "l-*-2313" - "l-*-2311" - "l-*-2309" - "l-*-2307" - "l-*-2306" - "l-*-2305" - "l-*-2304" - "l-*-2303" - "l-*-2301" - "l-*-2299" - "l-*-2297" - "l-*-2294" - "l-*-2292" - "l-*-2290" - "l-*-2288" - "l-*-2286" - "l-*-2284" - "l-*-2282" - "l-*-2280" - "l-*-2278" - "l-*-2276" - "l-*-2274" - "l-*-2272" - "l-*-2270" - "l-*-2268" - "l-*-2266" - "l-*-2264" - "l-*-2262" - "l-*-2260")) + ("l-*-478" + "l-*-476" + "l-*-474" + "l-*-472" + "l-*-470" + "l-*-468" + "l-*-466" + "l-*-464" + "l-*-462" + "l-*-460" + "l-*-458" + "l-*-456" + "l-*-454" + "l-*-452" + "l-*-450" + "l-*-448" + "l-*-446" + "l-*-444" + "l-*-442" + "l-*-440" + "l-*-438" + "l-*-436" + "l-*-434" + "l-*-432" + "l-*-430" + "l-*-428" + "l-*-426" + "l-*-424" + "l-*-422" + "l-*-420" + "l-*-418" + "l-*-416" + "l-*-414" + "l-*-412" + "l-*-410" + "l-*-408" + "l-*-406" + "l-*-404" + "l-*-402" + "l-*-401" + "l-*-399" + "l-*-396" + "l-*-395" + "l-*-394" + "l-*-392" + "l-*-391" + "l-*-389" + "l-*-387" + "l-*-385" + "l-*-383" + "l-*-381" + "l-*-379" + "l-*-377" + "l-*-375" + "l-*-372" + "l-*-370" + "l-*-369" + "l-*-367" + "l-*-365" + "l-*-363" + "l-*-361" + "l-*-360" + "l-*-359" + "l-*-358" + "l-*-356" + "l-*-355" + "l-*-352" + "l-*-350" + "l-*-348" + "l-*-346" + "l-*-344" + "l-*-342" + "l-*-341" + "l-*-340" + "l-*-338" + "l-*-336" + "l-*-335" + "l-*-332" + "l-*-331" + "l-*-329" + "l-*-327" + "l-*-325" + "l-*-323" + "l-*-321" + "l-*-319" + "l-*-317" + "l-*-315" + "l-*-313" + "l-*-310" + "l-*-308" + "l-*-306" + "l-*-304" + "l-*-302" + "l-*-300" + "l-*-298" + "l-*-296" + "l-*-294" + "l-*-292" + "l-*-290" + "l-*-288" + "l-*-286" + "l-*-284" + "l-*-282" + "l-*-280" + "l-*-278" + "l-*-276" + "l-*-274" + "l-*-272" + "l-*-270" + "l-*-268" + "l-*-266" + "l-*-264" + "l-*-262" + "l-*-260" + "l-*-258" + "l-*-257" + "l-*-256" + "l-*-255" + "l-*-254" + "l-*-252" + "l-*-250" + "l-*-248" + "l-*-245" + "l-*-243" + "l-*-241" + "l-*-239" + "l-*-237" + "l-*-235" + "l-*-233" + "l-*-231" + "l-*-229" + "l-*-227" + "l-*-225" + "l-*-223" + "l-*-221" + "l-*-219" + "l-*-217" + "l-*-215" + "l-*-213" + "l-*-211" + "l-*-209")) #(ribcage (define-structure define-expansion-accessors define-expansion-constructors) ((top) (top) (top)) - ("l-*-2098" "l-*-2097" "l-*-2096"))) + ("l-*-47" "l-*-46" "l-*-45")) + #(ribcage () () ())) (hygiene guile)) - mod-11748)))) - tmp-11704) + mod-11776)))) + tmp-11732) (syntax-violation #f "source expression failed to match any pattern" - e-11700)))))) - (global-extend-6547 + e-11728)))))) + (global-extend-4548 'module-ref '@@ - (lambda (e-11841 r-11842 w-11843) + (lambda (e-11877 r-11878 w-11879) (letrec* - ((remodulate-11844 - (lambda (x-11879 mod-11880) - (if (pair? x-11879) - (cons (remodulate-11844 (car x-11879) mod-11880) - (remodulate-11844 (cdr x-11879) mod-11880)) - (if (if (vector? x-11879) - (if (= (vector-length x-11879) 4) - (eq? (vector-ref x-11879 0) 'syntax-object) + ((remodulate-11880 + (lambda (x-12098 mod-12099) + (if (pair? x-12098) + (cons (remodulate-11880 (car x-12098) mod-12099) + (remodulate-11880 (cdr x-12098) mod-12099)) + (if (if (vector? x-12098) + (if (= (vector-length x-12098) 4) + (eq? (vector-ref x-12098 0) 'syntax-object) #f) #f) - (let ((expression-11894 - (remodulate-11844 - (vector-ref x-11879 1) - mod-11880)) - (wrap-11895 (vector-ref x-11879 2))) + (let ((expression-12113 + (remodulate-11880 + (vector-ref x-12098 1) + mod-12099)) + (wrap-12114 (vector-ref x-12098 2))) (vector 'syntax-object - expression-11894 - wrap-11895 - mod-11880)) - (if (vector? x-11879) - (let ((n-11903 (vector-length x-11879))) - (let ((v-11904 (make-vector n-11903))) + expression-12113 + wrap-12114 + mod-12099)) + (if (vector? x-12098) + (let ((n-12122 (vector-length x-12098))) + (let ((v-12123 (make-vector n-12122))) (letrec* - ((loop-11905 - (lambda (i-11952) - (if (= i-11952 n-11903) - v-11904 + ((loop-12124 + (lambda (i-12179) + (if (= i-12179 n-12122) + v-12123 (begin (vector-set! - v-11904 - i-11952 - (remodulate-11844 - (vector-ref x-11879 i-11952) - mod-11880)) - (loop-11905 (#{1+}# i-11952))))))) - (loop-11905 0)))) - x-11879)))))) - (let ((tmp-11846 - ($sc-dispatch e-11841 '(_ each-any any)))) - (if (if tmp-11846 + v-12123 + i-12179 + (remodulate-11880 + (vector-ref x-12098 i-12179) + mod-12099)) + (loop-12124 (#{1+}# i-12179))))))) + (loop-12124 0)))) + x-12098)))))) + (let ((tmp-11882 + ($sc-dispatch e-11877 '(_ each-any any)))) + (if (if tmp-11882 (@apply - (lambda (mod-11850 exp-11851) - (and-map id?-6549 mod-11850)) - tmp-11846) + (lambda (mod-11886 exp-11887) + (and-map id?-4550 mod-11886)) + tmp-11882) #f) (@apply - (lambda (mod-11867 exp-11868) - (let ((mod-11869 + (lambda (mod-11903 exp-11904) + (let ((mod-11905 (syntax->datum (cons '#(syntax-object private @@ -10363,15 +12220,15 @@ #(ribcage #(mod exp) #((top) (top)) - #("l-*-5822" "l-*-5823")) + #("l-*-3826" "l-*-3827")) #(ribcage (remodulate) ((top)) - ("l-*-5789")) + ("l-*-3793")) #(ribcage #(e r w) #((top) (top) (top)) - #("l-*-5786" "l-*-5787" "l-*-5788")) + #("l-*-3790" "l-*-3791" "l-*-3792")) #(ribcage (lambda-var-list gen-var @@ -10386,7 +12243,7 @@ expand-local-syntax expand-body expand-macro - expand-application + expand-call expand-expr expand syntax-type @@ -10442,7 +12299,6 @@ id? nonsymbol-id? global-extend - lookup macros-only-env extend-var-env extend-env @@ -10468,6 +12324,7 @@ build-sequence build-data build-primref + build-primcall build-lambda-case build-case-lambda build-simple-lambda @@ -10479,7 +12336,7 @@ build-lexical-reference build-dynlet build-conditional - build-application + build-call build-void maybe-name-value! decorate-source @@ -10500,8 +12357,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 @@ -10652,253 +12510,306 @@ (top) (top) (top) + (top) (top)) - ("l-*-2527" - "l-*-2525" - "l-*-2523" - "l-*-2521" - "l-*-2519" - "l-*-2517" - "l-*-2515" - "l-*-2513" - "l-*-2511" - "l-*-2509" - "l-*-2507" - "l-*-2505" - "l-*-2503" - "l-*-2501" - "l-*-2499" - "l-*-2497" - "l-*-2495" - "l-*-2493" - "l-*-2491" - "l-*-2489" - "l-*-2487" - "l-*-2485" - "l-*-2483" - "l-*-2481" - "l-*-2479" - "l-*-2477" - "l-*-2475" - "l-*-2473" - "l-*-2471" - "l-*-2469" - "l-*-2467" - "l-*-2465" - "l-*-2463" - "l-*-2461" - "l-*-2459" - "l-*-2457" - "l-*-2455" - "l-*-2453" - "l-*-2451" - "l-*-2450" - "l-*-2448" - "l-*-2445" - "l-*-2444" - "l-*-2443" - "l-*-2441" - "l-*-2440" - "l-*-2438" - "l-*-2436" - "l-*-2434" - "l-*-2432" - "l-*-2430" - "l-*-2428" - "l-*-2426" - "l-*-2424" - "l-*-2421" - "l-*-2419" - "l-*-2418" - "l-*-2416" - "l-*-2414" - "l-*-2412" - "l-*-2410" - "l-*-2409" - "l-*-2408" - "l-*-2407" - "l-*-2405" - "l-*-2404" - "l-*-2401" - "l-*-2399" - "l-*-2397" - "l-*-2395" - "l-*-2393" - "l-*-2391" - "l-*-2389" - "l-*-2388" - "l-*-2387" - "l-*-2385" - "l-*-2383" - "l-*-2382" - "l-*-2379" - "l-*-2378" - "l-*-2376" - "l-*-2374" - "l-*-2372" - "l-*-2370" - "l-*-2368" - "l-*-2366" - "l-*-2364" - "l-*-2362" - "l-*-2360" - "l-*-2357" - "l-*-2355" - "l-*-2353" - "l-*-2351" - "l-*-2349" - "l-*-2347" - "l-*-2345" - "l-*-2343" - "l-*-2341" - "l-*-2339" - "l-*-2337" - "l-*-2335" - "l-*-2333" - "l-*-2331" - "l-*-2329" - "l-*-2327" - "l-*-2325" - "l-*-2323" - "l-*-2321" - "l-*-2319" - "l-*-2317" - "l-*-2315" - "l-*-2313" - "l-*-2311" - "l-*-2309" - "l-*-2307" - "l-*-2306" - "l-*-2305" - "l-*-2304" - "l-*-2303" - "l-*-2301" - "l-*-2299" - "l-*-2297" - "l-*-2294" - "l-*-2292" - "l-*-2290" - "l-*-2288" - "l-*-2286" - "l-*-2284" - "l-*-2282" - "l-*-2280" - "l-*-2278" - "l-*-2276" - "l-*-2274" - "l-*-2272" - "l-*-2270" - "l-*-2268" - "l-*-2266" - "l-*-2264" - "l-*-2262" - "l-*-2260")) + ("l-*-478" + "l-*-476" + "l-*-474" + "l-*-472" + "l-*-470" + "l-*-468" + "l-*-466" + "l-*-464" + "l-*-462" + "l-*-460" + "l-*-458" + "l-*-456" + "l-*-454" + "l-*-452" + "l-*-450" + "l-*-448" + "l-*-446" + "l-*-444" + "l-*-442" + "l-*-440" + "l-*-438" + "l-*-436" + "l-*-434" + "l-*-432" + "l-*-430" + "l-*-428" + "l-*-426" + "l-*-424" + "l-*-422" + "l-*-420" + "l-*-418" + "l-*-416" + "l-*-414" + "l-*-412" + "l-*-410" + "l-*-408" + "l-*-406" + "l-*-404" + "l-*-402" + "l-*-401" + "l-*-399" + "l-*-396" + "l-*-395" + "l-*-394" + "l-*-392" + "l-*-391" + "l-*-389" + "l-*-387" + "l-*-385" + "l-*-383" + "l-*-381" + "l-*-379" + "l-*-377" + "l-*-375" + "l-*-372" + "l-*-370" + "l-*-369" + "l-*-367" + "l-*-365" + "l-*-363" + "l-*-361" + "l-*-360" + "l-*-359" + "l-*-358" + "l-*-356" + "l-*-355" + "l-*-352" + "l-*-350" + "l-*-348" + "l-*-346" + "l-*-344" + "l-*-342" + "l-*-341" + "l-*-340" + "l-*-338" + "l-*-336" + "l-*-335" + "l-*-332" + "l-*-331" + "l-*-329" + "l-*-327" + "l-*-325" + "l-*-323" + "l-*-321" + "l-*-319" + "l-*-317" + "l-*-315" + "l-*-313" + "l-*-310" + "l-*-308" + "l-*-306" + "l-*-304" + "l-*-302" + "l-*-300" + "l-*-298" + "l-*-296" + "l-*-294" + "l-*-292" + "l-*-290" + "l-*-288" + "l-*-286" + "l-*-284" + "l-*-282" + "l-*-280" + "l-*-278" + "l-*-276" + "l-*-274" + "l-*-272" + "l-*-270" + "l-*-268" + "l-*-266" + "l-*-264" + "l-*-262" + "l-*-260" + "l-*-258" + "l-*-257" + "l-*-256" + "l-*-255" + "l-*-254" + "l-*-252" + "l-*-250" + "l-*-248" + "l-*-245" + "l-*-243" + "l-*-241" + "l-*-239" + "l-*-237" + "l-*-235" + "l-*-233" + "l-*-231" + "l-*-229" + "l-*-227" + "l-*-225" + "l-*-223" + "l-*-221" + "l-*-219" + "l-*-217" + "l-*-215" + "l-*-213" + "l-*-211" + "l-*-209")) #(ribcage (define-structure define-expansion-accessors define-expansion-constructors) ((top) (top) (top)) - ("l-*-2098" "l-*-2097" "l-*-2096"))) + ("l-*-47" "l-*-46" "l-*-45")) + #(ribcage () () ())) (hygiene guile)) - mod-11867)))) + mod-11903)))) (values - (remodulate-11844 exp-11868 mod-11869) - r-11842 - w-11843 - (source-annotation-6542 exp-11868) - mod-11869))) - tmp-11846) + (remodulate-11880 exp-11904 mod-11905) + r-11878 + w-11879 + (source-annotation-4544 exp-11904) + mod-11905))) + tmp-11882) (syntax-violation #f "source expression failed to match any pattern" - e-11841)))))) - (global-extend-6547 + e-11877)))))) + (global-extend-4548 'core 'if - (lambda (e-12053 r-12054 w-12055 s-12056 mod-12057) - (let ((tmp-12059 ($sc-dispatch e-12053 '(_ any any)))) - (if tmp-12059 + (lambda (e-12288 r-12289 w-12290 s-12291 mod-12292) + (let ((tmp-12294 ($sc-dispatch e-12288 '(_ any any)))) + (if tmp-12294 (@apply - (lambda (test-12063 then-12064) - (build-conditional-6517 - s-12056 - (expand-6585 - test-12063 - r-12054 - w-12055 - mod-12057) - (expand-6585 - then-12064 - r-12054 - w-12055 - mod-12057) + (lambda (test-12298 then-12299) + (build-conditional-4518 + s-12291 + (expand-4586 + test-12298 + r-12289 + w-12290 + mod-12292) + (expand-4586 + then-12299 + r-12289 + w-12290 + mod-12292) (make-struct/no-tail (vector-ref %expanded-vtables 0) #f))) - tmp-12059) - (let ((tmp-12289 - ($sc-dispatch e-12053 '(_ any any any)))) - (if tmp-12289 + tmp-12294) + (let ((tmp-12548 + ($sc-dispatch e-12288 '(_ any any any)))) + (if tmp-12548 (@apply - (lambda (test-12293 then-12294 else-12295) - (build-conditional-6517 - s-12056 - (expand-6585 - test-12293 - r-12054 - w-12055 - mod-12057) - (expand-6585 - then-12294 - r-12054 - w-12055 - mod-12057) - (expand-6585 - else-12295 - r-12054 - w-12055 - mod-12057))) - tmp-12289) + (lambda (test-12552 then-12553 else-12554) + (build-conditional-4518 + s-12291 + (expand-4586 + test-12552 + r-12289 + w-12290 + mod-12292) + (expand-4586 + then-12553 + r-12289 + w-12290 + mod-12292) + (expand-4586 + else-12554 + r-12289 + w-12290 + mod-12292))) + tmp-12548) (syntax-violation #f "source expression failed to match any pattern" - e-12053))))))) - (global-extend-6547 + e-12288))))))) + (global-extend-4548 'core 'with-fluids - (lambda (e-12694 r-12695 w-12696 s-12697 mod-12698) - (let ((tmp-12700 + (lambda (e-12993 r-12994 w-12995 s-12996 mod-12997) + (let ((tmp-12999 ($sc-dispatch - e-12694 + e-12993 '(_ #(each (any any)) any . each-any)))) - (if tmp-12700 + (if tmp-12999 (@apply - (lambda (fluid-12704 val-12705 b-12706 b*-12707) - (build-dynlet-6518 - s-12697 - (map (lambda (x-12788) - (expand-6585 x-12788 r-12695 w-12696 mod-12698)) - fluid-12704) - (map (lambda (x-12858) - (expand-6585 x-12858 r-12695 w-12696 mod-12698)) - val-12705) - (expand-body-6589 - (cons b-12706 b*-12707) - (wrap-6578 - (begin - (if (if (pair? e-12694) s-12697 #f) - (set-source-properties! e-12694 s-12697)) - e-12694) - w-12696 - mod-12698) - r-12695 - w-12696 - mod-12698))) - tmp-12700) + (lambda (fluid-13003 val-13004 b-13005 b*-13006) + (build-dynlet-4519 + s-12996 + (map (lambda (x-13095) + (expand-4586 x-13095 r-12994 w-12995 mod-12997)) + fluid-13003) + (map (lambda (x-13173) + (expand-4586 x-13173 r-12994 w-12995 mod-12997)) + val-13004) + (expand-body-4590 + (cons b-13005 b*-13006) + (let ((x-13262 + (begin + (if (if (pair? e-12993) s-12996 #f) + (set-source-properties! e-12993 s-12996)) + e-12993))) + (if (if (null? (car w-12995)) + (null? (cdr w-12995)) + #f) + x-13262 + (if (if (vector? x-13262) + (if (= (vector-length x-13262) 4) + (eq? (vector-ref x-13262 0) 'syntax-object) + #f) + #f) + (let ((expression-13294 (vector-ref x-13262 1)) + (wrap-13295 + (let ((w2-13303 (vector-ref x-13262 2))) + (let ((m1-13304 (car w-12995)) + (s1-13305 (cdr w-12995))) + (if (null? m1-13304) + (if (null? s1-13305) + w2-13303 + (cons (car w2-13303) + (let ((m2-13320 + (cdr w2-13303))) + (if (null? m2-13320) + s1-13305 + (append + s1-13305 + m2-13320))))) + (cons (let ((m2-13328 + (car w2-13303))) + (if (null? m2-13328) + m1-13304 + (append + m1-13304 + m2-13328))) + (let ((m2-13336 + (cdr w2-13303))) + (if (null? m2-13336) + s1-13305 + (append + s1-13305 + m2-13336)))))))) + (module-13296 (vector-ref x-13262 3))) + (vector + 'syntax-object + expression-13294 + wrap-13295 + module-13296)) + (if (null? x-13262) + x-13262 + (vector + 'syntax-object + x-13262 + w-12995 + mod-12997))))) + r-12994 + w-12995 + mod-12997))) + tmp-12999) (syntax-violation #f "source expression failed to match any pattern" - e-12694))))) + e-12993))))) (module-define! (current-module) 'begin @@ -10928,5868 +12839,2170 @@ 'eval-when 'eval-when '())) - (global-extend-6547 + (global-extend-4548 'core 'syntax-case (letrec* - ((convert-pattern-13226 - (lambda (pattern-14823 keys-14824) + ((convert-pattern-13636 + (lambda (pattern-15258 keys-15259) (letrec* - ((cvt*-14825 - (lambda (p*-15449 n-15450 ids-15451) - (if (not (pair? p*-15449)) - (cvt-14827 p*-15449 n-15450 ids-15451) + ((cvt*-15260 + (lambda (p*-16059 n-16060 ids-16061) + (if (not (pair? p*-16059)) + (cvt-15262 p*-16059 n-16060 ids-16061) (call-with-values (lambda () - (cvt*-14825 (cdr p*-15449) n-15450 ids-15451)) - (lambda (y-15454 ids-15455) + (cvt*-15260 (cdr p*-16059) n-16060 ids-16061)) + (lambda (y-16064 ids-16065) (call-with-values (lambda () - (cvt-14827 (car p*-15449) n-15450 ids-15455)) - (lambda (x-15458 ids-15459) + (cvt-15262 (car p*-16059) n-16060 ids-16065)) + (lambda (x-16068 ids-16069) (values - (cons x-15458 y-15454) - ids-15459)))))))) - (v-reverse-14826 - (lambda (x-15460) + (cons x-16068 y-16064) + ids-16069)))))))) + (v-reverse-15261 + (lambda (x-16070) (letrec* - ((loop-15461 - (lambda (r-15541 x-15542) - (if (not (pair? x-15542)) - (values r-15541 x-15542) - (loop-15461 - (cons (car x-15542) r-15541) - (cdr x-15542)))))) - (loop-15461 '() x-15460)))) - (cvt-14827 - (lambda (p-14830 n-14831 ids-14832) - (if (if (symbol? p-14830) + ((loop-16071 + (lambda (r-16172 x-16173) + (if (not (pair? x-16173)) + (values r-16172 x-16173) + (loop-16071 + (cons (car x-16173) r-16172) + (cdr x-16173)))))) + (loop-16071 '() x-16070)))) + (cvt-15262 + (lambda (p-15265 n-15266 ids-15267) + (if (if (symbol? p-15265) #t - (if (if (vector? p-14830) - (if (= (vector-length p-14830) 4) - (eq? (vector-ref p-14830 0) 'syntax-object) + (if (if (vector? p-15265) + (if (= (vector-length p-15265) 4) + (eq? (vector-ref p-15265 0) 'syntax-object) #f) #f) - (symbol? (vector-ref p-14830 1)) + (symbol? (vector-ref p-15265 1)) #f)) - (if (bound-id-member?-6577 p-14830 keys-14824) - (values (vector 'free-id p-14830) ids-14832) - (if (if (eq? (if (if (vector? p-14830) - (if (= (vector-length p-14830) 4) - (eq? (vector-ref p-14830 0) - 'syntax-object) - #f) - #f) - (vector-ref p-14830 1) - p-14830) - (if (if (= (vector-length - '#(syntax-object - _ - ((top) - #(ribcage () () ()) - #(ribcage - #(p n ids) - #((top) (top) (top)) - #("l-*-5923" - "l-*-5924" - "l-*-5925")) - #(ribcage - (cvt v-reverse cvt*) - ((top) (top) (top)) - ("l-*-5896" - "l-*-5894" - "l-*-5892")) - #(ribcage - #(pattern keys) - #((top) (top)) - #("l-*-5890" - "l-*-5891")) - #(ribcage - (gen-syntax-case - gen-clause - build-dispatch-call - convert-pattern) - ((top) - (top) - (top) - (top)) - ("l-*-5886" - "l-*-5884" - "l-*-5882" - "l-*-5880")) - #(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=? - with-transformer-environment - transformer-environment - resolve-identifier - locally-bound-identifiers - 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 - session-id - 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) - (top) - (top) - (top) - (top)) - ("l-*-2527" - "l-*-2525" - "l-*-2523" - "l-*-2521" - "l-*-2519" - "l-*-2517" - "l-*-2515" - "l-*-2513" - "l-*-2511" - "l-*-2509" - "l-*-2507" - "l-*-2505" - "l-*-2503" - "l-*-2501" - "l-*-2499" - "l-*-2497" - "l-*-2495" - "l-*-2493" - "l-*-2491" - "l-*-2489" - "l-*-2487" - "l-*-2485" - "l-*-2483" - "l-*-2481" - "l-*-2479" - "l-*-2477" - "l-*-2475" - "l-*-2473" - "l-*-2471" - "l-*-2469" - "l-*-2467" - "l-*-2465" - "l-*-2463" - "l-*-2461" - "l-*-2459" - "l-*-2457" - "l-*-2455" - "l-*-2453" - "l-*-2451" - "l-*-2450" - "l-*-2448" - "l-*-2445" - "l-*-2444" - "l-*-2443" - "l-*-2441" - "l-*-2440" - "l-*-2438" - "l-*-2436" - "l-*-2434" - "l-*-2432" - "l-*-2430" - "l-*-2428" - "l-*-2426" - "l-*-2424" - "l-*-2421" - "l-*-2419" - "l-*-2418" - "l-*-2416" - "l-*-2414" - "l-*-2412" - "l-*-2410" - "l-*-2409" - "l-*-2408" - "l-*-2407" - "l-*-2405" - "l-*-2404" - "l-*-2401" - "l-*-2399" - "l-*-2397" - "l-*-2395" - "l-*-2393" - "l-*-2391" - "l-*-2389" - "l-*-2388" - "l-*-2387" - "l-*-2385" - "l-*-2383" - "l-*-2382" - "l-*-2379" - "l-*-2378" - "l-*-2376" - "l-*-2374" - "l-*-2372" - "l-*-2370" - "l-*-2368" - "l-*-2366" - "l-*-2364" - "l-*-2362" - "l-*-2360" - "l-*-2357" - "l-*-2355" - "l-*-2353" - "l-*-2351" - "l-*-2349" - "l-*-2347" - "l-*-2345" - "l-*-2343" - "l-*-2341" - "l-*-2339" - "l-*-2337" - "l-*-2335" - "l-*-2333" - "l-*-2331" - "l-*-2329" - "l-*-2327" - "l-*-2325" - "l-*-2323" - "l-*-2321" - "l-*-2319" - "l-*-2317" - "l-*-2315" - "l-*-2313" - "l-*-2311" - "l-*-2309" - "l-*-2307" - "l-*-2306" - "l-*-2305" - "l-*-2304" - "l-*-2303" - "l-*-2301" - "l-*-2299" - "l-*-2297" - "l-*-2294" - "l-*-2292" - "l-*-2290" - "l-*-2288" - "l-*-2286" - "l-*-2284" - "l-*-2282" - "l-*-2280" - "l-*-2278" - "l-*-2276" - "l-*-2274" - "l-*-2272" - "l-*-2270" - "l-*-2268" - "l-*-2266" - "l-*-2264" - "l-*-2262" - "l-*-2260")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("l-*-2098" - "l-*-2097" - "l-*-2096"))) - (hygiene guile))) - 4) - #t - #f) - '_ - '#(syntax-object - _ - ((top) - #(ribcage () () ()) - #(ribcage - #(p n ids) - #((top) (top) (top)) - #("l-*-5923" - "l-*-5924" - "l-*-5925")) - #(ribcage - (cvt v-reverse cvt*) - ((top) (top) (top)) - ("l-*-5896" - "l-*-5894" - "l-*-5892")) - #(ribcage - #(pattern keys) - #((top) (top)) - #("l-*-5890" "l-*-5891")) - #(ribcage - (gen-syntax-case - gen-clause - build-dispatch-call - convert-pattern) - ((top) (top) (top) (top)) - ("l-*-5886" - "l-*-5884" - "l-*-5882" - "l-*-5880")) - #(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=? - with-transformer-environment - transformer-environment - resolve-identifier - locally-bound-identifiers - 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 - session-id - 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) - (top) - (top) - (top) - (top)) - ("l-*-2527" - "l-*-2525" - "l-*-2523" - "l-*-2521" - "l-*-2519" - "l-*-2517" - "l-*-2515" - "l-*-2513" - "l-*-2511" - "l-*-2509" - "l-*-2507" - "l-*-2505" - "l-*-2503" - "l-*-2501" - "l-*-2499" - "l-*-2497" - "l-*-2495" - "l-*-2493" - "l-*-2491" - "l-*-2489" - "l-*-2487" - "l-*-2485" - "l-*-2483" - "l-*-2481" - "l-*-2479" - "l-*-2477" - "l-*-2475" - "l-*-2473" - "l-*-2471" - "l-*-2469" - "l-*-2467" - "l-*-2465" - "l-*-2463" - "l-*-2461" - "l-*-2459" - "l-*-2457" - "l-*-2455" - "l-*-2453" - "l-*-2451" - "l-*-2450" - "l-*-2448" - "l-*-2445" - "l-*-2444" - "l-*-2443" - "l-*-2441" - "l-*-2440" - "l-*-2438" - "l-*-2436" - "l-*-2434" - "l-*-2432" - "l-*-2430" - "l-*-2428" - "l-*-2426" - "l-*-2424" - "l-*-2421" - "l-*-2419" - "l-*-2418" - "l-*-2416" - "l-*-2414" - "l-*-2412" - "l-*-2410" - "l-*-2409" - "l-*-2408" - "l-*-2407" - "l-*-2405" - "l-*-2404" - "l-*-2401" - "l-*-2399" - "l-*-2397" - "l-*-2395" - "l-*-2393" - "l-*-2391" - "l-*-2389" - "l-*-2388" - "l-*-2387" - "l-*-2385" - "l-*-2383" - "l-*-2382" - "l-*-2379" - "l-*-2378" - "l-*-2376" - "l-*-2374" - "l-*-2372" - "l-*-2370" - "l-*-2368" - "l-*-2366" - "l-*-2364" - "l-*-2362" - "l-*-2360" - "l-*-2357" - "l-*-2355" - "l-*-2353" - "l-*-2351" - "l-*-2349" - "l-*-2347" - "l-*-2345" - "l-*-2343" - "l-*-2341" - "l-*-2339" - "l-*-2337" - "l-*-2335" - "l-*-2333" - "l-*-2331" - "l-*-2329" - "l-*-2327" - "l-*-2325" - "l-*-2323" - "l-*-2321" - "l-*-2319" - "l-*-2317" - "l-*-2315" - "l-*-2313" - "l-*-2311" - "l-*-2309" - "l-*-2307" - "l-*-2306" - "l-*-2305" - "l-*-2304" - "l-*-2303" - "l-*-2301" - "l-*-2299" - "l-*-2297" - "l-*-2294" - "l-*-2292" - "l-*-2290" - "l-*-2288" - "l-*-2286" - "l-*-2284" - "l-*-2282" - "l-*-2280" - "l-*-2278" - "l-*-2276" - "l-*-2274" - "l-*-2272" - "l-*-2270" - "l-*-2268" - "l-*-2266" - "l-*-2264" - "l-*-2262" - "l-*-2260")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("l-*-2098" - "l-*-2097" - "l-*-2096"))) - (hygiene guile)))) - (eq? (id-var-name-6568 p-14830 '(())) - (id-var-name-6568 - '#(syntax-object - _ - ((top) - #(ribcage () () ()) - #(ribcage - #(p n ids) - #((top) (top) (top)) - #("l-*-5923" - "l-*-5924" - "l-*-5925")) - #(ribcage - (cvt v-reverse cvt*) - ((top) (top) (top)) - ("l-*-5896" - "l-*-5894" - "l-*-5892")) - #(ribcage - #(pattern keys) - #((top) (top)) - #("l-*-5890" "l-*-5891")) - #(ribcage - (gen-syntax-case - gen-clause - build-dispatch-call - convert-pattern) - ((top) (top) (top) (top)) - ("l-*-5886" - "l-*-5884" - "l-*-5882" - "l-*-5880")) - #(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=? - with-transformer-environment - transformer-environment - resolve-identifier - locally-bound-identifiers - 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 - session-id - 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) - (top) - (top) - (top) - (top)) - ("l-*-2527" - "l-*-2525" - "l-*-2523" - "l-*-2521" - "l-*-2519" - "l-*-2517" - "l-*-2515" - "l-*-2513" - "l-*-2511" - "l-*-2509" - "l-*-2507" - "l-*-2505" - "l-*-2503" - "l-*-2501" - "l-*-2499" - "l-*-2497" - "l-*-2495" - "l-*-2493" - "l-*-2491" - "l-*-2489" - "l-*-2487" - "l-*-2485" - "l-*-2483" - "l-*-2481" - "l-*-2479" - "l-*-2477" - "l-*-2475" - "l-*-2473" - "l-*-2471" - "l-*-2469" - "l-*-2467" - "l-*-2465" - "l-*-2463" - "l-*-2461" - "l-*-2459" - "l-*-2457" - "l-*-2455" - "l-*-2453" - "l-*-2451" - "l-*-2450" - "l-*-2448" - "l-*-2445" - "l-*-2444" - "l-*-2443" - "l-*-2441" - "l-*-2440" - "l-*-2438" - "l-*-2436" - "l-*-2434" - "l-*-2432" - "l-*-2430" - "l-*-2428" - "l-*-2426" - "l-*-2424" - "l-*-2421" - "l-*-2419" - "l-*-2418" - "l-*-2416" - "l-*-2414" - "l-*-2412" - "l-*-2410" - "l-*-2409" - "l-*-2408" - "l-*-2407" - "l-*-2405" - "l-*-2404" - "l-*-2401" - "l-*-2399" - "l-*-2397" - "l-*-2395" - "l-*-2393" - "l-*-2391" - "l-*-2389" - "l-*-2388" - "l-*-2387" - "l-*-2385" - "l-*-2383" - "l-*-2382" - "l-*-2379" - "l-*-2378" - "l-*-2376" - "l-*-2374" - "l-*-2372" - "l-*-2370" - "l-*-2368" - "l-*-2366" - "l-*-2364" - "l-*-2362" - "l-*-2360" - "l-*-2357" - "l-*-2355" - "l-*-2353" - "l-*-2351" - "l-*-2349" - "l-*-2347" - "l-*-2345" - "l-*-2343" - "l-*-2341" - "l-*-2339" - "l-*-2337" - "l-*-2335" - "l-*-2333" - "l-*-2331" - "l-*-2329" - "l-*-2327" - "l-*-2325" - "l-*-2323" - "l-*-2321" - "l-*-2319" - "l-*-2317" - "l-*-2315" - "l-*-2313" - "l-*-2311" - "l-*-2309" - "l-*-2307" - "l-*-2306" - "l-*-2305" - "l-*-2304" - "l-*-2303" - "l-*-2301" - "l-*-2299" - "l-*-2297" - "l-*-2294" - "l-*-2292" - "l-*-2290" - "l-*-2288" - "l-*-2286" - "l-*-2284" - "l-*-2282" - "l-*-2280" - "l-*-2278" - "l-*-2276" - "l-*-2274" - "l-*-2272" - "l-*-2270" - "l-*-2268" - "l-*-2266" - "l-*-2264" - "l-*-2262" - "l-*-2260")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("l-*-2098" - "l-*-2097" - "l-*-2096"))) - (hygiene guile)) - '(()))) - #f) - (values '_ ids-14832) + (if (bound-id-member?-4578 p-15265 keys-15259) + (values (vector 'free-id p-15265) ids-15267) + (if (free-id=?-4574 + p-15265 + '#(syntax-object + _ + ((top) + #(ribcage () () ()) + #(ribcage + #(p n ids) + #((top) (top) (top)) + #("l-*-3927" "l-*-3928" "l-*-3929")) + #(ribcage + (cvt v-reverse cvt*) + ((top) (top) (top)) + ("l-*-3900" "l-*-3898" "l-*-3896")) + #(ribcage + #(pattern keys) + #((top) (top)) + #("l-*-3894" "l-*-3895")) + #(ribcage + (gen-syntax-case + gen-clause + build-dispatch-call + convert-pattern) + ((top) (top) (top) (top)) + ("l-*-3890" + "l-*-3888" + "l-*-3886" + "l-*-3884")) + #(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=? + with-transformer-environment + transformer-environment + resolve-identifier + locally-bound-identifiers + 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 + session-id + 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) + (top) + (top) + (top)) + ("l-*-478" + "l-*-476" + "l-*-474" + "l-*-472" + "l-*-470" + "l-*-468" + "l-*-466" + "l-*-464" + "l-*-462" + "l-*-460" + "l-*-458" + "l-*-456" + "l-*-454" + "l-*-452" + "l-*-450" + "l-*-448" + "l-*-446" + "l-*-444" + "l-*-442" + "l-*-440" + "l-*-438" + "l-*-436" + "l-*-434" + "l-*-432" + "l-*-430" + "l-*-428" + "l-*-426" + "l-*-424" + "l-*-422" + "l-*-420" + "l-*-418" + "l-*-416" + "l-*-414" + "l-*-412" + "l-*-410" + "l-*-408" + "l-*-406" + "l-*-404" + "l-*-402" + "l-*-401" + "l-*-399" + "l-*-396" + "l-*-395" + "l-*-394" + "l-*-392" + "l-*-391" + "l-*-389" + "l-*-387" + "l-*-385" + "l-*-383" + "l-*-381" + "l-*-379" + "l-*-377" + "l-*-375" + "l-*-372" + "l-*-370" + "l-*-369" + "l-*-367" + "l-*-365" + "l-*-363" + "l-*-361" + "l-*-360" + "l-*-359" + "l-*-358" + "l-*-356" + "l-*-355" + "l-*-352" + "l-*-350" + "l-*-348" + "l-*-346" + "l-*-344" + "l-*-342" + "l-*-341" + "l-*-340" + "l-*-338" + "l-*-336" + "l-*-335" + "l-*-332" + "l-*-331" + "l-*-329" + "l-*-327" + "l-*-325" + "l-*-323" + "l-*-321" + "l-*-319" + "l-*-317" + "l-*-315" + "l-*-313" + "l-*-310" + "l-*-308" + "l-*-306" + "l-*-304" + "l-*-302" + "l-*-300" + "l-*-298" + "l-*-296" + "l-*-294" + "l-*-292" + "l-*-290" + "l-*-288" + "l-*-286" + "l-*-284" + "l-*-282" + "l-*-280" + "l-*-278" + "l-*-276" + "l-*-274" + "l-*-272" + "l-*-270" + "l-*-268" + "l-*-266" + "l-*-264" + "l-*-262" + "l-*-260" + "l-*-258" + "l-*-257" + "l-*-256" + "l-*-255" + "l-*-254" + "l-*-252" + "l-*-250" + "l-*-248" + "l-*-245" + "l-*-243" + "l-*-241" + "l-*-239" + "l-*-237" + "l-*-235" + "l-*-233" + "l-*-231" + "l-*-229" + "l-*-227" + "l-*-225" + "l-*-223" + "l-*-221" + "l-*-219" + "l-*-217" + "l-*-215" + "l-*-213" + "l-*-211" + "l-*-209")) + #(ribcage + (define-structure + define-expansion-accessors + define-expansion-constructors) + ((top) (top) (top)) + ("l-*-47" "l-*-46" "l-*-45")) + #(ribcage () () ())) + (hygiene guile))) + (values '_ ids-15267) (values 'any - (cons (cons p-14830 n-14831) ids-14832)))) - (let ((tmp-15152 ($sc-dispatch p-14830 '(any any)))) - (if (if tmp-15152 + (cons (cons p-15265 n-15266) ids-15267)))) + (let ((tmp-15399 ($sc-dispatch p-15265 '(any any)))) + (if (if tmp-15399 (@apply - (lambda (x-15156 dots-15157) - (if (if (if (vector? dots-15157) - (if (= (vector-length dots-15157) + (lambda (x-15403 dots-15404) + (if (if (if (vector? dots-15404) + (if (= (vector-length dots-15404) 4) - (eq? (vector-ref dots-15157 0) + (eq? (vector-ref dots-15404 0) 'syntax-object) #f) #f) - (symbol? (vector-ref dots-15157 1)) + (symbol? (vector-ref dots-15404 1)) #f) - (if (eq? (if (if (vector? dots-15157) - (if (= (vector-length - dots-15157) - 4) - (eq? (vector-ref - dots-15157 - 0) - 'syntax-object) - #f) - #f) - (vector-ref dots-15157 1) - dots-15157) - (if (if (= (vector-length - '#(syntax-object - ... - ((top) - #(ribcage - () - () - ()) - #(ribcage - () - () - ()) - #(ribcage - #(x) - #((top)) - #("l-*-4404")) - #(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=? - with-transformer-environment - transformer-environment - resolve-identifier - locally-bound-identifiers - 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 - session-id - 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) - (top) - (top) - (top) - (top)) - ("l-*-2527" - "l-*-2525" - "l-*-2523" - "l-*-2521" - "l-*-2519" - "l-*-2517" - "l-*-2515" - "l-*-2513" - "l-*-2511" - "l-*-2509" - "l-*-2507" - "l-*-2505" - "l-*-2503" - "l-*-2501" - "l-*-2499" - "l-*-2497" - "l-*-2495" - "l-*-2493" - "l-*-2491" - "l-*-2489" - "l-*-2487" - "l-*-2485" - "l-*-2483" - "l-*-2481" - "l-*-2479" - "l-*-2477" - "l-*-2475" - "l-*-2473" - "l-*-2471" - "l-*-2469" - "l-*-2467" - "l-*-2465" - "l-*-2463" - "l-*-2461" - "l-*-2459" - "l-*-2457" - "l-*-2455" - "l-*-2453" - "l-*-2451" - "l-*-2450" - "l-*-2448" - "l-*-2445" - "l-*-2444" - "l-*-2443" - "l-*-2441" - "l-*-2440" - "l-*-2438" - "l-*-2436" - "l-*-2434" - "l-*-2432" - "l-*-2430" - "l-*-2428" - "l-*-2426" - "l-*-2424" - "l-*-2421" - "l-*-2419" - "l-*-2418" - "l-*-2416" - "l-*-2414" - "l-*-2412" - "l-*-2410" - "l-*-2409" - "l-*-2408" - "l-*-2407" - "l-*-2405" - "l-*-2404" - "l-*-2401" - "l-*-2399" - "l-*-2397" - "l-*-2395" - "l-*-2393" - "l-*-2391" - "l-*-2389" - "l-*-2388" - "l-*-2387" - "l-*-2385" - "l-*-2383" - "l-*-2382" - "l-*-2379" - "l-*-2378" - "l-*-2376" - "l-*-2374" - "l-*-2372" - "l-*-2370" - "l-*-2368" - "l-*-2366" - "l-*-2364" - "l-*-2362" - "l-*-2360" - "l-*-2357" - "l-*-2355" - "l-*-2353" - "l-*-2351" - "l-*-2349" - "l-*-2347" - "l-*-2345" - "l-*-2343" - "l-*-2341" - "l-*-2339" - "l-*-2337" - "l-*-2335" - "l-*-2333" - "l-*-2331" - "l-*-2329" - "l-*-2327" - "l-*-2325" - "l-*-2323" - "l-*-2321" - "l-*-2319" - "l-*-2317" - "l-*-2315" - "l-*-2313" - "l-*-2311" - "l-*-2309" - "l-*-2307" - "l-*-2306" - "l-*-2305" - "l-*-2304" - "l-*-2303" - "l-*-2301" - "l-*-2299" - "l-*-2297" - "l-*-2294" - "l-*-2292" - "l-*-2290" - "l-*-2288" - "l-*-2286" - "l-*-2284" - "l-*-2282" - "l-*-2280" - "l-*-2278" - "l-*-2276" - "l-*-2274" - "l-*-2272" - "l-*-2270" - "l-*-2268" - "l-*-2266" - "l-*-2264" - "l-*-2262" - "l-*-2260")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) - (top) - (top)) - ("l-*-2098" - "l-*-2097" - "l-*-2096"))) - (hygiene - guile))) - 4) - #t - #f) - '... - '#(syntax-object - ... - ((top) - #(ribcage () () ()) - #(ribcage () () ()) - #(ribcage - #(x) - #((top)) - #("l-*-4404")) - #(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=? - with-transformer-environment - transformer-environment - resolve-identifier - locally-bound-identifiers - 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 - session-id - 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) - (top) - (top) - (top) - (top)) - ("l-*-2527" - "l-*-2525" - "l-*-2523" - "l-*-2521" - "l-*-2519" - "l-*-2517" - "l-*-2515" - "l-*-2513" - "l-*-2511" - "l-*-2509" - "l-*-2507" - "l-*-2505" - "l-*-2503" - "l-*-2501" - "l-*-2499" - "l-*-2497" - "l-*-2495" - "l-*-2493" - "l-*-2491" - "l-*-2489" - "l-*-2487" - "l-*-2485" - "l-*-2483" - "l-*-2481" - "l-*-2479" - "l-*-2477" - "l-*-2475" - "l-*-2473" - "l-*-2471" - "l-*-2469" - "l-*-2467" - "l-*-2465" - "l-*-2463" - "l-*-2461" - "l-*-2459" - "l-*-2457" - "l-*-2455" - "l-*-2453" - "l-*-2451" - "l-*-2450" - "l-*-2448" - "l-*-2445" - "l-*-2444" - "l-*-2443" - "l-*-2441" - "l-*-2440" - "l-*-2438" - "l-*-2436" - "l-*-2434" - "l-*-2432" - "l-*-2430" - "l-*-2428" - "l-*-2426" - "l-*-2424" - "l-*-2421" - "l-*-2419" - "l-*-2418" - "l-*-2416" - "l-*-2414" - "l-*-2412" - "l-*-2410" - "l-*-2409" - "l-*-2408" - "l-*-2407" - "l-*-2405" - "l-*-2404" - "l-*-2401" - "l-*-2399" - "l-*-2397" - "l-*-2395" - "l-*-2393" - "l-*-2391" - "l-*-2389" - "l-*-2388" - "l-*-2387" - "l-*-2385" - "l-*-2383" - "l-*-2382" - "l-*-2379" - "l-*-2378" - "l-*-2376" - "l-*-2374" - "l-*-2372" - "l-*-2370" - "l-*-2368" - "l-*-2366" - "l-*-2364" - "l-*-2362" - "l-*-2360" - "l-*-2357" - "l-*-2355" - "l-*-2353" - "l-*-2351" - "l-*-2349" - "l-*-2347" - "l-*-2345" - "l-*-2343" - "l-*-2341" - "l-*-2339" - "l-*-2337" - "l-*-2335" - "l-*-2333" - "l-*-2331" - "l-*-2329" - "l-*-2327" - "l-*-2325" - "l-*-2323" - "l-*-2321" - "l-*-2319" - "l-*-2317" - "l-*-2315" - "l-*-2313" - "l-*-2311" - "l-*-2309" - "l-*-2307" - "l-*-2306" - "l-*-2305" - "l-*-2304" - "l-*-2303" - "l-*-2301" - "l-*-2299" - "l-*-2297" - "l-*-2294" - "l-*-2292" - "l-*-2290" - "l-*-2288" - "l-*-2286" - "l-*-2284" - "l-*-2282" - "l-*-2280" - "l-*-2278" - "l-*-2276" - "l-*-2274" - "l-*-2272" - "l-*-2270" - "l-*-2268" - "l-*-2266" - "l-*-2264" - "l-*-2262" - "l-*-2260")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("l-*-2098" - "l-*-2097" - "l-*-2096"))) - (hygiene guile)))) - (eq? (id-var-name-6568 - dots-15157 - '(())) - (id-var-name-6568 - '#(syntax-object - ... - ((top) - #(ribcage () () ()) - #(ribcage () () ()) - #(ribcage - #(x) - #((top)) - #("l-*-4404")) - #(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=? - with-transformer-environment - transformer-environment - resolve-identifier - locally-bound-identifiers - 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 - session-id - 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) - (top) - (top) - (top) - (top)) - ("l-*-2527" - "l-*-2525" - "l-*-2523" - "l-*-2521" - "l-*-2519" - "l-*-2517" - "l-*-2515" - "l-*-2513" - "l-*-2511" - "l-*-2509" - "l-*-2507" - "l-*-2505" - "l-*-2503" - "l-*-2501" - "l-*-2499" - "l-*-2497" - "l-*-2495" - "l-*-2493" - "l-*-2491" - "l-*-2489" - "l-*-2487" - "l-*-2485" - "l-*-2483" - "l-*-2481" - "l-*-2479" - "l-*-2477" - "l-*-2475" - "l-*-2473" - "l-*-2471" - "l-*-2469" - "l-*-2467" - "l-*-2465" - "l-*-2463" - "l-*-2461" - "l-*-2459" - "l-*-2457" - "l-*-2455" - "l-*-2453" - "l-*-2451" - "l-*-2450" - "l-*-2448" - "l-*-2445" - "l-*-2444" - "l-*-2443" - "l-*-2441" - "l-*-2440" - "l-*-2438" - "l-*-2436" - "l-*-2434" - "l-*-2432" - "l-*-2430" - "l-*-2428" - "l-*-2426" - "l-*-2424" - "l-*-2421" - "l-*-2419" - "l-*-2418" - "l-*-2416" - "l-*-2414" - "l-*-2412" - "l-*-2410" - "l-*-2409" - "l-*-2408" - "l-*-2407" - "l-*-2405" - "l-*-2404" - "l-*-2401" - "l-*-2399" - "l-*-2397" - "l-*-2395" - "l-*-2393" - "l-*-2391" - "l-*-2389" - "l-*-2388" - "l-*-2387" - "l-*-2385" - "l-*-2383" - "l-*-2382" - "l-*-2379" - "l-*-2378" - "l-*-2376" - "l-*-2374" - "l-*-2372" - "l-*-2370" - "l-*-2368" - "l-*-2366" - "l-*-2364" - "l-*-2362" - "l-*-2360" - "l-*-2357" - "l-*-2355" - "l-*-2353" - "l-*-2351" - "l-*-2349" - "l-*-2347" - "l-*-2345" - "l-*-2343" - "l-*-2341" - "l-*-2339" - "l-*-2337" - "l-*-2335" - "l-*-2333" - "l-*-2331" - "l-*-2329" - "l-*-2327" - "l-*-2325" - "l-*-2323" - "l-*-2321" - "l-*-2319" - "l-*-2317" - "l-*-2315" - "l-*-2313" - "l-*-2311" - "l-*-2309" - "l-*-2307" - "l-*-2306" - "l-*-2305" - "l-*-2304" - "l-*-2303" - "l-*-2301" - "l-*-2299" - "l-*-2297" - "l-*-2294" - "l-*-2292" - "l-*-2290" - "l-*-2288" - "l-*-2286" - "l-*-2284" - "l-*-2282" - "l-*-2280" - "l-*-2278" - "l-*-2276" - "l-*-2274" - "l-*-2272" - "l-*-2270" - "l-*-2268" - "l-*-2266" - "l-*-2264" - "l-*-2262" - "l-*-2260")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("l-*-2098" - "l-*-2097" - "l-*-2096"))) - (hygiene guile)) - '(()))) - #f) + (free-id=?-4574 + dots-15404 + '#(syntax-object + ... + ((top) + #(ribcage () () ()) + #(ribcage () () ()) + #(ribcage + #(x) + #((top)) + #("l-*-2416")) + #(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=? + with-transformer-environment + transformer-environment + resolve-identifier + locally-bound-identifiers + 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 + session-id + 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) + (top) + (top) + (top)) + ("l-*-478" + "l-*-476" + "l-*-474" + "l-*-472" + "l-*-470" + "l-*-468" + "l-*-466" + "l-*-464" + "l-*-462" + "l-*-460" + "l-*-458" + "l-*-456" + "l-*-454" + "l-*-452" + "l-*-450" + "l-*-448" + "l-*-446" + "l-*-444" + "l-*-442" + "l-*-440" + "l-*-438" + "l-*-436" + "l-*-434" + "l-*-432" + "l-*-430" + "l-*-428" + "l-*-426" + "l-*-424" + "l-*-422" + "l-*-420" + "l-*-418" + "l-*-416" + "l-*-414" + "l-*-412" + "l-*-410" + "l-*-408" + "l-*-406" + "l-*-404" + "l-*-402" + "l-*-401" + "l-*-399" + "l-*-396" + "l-*-395" + "l-*-394" + "l-*-392" + "l-*-391" + "l-*-389" + "l-*-387" + "l-*-385" + "l-*-383" + "l-*-381" + "l-*-379" + "l-*-377" + "l-*-375" + "l-*-372" + "l-*-370" + "l-*-369" + "l-*-367" + "l-*-365" + "l-*-363" + "l-*-361" + "l-*-360" + "l-*-359" + "l-*-358" + "l-*-356" + "l-*-355" + "l-*-352" + "l-*-350" + "l-*-348" + "l-*-346" + "l-*-344" + "l-*-342" + "l-*-341" + "l-*-340" + "l-*-338" + "l-*-336" + "l-*-335" + "l-*-332" + "l-*-331" + "l-*-329" + "l-*-327" + "l-*-325" + "l-*-323" + "l-*-321" + "l-*-319" + "l-*-317" + "l-*-315" + "l-*-313" + "l-*-310" + "l-*-308" + "l-*-306" + "l-*-304" + "l-*-302" + "l-*-300" + "l-*-298" + "l-*-296" + "l-*-294" + "l-*-292" + "l-*-290" + "l-*-288" + "l-*-286" + "l-*-284" + "l-*-282" + "l-*-280" + "l-*-278" + "l-*-276" + "l-*-274" + "l-*-272" + "l-*-270" + "l-*-268" + "l-*-266" + "l-*-264" + "l-*-262" + "l-*-260" + "l-*-258" + "l-*-257" + "l-*-256" + "l-*-255" + "l-*-254" + "l-*-252" + "l-*-250" + "l-*-248" + "l-*-245" + "l-*-243" + "l-*-241" + "l-*-239" + "l-*-237" + "l-*-235" + "l-*-233" + "l-*-231" + "l-*-229" + "l-*-227" + "l-*-225" + "l-*-223" + "l-*-221" + "l-*-219" + "l-*-217" + "l-*-215" + "l-*-213" + "l-*-211" + "l-*-209")) + #(ribcage + (define-structure + define-expansion-accessors + define-expansion-constructors) + ((top) (top) (top)) + ("l-*-47" "l-*-46" "l-*-45")) + #(ribcage () () ())) + (hygiene guile))) #f)) - tmp-15152) + tmp-15399) #f) (@apply - (lambda (x-15257 dots-15258) + (lambda (x-15443 dots-15444) (call-with-values (lambda () - (cvt-14827 - x-15257 - (#{1+}# n-14831) - ids-14832)) - (lambda (p-15259 ids-15260) + (cvt-15262 + x-15443 + (#{1+}# n-15266) + ids-15267)) + (lambda (p-15445 ids-15446) (values - (if (eq? p-15259 'any) + (if (eq? p-15445 'any) 'each-any - (vector 'each p-15259)) - ids-15260)))) - tmp-15152) - (let ((tmp-15261 - ($sc-dispatch p-14830 '(any any . any)))) - (if (if tmp-15261 + (vector 'each p-15445)) + ids-15446)))) + tmp-15399) + (let ((tmp-15447 + ($sc-dispatch p-15265 '(any any . any)))) + (if (if tmp-15447 (@apply - (lambda (x-15265 dots-15266 ys-15267) - (if (if (if (vector? dots-15266) + (lambda (x-15451 dots-15452 ys-15453) + (if (if (if (vector? dots-15452) (if (= (vector-length - dots-15266) + dots-15452) 4) (eq? (vector-ref - dots-15266 + dots-15452 0) 'syntax-object) #f) #f) (symbol? - (vector-ref dots-15266 1)) + (vector-ref dots-15452 1)) #f) - (if (eq? (if (if (vector? dots-15266) - (if (= (vector-length - dots-15266) - 4) - (eq? (vector-ref - dots-15266 - 0) - 'syntax-object) - #f) - #f) - (vector-ref dots-15266 1) - dots-15266) - (if (if (= (vector-length - '#(syntax-object - ... - ((top) - #(ribcage - () - () - ()) - #(ribcage - () - () - ()) - #(ribcage - #(x) - #((top)) - #("l-*-4404")) - #(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=? - with-transformer-environment - transformer-environment - resolve-identifier - locally-bound-identifiers - 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 - session-id - 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) - (top) - (top) - (top) - (top)) - ("l-*-2527" - "l-*-2525" - "l-*-2523" - "l-*-2521" - "l-*-2519" - "l-*-2517" - "l-*-2515" - "l-*-2513" - "l-*-2511" - "l-*-2509" - "l-*-2507" - "l-*-2505" - "l-*-2503" - "l-*-2501" - "l-*-2499" - "l-*-2497" - "l-*-2495" - "l-*-2493" - "l-*-2491" - "l-*-2489" - "l-*-2487" - "l-*-2485" - "l-*-2483" - "l-*-2481" - "l-*-2479" - "l-*-2477" - "l-*-2475" - "l-*-2473" - "l-*-2471" - "l-*-2469" - "l-*-2467" - "l-*-2465" - "l-*-2463" - "l-*-2461" - "l-*-2459" - "l-*-2457" - "l-*-2455" - "l-*-2453" - "l-*-2451" - "l-*-2450" - "l-*-2448" - "l-*-2445" - "l-*-2444" - "l-*-2443" - "l-*-2441" - "l-*-2440" - "l-*-2438" - "l-*-2436" - "l-*-2434" - "l-*-2432" - "l-*-2430" - "l-*-2428" - "l-*-2426" - "l-*-2424" - "l-*-2421" - "l-*-2419" - "l-*-2418" - "l-*-2416" - "l-*-2414" - "l-*-2412" - "l-*-2410" - "l-*-2409" - "l-*-2408" - "l-*-2407" - "l-*-2405" - "l-*-2404" - "l-*-2401" - "l-*-2399" - "l-*-2397" - "l-*-2395" - "l-*-2393" - "l-*-2391" - "l-*-2389" - "l-*-2388" - "l-*-2387" - "l-*-2385" - "l-*-2383" - "l-*-2382" - "l-*-2379" - "l-*-2378" - "l-*-2376" - "l-*-2374" - "l-*-2372" - "l-*-2370" - "l-*-2368" - "l-*-2366" - "l-*-2364" - "l-*-2362" - "l-*-2360" - "l-*-2357" - "l-*-2355" - "l-*-2353" - "l-*-2351" - "l-*-2349" - "l-*-2347" - "l-*-2345" - "l-*-2343" - "l-*-2341" - "l-*-2339" - "l-*-2337" - "l-*-2335" - "l-*-2333" - "l-*-2331" - "l-*-2329" - "l-*-2327" - "l-*-2325" - "l-*-2323" - "l-*-2321" - "l-*-2319" - "l-*-2317" - "l-*-2315" - "l-*-2313" - "l-*-2311" - "l-*-2309" - "l-*-2307" - "l-*-2306" - "l-*-2305" - "l-*-2304" - "l-*-2303" - "l-*-2301" - "l-*-2299" - "l-*-2297" - "l-*-2294" - "l-*-2292" - "l-*-2290" - "l-*-2288" - "l-*-2286" - "l-*-2284" - "l-*-2282" - "l-*-2280" - "l-*-2278" - "l-*-2276" - "l-*-2274" - "l-*-2272" - "l-*-2270" - "l-*-2268" - "l-*-2266" - "l-*-2264" - "l-*-2262" - "l-*-2260")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) - (top) - (top)) - ("l-*-2098" - "l-*-2097" - "l-*-2096"))) - (hygiene - guile))) - 4) - #t - #f) - '... - '#(syntax-object - ... - ((top) - #(ribcage () () ()) - #(ribcage () () ()) - #(ribcage - #(x) - #((top)) - #("l-*-4404")) - #(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=? - with-transformer-environment - transformer-environment - resolve-identifier - locally-bound-identifiers - 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 - session-id - 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) - (top) - (top) - (top) - (top)) - ("l-*-2527" - "l-*-2525" - "l-*-2523" - "l-*-2521" - "l-*-2519" - "l-*-2517" - "l-*-2515" - "l-*-2513" - "l-*-2511" - "l-*-2509" - "l-*-2507" - "l-*-2505" - "l-*-2503" - "l-*-2501" - "l-*-2499" - "l-*-2497" - "l-*-2495" - "l-*-2493" - "l-*-2491" - "l-*-2489" - "l-*-2487" - "l-*-2485" - "l-*-2483" - "l-*-2481" - "l-*-2479" - "l-*-2477" - "l-*-2475" - "l-*-2473" - "l-*-2471" - "l-*-2469" - "l-*-2467" - "l-*-2465" - "l-*-2463" - "l-*-2461" - "l-*-2459" - "l-*-2457" - "l-*-2455" - "l-*-2453" - "l-*-2451" - "l-*-2450" - "l-*-2448" - "l-*-2445" - "l-*-2444" - "l-*-2443" - "l-*-2441" - "l-*-2440" - "l-*-2438" - "l-*-2436" - "l-*-2434" - "l-*-2432" - "l-*-2430" - "l-*-2428" - "l-*-2426" - "l-*-2424" - "l-*-2421" - "l-*-2419" - "l-*-2418" - "l-*-2416" - "l-*-2414" - "l-*-2412" - "l-*-2410" - "l-*-2409" - "l-*-2408" - "l-*-2407" - "l-*-2405" - "l-*-2404" - "l-*-2401" - "l-*-2399" - "l-*-2397" - "l-*-2395" - "l-*-2393" - "l-*-2391" - "l-*-2389" - "l-*-2388" - "l-*-2387" - "l-*-2385" - "l-*-2383" - "l-*-2382" - "l-*-2379" - "l-*-2378" - "l-*-2376" - "l-*-2374" - "l-*-2372" - "l-*-2370" - "l-*-2368" - "l-*-2366" - "l-*-2364" - "l-*-2362" - "l-*-2360" - "l-*-2357" - "l-*-2355" - "l-*-2353" - "l-*-2351" - "l-*-2349" - "l-*-2347" - "l-*-2345" - "l-*-2343" - "l-*-2341" - "l-*-2339" - "l-*-2337" - "l-*-2335" - "l-*-2333" - "l-*-2331" - "l-*-2329" - "l-*-2327" - "l-*-2325" - "l-*-2323" - "l-*-2321" - "l-*-2319" - "l-*-2317" - "l-*-2315" - "l-*-2313" - "l-*-2311" - "l-*-2309" - "l-*-2307" - "l-*-2306" - "l-*-2305" - "l-*-2304" - "l-*-2303" - "l-*-2301" - "l-*-2299" - "l-*-2297" - "l-*-2294" - "l-*-2292" - "l-*-2290" - "l-*-2288" - "l-*-2286" - "l-*-2284" - "l-*-2282" - "l-*-2280" - "l-*-2278" - "l-*-2276" - "l-*-2274" - "l-*-2272" - "l-*-2270" - "l-*-2268" - "l-*-2266" - "l-*-2264" - "l-*-2262" - "l-*-2260")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("l-*-2098" - "l-*-2097" - "l-*-2096"))) - (hygiene guile)))) - (eq? (id-var-name-6568 - dots-15266 - '(())) - (id-var-name-6568 - '#(syntax-object - ... - ((top) - #(ribcage () () ()) - #(ribcage () () ()) - #(ribcage - #(x) - #((top)) - #("l-*-4404")) - #(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=? - with-transformer-environment - transformer-environment - resolve-identifier - locally-bound-identifiers - 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 - session-id - 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) - (top) - (top) - (top) - (top)) - ("l-*-2527" - "l-*-2525" - "l-*-2523" - "l-*-2521" - "l-*-2519" - "l-*-2517" - "l-*-2515" - "l-*-2513" - "l-*-2511" - "l-*-2509" - "l-*-2507" - "l-*-2505" - "l-*-2503" - "l-*-2501" - "l-*-2499" - "l-*-2497" - "l-*-2495" - "l-*-2493" - "l-*-2491" - "l-*-2489" - "l-*-2487" - "l-*-2485" - "l-*-2483" - "l-*-2481" - "l-*-2479" - "l-*-2477" - "l-*-2475" - "l-*-2473" - "l-*-2471" - "l-*-2469" - "l-*-2467" - "l-*-2465" - "l-*-2463" - "l-*-2461" - "l-*-2459" - "l-*-2457" - "l-*-2455" - "l-*-2453" - "l-*-2451" - "l-*-2450" - "l-*-2448" - "l-*-2445" - "l-*-2444" - "l-*-2443" - "l-*-2441" - "l-*-2440" - "l-*-2438" - "l-*-2436" - "l-*-2434" - "l-*-2432" - "l-*-2430" - "l-*-2428" - "l-*-2426" - "l-*-2424" - "l-*-2421" - "l-*-2419" - "l-*-2418" - "l-*-2416" - "l-*-2414" - "l-*-2412" - "l-*-2410" - "l-*-2409" - "l-*-2408" - "l-*-2407" - "l-*-2405" - "l-*-2404" - "l-*-2401" - "l-*-2399" - "l-*-2397" - "l-*-2395" - "l-*-2393" - "l-*-2391" - "l-*-2389" - "l-*-2388" - "l-*-2387" - "l-*-2385" - "l-*-2383" - "l-*-2382" - "l-*-2379" - "l-*-2378" - "l-*-2376" - "l-*-2374" - "l-*-2372" - "l-*-2370" - "l-*-2368" - "l-*-2366" - "l-*-2364" - "l-*-2362" - "l-*-2360" - "l-*-2357" - "l-*-2355" - "l-*-2353" - "l-*-2351" - "l-*-2349" - "l-*-2347" - "l-*-2345" - "l-*-2343" - "l-*-2341" - "l-*-2339" - "l-*-2337" - "l-*-2335" - "l-*-2333" - "l-*-2331" - "l-*-2329" - "l-*-2327" - "l-*-2325" - "l-*-2323" - "l-*-2321" - "l-*-2319" - "l-*-2317" - "l-*-2315" - "l-*-2313" - "l-*-2311" - "l-*-2309" - "l-*-2307" - "l-*-2306" - "l-*-2305" - "l-*-2304" - "l-*-2303" - "l-*-2301" - "l-*-2299" - "l-*-2297" - "l-*-2294" - "l-*-2292" - "l-*-2290" - "l-*-2288" - "l-*-2286" - "l-*-2284" - "l-*-2282" - "l-*-2280" - "l-*-2278" - "l-*-2276" - "l-*-2274" - "l-*-2272" - "l-*-2270" - "l-*-2268" - "l-*-2266" - "l-*-2264" - "l-*-2262" - "l-*-2260")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("l-*-2098" - "l-*-2097" - "l-*-2096"))) - (hygiene guile)) - '(()))) - #f) + (free-id=?-4574 + dots-15452 + '#(syntax-object + ... + ((top) + #(ribcage () () ()) + #(ribcage () () ()) + #(ribcage + #(x) + #((top)) + #("l-*-2416")) + #(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=? + with-transformer-environment + transformer-environment + resolve-identifier + locally-bound-identifiers + 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 + session-id + 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) + (top) + (top) + (top)) + ("l-*-478" + "l-*-476" + "l-*-474" + "l-*-472" + "l-*-470" + "l-*-468" + "l-*-466" + "l-*-464" + "l-*-462" + "l-*-460" + "l-*-458" + "l-*-456" + "l-*-454" + "l-*-452" + "l-*-450" + "l-*-448" + "l-*-446" + "l-*-444" + "l-*-442" + "l-*-440" + "l-*-438" + "l-*-436" + "l-*-434" + "l-*-432" + "l-*-430" + "l-*-428" + "l-*-426" + "l-*-424" + "l-*-422" + "l-*-420" + "l-*-418" + "l-*-416" + "l-*-414" + "l-*-412" + "l-*-410" + "l-*-408" + "l-*-406" + "l-*-404" + "l-*-402" + "l-*-401" + "l-*-399" + "l-*-396" + "l-*-395" + "l-*-394" + "l-*-392" + "l-*-391" + "l-*-389" + "l-*-387" + "l-*-385" + "l-*-383" + "l-*-381" + "l-*-379" + "l-*-377" + "l-*-375" + "l-*-372" + "l-*-370" + "l-*-369" + "l-*-367" + "l-*-365" + "l-*-363" + "l-*-361" + "l-*-360" + "l-*-359" + "l-*-358" + "l-*-356" + "l-*-355" + "l-*-352" + "l-*-350" + "l-*-348" + "l-*-346" + "l-*-344" + "l-*-342" + "l-*-341" + "l-*-340" + "l-*-338" + "l-*-336" + "l-*-335" + "l-*-332" + "l-*-331" + "l-*-329" + "l-*-327" + "l-*-325" + "l-*-323" + "l-*-321" + "l-*-319" + "l-*-317" + "l-*-315" + "l-*-313" + "l-*-310" + "l-*-308" + "l-*-306" + "l-*-304" + "l-*-302" + "l-*-300" + "l-*-298" + "l-*-296" + "l-*-294" + "l-*-292" + "l-*-290" + "l-*-288" + "l-*-286" + "l-*-284" + "l-*-282" + "l-*-280" + "l-*-278" + "l-*-276" + "l-*-274" + "l-*-272" + "l-*-270" + "l-*-268" + "l-*-266" + "l-*-264" + "l-*-262" + "l-*-260" + "l-*-258" + "l-*-257" + "l-*-256" + "l-*-255" + "l-*-254" + "l-*-252" + "l-*-250" + "l-*-248" + "l-*-245" + "l-*-243" + "l-*-241" + "l-*-239" + "l-*-237" + "l-*-235" + "l-*-233" + "l-*-231" + "l-*-229" + "l-*-227" + "l-*-225" + "l-*-223" + "l-*-221" + "l-*-219" + "l-*-217" + "l-*-215" + "l-*-213" + "l-*-211" + "l-*-209")) + #(ribcage + (define-structure + define-expansion-accessors + define-expansion-constructors) + ((top) (top) (top)) + ("l-*-47" "l-*-46" "l-*-45")) + #(ribcage () () ())) + (hygiene guile))) #f)) - tmp-15261) + tmp-15447) #f) (@apply - (lambda (x-15367 dots-15368 ys-15369) + (lambda (x-15492 dots-15493 ys-15494) (call-with-values (lambda () - (cvt*-14825 - ys-15369 - n-14831 - ids-14832)) - (lambda (ys-15372 ids-15373) + (cvt*-15260 + ys-15494 + n-15266 + ids-15267)) + (lambda (ys-15979 ids-15980) (call-with-values (lambda () - (cvt-14827 - x-15367 - (#{1+}# n-14831) - ids-15373)) - (lambda (x-15374 ids-15375) + (cvt-15262 + x-15492 + (#{1+}# n-15266) + ids-15980)) + (lambda (x-15981 ids-15982) (call-with-values (lambda () - (v-reverse-14826 ys-15372)) - (lambda (ys-15408 e-15409) + (v-reverse-15261 ys-15979)) + (lambda (ys-16018 e-16019) (values (vector 'each+ - x-15374 - ys-15408 - e-15409) - ids-15375)))))))) - tmp-15261) - (let ((tmp-15410 - ($sc-dispatch p-14830 '(any . any)))) - (if tmp-15410 + x-15981 + ys-16018 + e-16019) + ids-15982)))))))) + tmp-15447) + (let ((tmp-16020 + ($sc-dispatch p-15265 '(any . any)))) + (if tmp-16020 (@apply - (lambda (x-15414 y-15415) + (lambda (x-16024 y-16025) (call-with-values (lambda () - (cvt-14827 - y-15415 - n-14831 - ids-14832)) - (lambda (y-15416 ids-15417) + (cvt-15262 + y-16025 + n-15266 + ids-15267)) + (lambda (y-16026 ids-16027) (call-with-values (lambda () - (cvt-14827 - x-15414 - n-14831 - ids-15417)) - (lambda (x-15418 ids-15419) + (cvt-15262 + x-16024 + n-15266 + ids-16027)) + (lambda (x-16028 ids-16029) (values - (cons x-15418 y-15416) - ids-15419)))))) - tmp-15410) - (let ((tmp-15420 - ($sc-dispatch p-14830 '()))) - (if tmp-15420 + (cons x-16028 y-16026) + ids-16029)))))) + tmp-16020) + (let ((tmp-16030 + ($sc-dispatch p-15265 '()))) + (if tmp-16030 (@apply - (lambda () (values '() ids-14832)) - tmp-15420) - (let ((tmp-15424 + (lambda () (values '() ids-15267)) + tmp-16030) + (let ((tmp-16034 ($sc-dispatch - p-14830 + p-15265 '#(vector each-any)))) - (if tmp-15424 + (if tmp-16034 (@apply - (lambda (x-15428) + (lambda (x-16038) (call-with-values (lambda () - (cvt-14827 - x-15428 - n-14831 - ids-14832)) - (lambda (p-15429 ids-15430) + (cvt-15262 + x-16038 + n-15266 + ids-15267)) + (lambda (p-16039 ids-16040) (values - (vector 'vector p-15429) - ids-15430)))) - tmp-15424) + (vector 'vector p-16039) + ids-16040)))) + tmp-16034) (values (vector 'atom - (strip-6598 p-14830 '(()))) - ids-14832))))))))))))))) - (cvt-14827 pattern-14823 0 '())))) - (build-dispatch-call-13227 - (lambda (pvars-15543 exp-15544 y-15545 r-15546 mod-15547) - (let ((ids-15548 (map car pvars-15543))) + (strip-4599 p-15265 '(()))) + ids-15267))))))))))))))) + (cvt-15262 pattern-15258 0 '())))) + (build-dispatch-call-13637 + (lambda (pvars-16174 exp-16175 y-16176 r-16177 mod-16178) + (let ((ids-16179 (map car pvars-16174))) (begin - (map cdr pvars-15543) - (let ((labels-15550 (gen-labels-6552 ids-15548)) - (new-vars-15551 (map gen-var-6599 ids-15548))) - (build-application-6516 + (map cdr pvars-16174) + (let ((labels-16181 (gen-labels-4553 ids-16179)) + (new-vars-16182 (map gen-var-4600 ids-16179))) + (build-primcall-4529 #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-6525 + 'apply + (list (build-simple-lambda-4526 #f - (map syntax->datum ids-15548) + (map syntax->datum ids-16179) #f - new-vars-15551 + new-vars-16182 '() - (expand-6585 - exp-15544 - (extend-env-6543 - labels-15550 - (map (lambda (var-15874 level-15875) + (expand-4586 + exp-16175 + (extend-env-4545 + labels-16181 + (map (lambda (var-16510 level-16511) (cons 'syntax - (cons var-15874 level-15875))) - new-vars-15551 - (map cdr pvars-15543)) - r-15546) - (make-binding-wrap-6563 - ids-15548 - labels-15550 + (cons var-16510 level-16511))) + new-vars-16182 + (map cdr pvars-16174)) + r-16177) + (make-binding-wrap-4564 + ids-16179 + labels-16181 '(())) - mod-15547)) - y-15545))))))) - (gen-clause-13228 - (lambda (x-14195 - keys-14196 - clauses-14197 - r-14198 - pat-14199 - fender-14200 - exp-14201 - mod-14202) + mod-16178)) + y-16176))))))) + (gen-clause-13638 + (lambda (x-14842 + keys-14843 + clauses-14844 + r-14845 + pat-14846 + fender-14847 + exp-14848 + mod-14849) (call-with-values (lambda () - (convert-pattern-13226 pat-14199 keys-14196)) - (lambda (p-14357 pvars-14358) - (if (not (distinct-bound-ids?-6576 (map car pvars-14358))) + (convert-pattern-13636 pat-14846 keys-14843)) + (lambda (p-14987 pvars-14988) + (if (not (distinct-bound-ids?-4577 (map car pvars-14988))) (syntax-violation 'syntax-case "duplicate pattern variable" - pat-14199) + pat-14846) (if (not (and-map - (lambda (x-14474) - (not (let ((x-14478 (car x-14474))) - (if (if (if (vector? x-14478) + (lambda (x-15097) + (not (let ((x-15101 (car x-15097))) + (if (if (if (vector? x-15101) (if (= (vector-length - x-14478) + x-15101) 4) (eq? (vector-ref - x-14478 + x-15101 0) 'syntax-object) #f) #f) - (symbol? (vector-ref x-14478 1)) + (symbol? (vector-ref x-15101 1)) #f) - (if (eq? (if (if (vector? x-14478) - (if (= (vector-length - x-14478) - 4) - (eq? (vector-ref - x-14478 - 0) - 'syntax-object) - #f) - #f) - (vector-ref x-14478 1) - x-14478) - (if (if (= (vector-length - '#(syntax-object - ... - ((top) - #(ribcage - () - () - ()) - #(ribcage - () - () - ()) - #(ribcage - #(x) - #((top)) - #("l-*-4404")) - #(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=? - with-transformer-environment - transformer-environment - resolve-identifier - locally-bound-identifiers - 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 - session-id - 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) - (top) - (top) - (top) - (top)) - ("l-*-2527" - "l-*-2525" - "l-*-2523" - "l-*-2521" - "l-*-2519" - "l-*-2517" - "l-*-2515" - "l-*-2513" - "l-*-2511" - "l-*-2509" - "l-*-2507" - "l-*-2505" - "l-*-2503" - "l-*-2501" - "l-*-2499" - "l-*-2497" - "l-*-2495" - "l-*-2493" - "l-*-2491" - "l-*-2489" - "l-*-2487" - "l-*-2485" - "l-*-2483" - "l-*-2481" - "l-*-2479" - "l-*-2477" - "l-*-2475" - "l-*-2473" - "l-*-2471" - "l-*-2469" - "l-*-2467" - "l-*-2465" - "l-*-2463" - "l-*-2461" - "l-*-2459" - "l-*-2457" - "l-*-2455" - "l-*-2453" - "l-*-2451" - "l-*-2450" - "l-*-2448" - "l-*-2445" - "l-*-2444" - "l-*-2443" - "l-*-2441" - "l-*-2440" - "l-*-2438" - "l-*-2436" - "l-*-2434" - "l-*-2432" - "l-*-2430" - "l-*-2428" - "l-*-2426" - "l-*-2424" - "l-*-2421" - "l-*-2419" - "l-*-2418" - "l-*-2416" - "l-*-2414" - "l-*-2412" - "l-*-2410" - "l-*-2409" - "l-*-2408" - "l-*-2407" - "l-*-2405" - "l-*-2404" - "l-*-2401" - "l-*-2399" - "l-*-2397" - "l-*-2395" - "l-*-2393" - "l-*-2391" - "l-*-2389" - "l-*-2388" - "l-*-2387" - "l-*-2385" - "l-*-2383" - "l-*-2382" - "l-*-2379" - "l-*-2378" - "l-*-2376" - "l-*-2374" - "l-*-2372" - "l-*-2370" - "l-*-2368" - "l-*-2366" - "l-*-2364" - "l-*-2362" - "l-*-2360" - "l-*-2357" - "l-*-2355" - "l-*-2353" - "l-*-2351" - "l-*-2349" - "l-*-2347" - "l-*-2345" - "l-*-2343" - "l-*-2341" - "l-*-2339" - "l-*-2337" - "l-*-2335" - "l-*-2333" - "l-*-2331" - "l-*-2329" - "l-*-2327" - "l-*-2325" - "l-*-2323" - "l-*-2321" - "l-*-2319" - "l-*-2317" - "l-*-2315" - "l-*-2313" - "l-*-2311" - "l-*-2309" - "l-*-2307" - "l-*-2306" - "l-*-2305" - "l-*-2304" - "l-*-2303" - "l-*-2301" - "l-*-2299" - "l-*-2297" - "l-*-2294" - "l-*-2292" - "l-*-2290" - "l-*-2288" - "l-*-2286" - "l-*-2284" - "l-*-2282" - "l-*-2280" - "l-*-2278" - "l-*-2276" - "l-*-2274" - "l-*-2272" - "l-*-2270" - "l-*-2268" - "l-*-2266" - "l-*-2264" - "l-*-2262" - "l-*-2260")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) - (top) - (top)) - ("l-*-2098" - "l-*-2097" - "l-*-2096"))) - (hygiene - guile))) - 4) - #t - #f) - '... - '#(syntax-object - ... - ((top) - #(ribcage () () ()) - #(ribcage () () ()) - #(ribcage - #(x) - #((top)) - #("l-*-4404")) - #(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=? - with-transformer-environment - transformer-environment - resolve-identifier - locally-bound-identifiers - 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 - session-id - 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) - (top) - (top) - (top) - (top)) - ("l-*-2527" - "l-*-2525" - "l-*-2523" - "l-*-2521" - "l-*-2519" - "l-*-2517" - "l-*-2515" - "l-*-2513" - "l-*-2511" - "l-*-2509" - "l-*-2507" - "l-*-2505" - "l-*-2503" - "l-*-2501" - "l-*-2499" - "l-*-2497" - "l-*-2495" - "l-*-2493" - "l-*-2491" - "l-*-2489" - "l-*-2487" - "l-*-2485" - "l-*-2483" - "l-*-2481" - "l-*-2479" - "l-*-2477" - "l-*-2475" - "l-*-2473" - "l-*-2471" - "l-*-2469" - "l-*-2467" - "l-*-2465" - "l-*-2463" - "l-*-2461" - "l-*-2459" - "l-*-2457" - "l-*-2455" - "l-*-2453" - "l-*-2451" - "l-*-2450" - "l-*-2448" - "l-*-2445" - "l-*-2444" - "l-*-2443" - "l-*-2441" - "l-*-2440" - "l-*-2438" - "l-*-2436" - "l-*-2434" - "l-*-2432" - "l-*-2430" - "l-*-2428" - "l-*-2426" - "l-*-2424" - "l-*-2421" - "l-*-2419" - "l-*-2418" - "l-*-2416" - "l-*-2414" - "l-*-2412" - "l-*-2410" - "l-*-2409" - "l-*-2408" - "l-*-2407" - "l-*-2405" - "l-*-2404" - "l-*-2401" - "l-*-2399" - "l-*-2397" - "l-*-2395" - "l-*-2393" - "l-*-2391" - "l-*-2389" - "l-*-2388" - "l-*-2387" - "l-*-2385" - "l-*-2383" - "l-*-2382" - "l-*-2379" - "l-*-2378" - "l-*-2376" - "l-*-2374" - "l-*-2372" - "l-*-2370" - "l-*-2368" - "l-*-2366" - "l-*-2364" - "l-*-2362" - "l-*-2360" - "l-*-2357" - "l-*-2355" - "l-*-2353" - "l-*-2351" - "l-*-2349" - "l-*-2347" - "l-*-2345" - "l-*-2343" - "l-*-2341" - "l-*-2339" - "l-*-2337" - "l-*-2335" - "l-*-2333" - "l-*-2331" - "l-*-2329" - "l-*-2327" - "l-*-2325" - "l-*-2323" - "l-*-2321" - "l-*-2319" - "l-*-2317" - "l-*-2315" - "l-*-2313" - "l-*-2311" - "l-*-2309" - "l-*-2307" - "l-*-2306" - "l-*-2305" - "l-*-2304" - "l-*-2303" - "l-*-2301" - "l-*-2299" - "l-*-2297" - "l-*-2294" - "l-*-2292" - "l-*-2290" - "l-*-2288" - "l-*-2286" - "l-*-2284" - "l-*-2282" - "l-*-2280" - "l-*-2278" - "l-*-2276" - "l-*-2274" - "l-*-2272" - "l-*-2270" - "l-*-2268" - "l-*-2266" - "l-*-2264" - "l-*-2262" - "l-*-2260")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("l-*-2098" - "l-*-2097" - "l-*-2096"))) - (hygiene guile)))) - (eq? (id-var-name-6568 - x-14478 - '(())) - (id-var-name-6568 - '#(syntax-object - ... - ((top) - #(ribcage () () ()) - #(ribcage () () ()) - #(ribcage - #(x) - #((top)) - #("l-*-4404")) - #(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=? - with-transformer-environment - transformer-environment - resolve-identifier - locally-bound-identifiers - 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 - session-id - 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) - (top) - (top) - (top) - (top)) - ("l-*-2527" - "l-*-2525" - "l-*-2523" - "l-*-2521" - "l-*-2519" - "l-*-2517" - "l-*-2515" - "l-*-2513" - "l-*-2511" - "l-*-2509" - "l-*-2507" - "l-*-2505" - "l-*-2503" - "l-*-2501" - "l-*-2499" - "l-*-2497" - "l-*-2495" - "l-*-2493" - "l-*-2491" - "l-*-2489" - "l-*-2487" - "l-*-2485" - "l-*-2483" - "l-*-2481" - "l-*-2479" - "l-*-2477" - "l-*-2475" - "l-*-2473" - "l-*-2471" - "l-*-2469" - "l-*-2467" - "l-*-2465" - "l-*-2463" - "l-*-2461" - "l-*-2459" - "l-*-2457" - "l-*-2455" - "l-*-2453" - "l-*-2451" - "l-*-2450" - "l-*-2448" - "l-*-2445" - "l-*-2444" - "l-*-2443" - "l-*-2441" - "l-*-2440" - "l-*-2438" - "l-*-2436" - "l-*-2434" - "l-*-2432" - "l-*-2430" - "l-*-2428" - "l-*-2426" - "l-*-2424" - "l-*-2421" - "l-*-2419" - "l-*-2418" - "l-*-2416" - "l-*-2414" - "l-*-2412" - "l-*-2410" - "l-*-2409" - "l-*-2408" - "l-*-2407" - "l-*-2405" - "l-*-2404" - "l-*-2401" - "l-*-2399" - "l-*-2397" - "l-*-2395" - "l-*-2393" - "l-*-2391" - "l-*-2389" - "l-*-2388" - "l-*-2387" - "l-*-2385" - "l-*-2383" - "l-*-2382" - "l-*-2379" - "l-*-2378" - "l-*-2376" - "l-*-2374" - "l-*-2372" - "l-*-2370" - "l-*-2368" - "l-*-2366" - "l-*-2364" - "l-*-2362" - "l-*-2360" - "l-*-2357" - "l-*-2355" - "l-*-2353" - "l-*-2351" - "l-*-2349" - "l-*-2347" - "l-*-2345" - "l-*-2343" - "l-*-2341" - "l-*-2339" - "l-*-2337" - "l-*-2335" - "l-*-2333" - "l-*-2331" - "l-*-2329" - "l-*-2327" - "l-*-2325" - "l-*-2323" - "l-*-2321" - "l-*-2319" - "l-*-2317" - "l-*-2315" - "l-*-2313" - "l-*-2311" - "l-*-2309" - "l-*-2307" - "l-*-2306" - "l-*-2305" - "l-*-2304" - "l-*-2303" - "l-*-2301" - "l-*-2299" - "l-*-2297" - "l-*-2294" - "l-*-2292" - "l-*-2290" - "l-*-2288" - "l-*-2286" - "l-*-2284" - "l-*-2282" - "l-*-2280" - "l-*-2278" - "l-*-2276" - "l-*-2274" - "l-*-2272" - "l-*-2270" - "l-*-2268" - "l-*-2266" - "l-*-2264" - "l-*-2262" - "l-*-2260")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("l-*-2098" - "l-*-2097" - "l-*-2096"))) - (hygiene guile)) - '(()))) - #f) + (free-id=?-4574 + x-15101 + '#(syntax-object + ... + ((top) + #(ribcage () () ()) + #(ribcage () () ()) + #(ribcage + #(x) + #((top)) + #("l-*-2416")) + #(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=? + with-transformer-environment + transformer-environment + resolve-identifier + locally-bound-identifiers + 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 + session-id + 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) + (top) + (top) + (top)) + ("l-*-478" + "l-*-476" + "l-*-474" + "l-*-472" + "l-*-470" + "l-*-468" + "l-*-466" + "l-*-464" + "l-*-462" + "l-*-460" + "l-*-458" + "l-*-456" + "l-*-454" + "l-*-452" + "l-*-450" + "l-*-448" + "l-*-446" + "l-*-444" + "l-*-442" + "l-*-440" + "l-*-438" + "l-*-436" + "l-*-434" + "l-*-432" + "l-*-430" + "l-*-428" + "l-*-426" + "l-*-424" + "l-*-422" + "l-*-420" + "l-*-418" + "l-*-416" + "l-*-414" + "l-*-412" + "l-*-410" + "l-*-408" + "l-*-406" + "l-*-404" + "l-*-402" + "l-*-401" + "l-*-399" + "l-*-396" + "l-*-395" + "l-*-394" + "l-*-392" + "l-*-391" + "l-*-389" + "l-*-387" + "l-*-385" + "l-*-383" + "l-*-381" + "l-*-379" + "l-*-377" + "l-*-375" + "l-*-372" + "l-*-370" + "l-*-369" + "l-*-367" + "l-*-365" + "l-*-363" + "l-*-361" + "l-*-360" + "l-*-359" + "l-*-358" + "l-*-356" + "l-*-355" + "l-*-352" + "l-*-350" + "l-*-348" + "l-*-346" + "l-*-344" + "l-*-342" + "l-*-341" + "l-*-340" + "l-*-338" + "l-*-336" + "l-*-335" + "l-*-332" + "l-*-331" + "l-*-329" + "l-*-327" + "l-*-325" + "l-*-323" + "l-*-321" + "l-*-319" + "l-*-317" + "l-*-315" + "l-*-313" + "l-*-310" + "l-*-308" + "l-*-306" + "l-*-304" + "l-*-302" + "l-*-300" + "l-*-298" + "l-*-296" + "l-*-294" + "l-*-292" + "l-*-290" + "l-*-288" + "l-*-286" + "l-*-284" + "l-*-282" + "l-*-280" + "l-*-278" + "l-*-276" + "l-*-274" + "l-*-272" + "l-*-270" + "l-*-268" + "l-*-266" + "l-*-264" + "l-*-262" + "l-*-260" + "l-*-258" + "l-*-257" + "l-*-256" + "l-*-255" + "l-*-254" + "l-*-252" + "l-*-250" + "l-*-248" + "l-*-245" + "l-*-243" + "l-*-241" + "l-*-239" + "l-*-237" + "l-*-235" + "l-*-233" + "l-*-231" + "l-*-229" + "l-*-227" + "l-*-225" + "l-*-223" + "l-*-221" + "l-*-219" + "l-*-217" + "l-*-215" + "l-*-213" + "l-*-211" + "l-*-209")) + #(ribcage + (define-structure + define-expansion-accessors + define-expansion-constructors) + ((top) (top) (top)) + ("l-*-47" + "l-*-46" + "l-*-45")) + #(ribcage () () ())) + (hygiene guile))) #f)))) - pvars-14358)) + pvars-14988)) (syntax-violation 'syntax-case "misplaced ellipsis" - pat-14199) - (let ((y-14554 + pat-14846) + (let ((y-15126 (gensym (string-append (symbol->string 'tmp) "-")))) - (build-application-6516 - #f - (let ((req-14697 (list 'tmp)) - (vars-14699 (list y-14554)) - (exp-14701 - (let ((y-14718 - (make-struct/no-tail - (vector-ref %expanded-vtables 3) - #f - 'tmp - y-14554))) - (let ((test-exp-14722 - (let ((tmp-14731 - ($sc-dispatch - fender-14200 - '#(atom #t)))) - (if tmp-14731 - (@apply - (lambda () y-14718) - tmp-14731) - (let ((then-exp-14749 - (build-dispatch-call-13227 - pvars-14358 - fender-14200 - y-14718 - r-14198 - mod-14202)) - (else-exp-14750 + (let ((fun-exp-15131 + (let ((req-15140 (list 'tmp)) + (vars-15142 (list y-15126)) + (exp-15144 + (let ((y-15173 + (make-struct/no-tail + (vector-ref + %expanded-vtables + 3) + #f + 'tmp + y-15126))) + (let ((test-exp-15177 + (let ((tmp-15186 + ($sc-dispatch + fender-14847 + '#(atom #t)))) + (if tmp-15186 + (@apply + (lambda () y-15173) + tmp-15186) + (let ((then-exp-15204 + (build-dispatch-call-13637 + pvars-14988 + fender-14847 + y-15173 + r-14845 + mod-14849)) + (else-exp-15205 + (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-14718 - then-exp-14749 - else-exp-14750))))) - (then-exp-14723 - (build-dispatch-call-13227 - pvars-14358 - exp-14201 - y-14718 - r-14198 - mod-14202)) - (else-exp-14724 - (gen-syntax-case-13229 - x-14195 - keys-14196 - clauses-14197 - r-14198 - mod-14202))) - (make-struct/no-tail - (vector-ref %expanded-vtables 10) - #f - test-exp-14722 - then-exp-14723 - else-exp-14724))))) - (let ((body-14706 - (make-struct/no-tail - (vector-ref %expanded-vtables 14) - #f - req-14697 - #f - #f - #f - '() - vars-14699 - exp-14701 - #f))) - (make-struct/no-tail - (vector-ref %expanded-vtables 13) - #f - '() - body-14706))) - (list (if (eq? p-14357 'any) - (let ((fun-exp-14772 - (if (equal? - (module-name (current-module)) - '(guile)) + y-15173 + then-exp-15204 + else-exp-15205))))) + (then-exp-15178 + (build-dispatch-call-13637 + pvars-14988 + exp-14848 + y-15173 + r-14845 + mod-14849)) + (else-exp-15179 + (gen-syntax-case-13639 + x-14842 + keys-14843 + clauses-14844 + r-14845 + mod-14849))) (make-struct/no-tail - (vector-ref %expanded-vtables 7) + (vector-ref + %expanded-vtables + 10) #f - 'list) - (make-struct/no-tail - (vector-ref %expanded-vtables 5) - #f - '(guile) - 'list - #f))) - (arg-exps-14773 (list x-14195))) - (make-struct/no-tail - (vector-ref %expanded-vtables 11) - #f - fun-exp-14772 - arg-exps-14773)) - (let ((fun-exp-14796 - (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-14797 - (list x-14195 - (make-struct/no-tail - (vector-ref - %expanded-vtables - 1) - #f - p-14357)))) + test-exp-15177 + then-exp-15178 + else-exp-15179))))) + (let ((body-15149 + (make-struct/no-tail + (vector-ref %expanded-vtables 15) + #f + req-15140 + #f + #f + #f + '() + vars-15142 + exp-15144 + #f))) (make-struct/no-tail - (vector-ref %expanded-vtables 11) + (vector-ref %expanded-vtables 14) #f - fun-exp-14796 - arg-exps-14797)))))))))))) - (gen-syntax-case-13229 - (lambda (x-13628 - keys-13629 - clauses-13630 - r-13631 - mod-13632) - (if (null? clauses-13630) - (let ((fun-exp-13637 - (if (equal? (module-name (current-module)) '(guile)) - (make-struct/no-tail - (vector-ref %expanded-vtables 7) - #f - 'syntax-violation) + '() + body-15149)))) + (arg-exps-15132 + (list (if (eq? p-14987 'any) + (let ((args-15237 (list x-14842))) + (make-struct/no-tail + (vector-ref %expanded-vtables 12) + #f + 'list + args-15237)) + (let ((args-15246 + (list x-14842 + (make-struct/no-tail + (vector-ref + %expanded-vtables + 1) + #f + p-14987)))) + (make-struct/no-tail + (vector-ref %expanded-vtables 12) + #f + '$sc-dispatch + args-15246)))))) (make-struct/no-tail - (vector-ref %expanded-vtables 5) + (vector-ref %expanded-vtables 11) #f - '(guile) - 'syntax-violation - #f))) - (arg-exps-13638 + fun-exp-15131 + arg-exps-15132))))))))) + (gen-syntax-case-13639 + (lambda (x-14343 + keys-14344 + clauses-14345 + r-14346 + mod-14347) + (if (null? clauses-14345) + (let ((args-14353 (list (make-struct/no-tail (vector-ref %expanded-vtables 1) #f @@ -16798,86 +15011,56 @@ (vector-ref %expanded-vtables 1) #f "source expression failed to match any pattern") - x-13628))) + x-14343))) (make-struct/no-tail - (vector-ref %expanded-vtables 11) + (vector-ref %expanded-vtables 12) #f - fun-exp-13637 - arg-exps-13638)) - (let ((tmp-13671 (car clauses-13630))) - (let ((tmp-13672 ($sc-dispatch tmp-13671 '(any any)))) - (if tmp-13672 + 'syntax-violation + args-14353)) + (let ((tmp-14372 (car clauses-14345))) + (let ((tmp-14373 ($sc-dispatch tmp-14372 '(any any)))) + (if tmp-14373 (@apply - (lambda (pat-13674 exp-13675) - (if (if (if (symbol? pat-13674) + (lambda (pat-14375 exp-14376) + (if (if (if (symbol? pat-14375) #t - (if (if (vector? pat-13674) - (if (= (vector-length pat-13674) 4) - (eq? (vector-ref pat-13674 0) + (if (if (vector? pat-14375) + (if (= (vector-length pat-14375) 4) + (eq? (vector-ref pat-14375 0) 'syntax-object) #f) #f) - (symbol? (vector-ref pat-13674 1)) + (symbol? (vector-ref pat-14375 1)) #f)) (and-map - (lambda (x-13702) - (not (if (eq? (if (if (vector? pat-13674) - (if (= (vector-length - pat-13674) - 4) - (eq? (vector-ref - pat-13674 - 0) - 'syntax-object) - #f) - #f) - (vector-ref pat-13674 1) - pat-13674) - (if (if (vector? x-13702) - (if (= (vector-length - x-13702) - 4) - (eq? (vector-ref - x-13702 - 0) - 'syntax-object) - #f) - #f) - (vector-ref x-13702 1) - x-13702)) - (eq? (id-var-name-6568 - pat-13674 - '(())) - (id-var-name-6568 - x-13702 - '(()))) - #f))) + (lambda (x-14403) + (not (free-id=?-4574 pat-14375 x-14403))) (cons '#(syntax-object ... ((top) #(ribcage #(pat exp) #((top) (top)) - #("l-*-6087" "l-*-6088")) + #("l-*-4087" "l-*-4088")) #(ribcage () () ()) #(ribcage #(x keys clauses r mod) #((top) (top) (top) (top) (top)) - #("l-*-6076" - "l-*-6077" - "l-*-6078" - "l-*-6079" - "l-*-6080")) + #("l-*-4077" + "l-*-4078" + "l-*-4079" + "l-*-4080" + "l-*-4081")) #(ribcage (gen-syntax-case gen-clause build-dispatch-call convert-pattern) ((top) (top) (top) (top)) - ("l-*-5886" - "l-*-5884" - "l-*-5882" - "l-*-5880")) + ("l-*-3890" + "l-*-3888" + "l-*-3886" + "l-*-3884")) #(ribcage (lambda-var-list gen-var @@ -16892,7 +15075,7 @@ expand-local-syntax expand-body expand-macro - expand-application + expand-call expand-expr expand syntax-type @@ -16948,7 +15131,6 @@ id? nonsymbol-id? global-extend - lookup macros-only-env extend-var-env extend-env @@ -16974,6 +15156,7 @@ build-sequence build-data build-primref + build-primcall build-lambda-case build-case-lambda build-simple-lambda @@ -16985,7 +15168,7 @@ build-lexical-reference build-dynlet build-conditional - build-application + build-call build-void maybe-name-value! decorate-source @@ -17006,8 +15189,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 @@ -17158,5165 +15342,2634 @@ (top) (top) (top) + (top) (top)) - ("l-*-2527" - "l-*-2525" - "l-*-2523" - "l-*-2521" - "l-*-2519" - "l-*-2517" - "l-*-2515" - "l-*-2513" - "l-*-2511" - "l-*-2509" - "l-*-2507" - "l-*-2505" - "l-*-2503" - "l-*-2501" - "l-*-2499" - "l-*-2497" - "l-*-2495" - "l-*-2493" - "l-*-2491" - "l-*-2489" - "l-*-2487" - "l-*-2485" - "l-*-2483" - "l-*-2481" - "l-*-2479" - "l-*-2477" - "l-*-2475" - "l-*-2473" - "l-*-2471" - "l-*-2469" - "l-*-2467" - "l-*-2465" - "l-*-2463" - "l-*-2461" - "l-*-2459" - "l-*-2457" - "l-*-2455" - "l-*-2453" - "l-*-2451" - "l-*-2450" - "l-*-2448" - "l-*-2445" - "l-*-2444" - "l-*-2443" - "l-*-2441" - "l-*-2440" - "l-*-2438" - "l-*-2436" - "l-*-2434" - "l-*-2432" - "l-*-2430" - "l-*-2428" - "l-*-2426" - "l-*-2424" - "l-*-2421" - "l-*-2419" - "l-*-2418" - "l-*-2416" - "l-*-2414" - "l-*-2412" - "l-*-2410" - "l-*-2409" - "l-*-2408" - "l-*-2407" - "l-*-2405" - "l-*-2404" - "l-*-2401" - "l-*-2399" - "l-*-2397" - "l-*-2395" - "l-*-2393" - "l-*-2391" - "l-*-2389" - "l-*-2388" - "l-*-2387" - "l-*-2385" - "l-*-2383" - "l-*-2382" - "l-*-2379" - "l-*-2378" - "l-*-2376" - "l-*-2374" - "l-*-2372" - "l-*-2370" - "l-*-2368" - "l-*-2366" - "l-*-2364" - "l-*-2362" - "l-*-2360" - "l-*-2357" - "l-*-2355" - "l-*-2353" - "l-*-2351" - "l-*-2349" - "l-*-2347" - "l-*-2345" - "l-*-2343" - "l-*-2341" - "l-*-2339" - "l-*-2337" - "l-*-2335" - "l-*-2333" - "l-*-2331" - "l-*-2329" - "l-*-2327" - "l-*-2325" - "l-*-2323" - "l-*-2321" - "l-*-2319" - "l-*-2317" - "l-*-2315" - "l-*-2313" - "l-*-2311" - "l-*-2309" - "l-*-2307" - "l-*-2306" - "l-*-2305" - "l-*-2304" - "l-*-2303" - "l-*-2301" - "l-*-2299" - "l-*-2297" - "l-*-2294" - "l-*-2292" - "l-*-2290" - "l-*-2288" - "l-*-2286" - "l-*-2284" - "l-*-2282" - "l-*-2280" - "l-*-2278" - "l-*-2276" - "l-*-2274" - "l-*-2272" - "l-*-2270" - "l-*-2268" - "l-*-2266" - "l-*-2264" - "l-*-2262" - "l-*-2260")) + ("l-*-478" + "l-*-476" + "l-*-474" + "l-*-472" + "l-*-470" + "l-*-468" + "l-*-466" + "l-*-464" + "l-*-462" + "l-*-460" + "l-*-458" + "l-*-456" + "l-*-454" + "l-*-452" + "l-*-450" + "l-*-448" + "l-*-446" + "l-*-444" + "l-*-442" + "l-*-440" + "l-*-438" + "l-*-436" + "l-*-434" + "l-*-432" + "l-*-430" + "l-*-428" + "l-*-426" + "l-*-424" + "l-*-422" + "l-*-420" + "l-*-418" + "l-*-416" + "l-*-414" + "l-*-412" + "l-*-410" + "l-*-408" + "l-*-406" + "l-*-404" + "l-*-402" + "l-*-401" + "l-*-399" + "l-*-396" + "l-*-395" + "l-*-394" + "l-*-392" + "l-*-391" + "l-*-389" + "l-*-387" + "l-*-385" + "l-*-383" + "l-*-381" + "l-*-379" + "l-*-377" + "l-*-375" + "l-*-372" + "l-*-370" + "l-*-369" + "l-*-367" + "l-*-365" + "l-*-363" + "l-*-361" + "l-*-360" + "l-*-359" + "l-*-358" + "l-*-356" + "l-*-355" + "l-*-352" + "l-*-350" + "l-*-348" + "l-*-346" + "l-*-344" + "l-*-342" + "l-*-341" + "l-*-340" + "l-*-338" + "l-*-336" + "l-*-335" + "l-*-332" + "l-*-331" + "l-*-329" + "l-*-327" + "l-*-325" + "l-*-323" + "l-*-321" + "l-*-319" + "l-*-317" + "l-*-315" + "l-*-313" + "l-*-310" + "l-*-308" + "l-*-306" + "l-*-304" + "l-*-302" + "l-*-300" + "l-*-298" + "l-*-296" + "l-*-294" + "l-*-292" + "l-*-290" + "l-*-288" + "l-*-286" + "l-*-284" + "l-*-282" + "l-*-280" + "l-*-278" + "l-*-276" + "l-*-274" + "l-*-272" + "l-*-270" + "l-*-268" + "l-*-266" + "l-*-264" + "l-*-262" + "l-*-260" + "l-*-258" + "l-*-257" + "l-*-256" + "l-*-255" + "l-*-254" + "l-*-252" + "l-*-250" + "l-*-248" + "l-*-245" + "l-*-243" + "l-*-241" + "l-*-239" + "l-*-237" + "l-*-235" + "l-*-233" + "l-*-231" + "l-*-229" + "l-*-227" + "l-*-225" + "l-*-223" + "l-*-221" + "l-*-219" + "l-*-217" + "l-*-215" + "l-*-213" + "l-*-211" + "l-*-209")) #(ribcage (define-structure define-expansion-accessors define-expansion-constructors) ((top) (top) (top)) - ("l-*-2098" - "l-*-2097" - "l-*-2096"))) + ("l-*-47" "l-*-46" "l-*-45")) + #(ribcage () () ())) (hygiene guile)) - keys-13629)) + keys-14344)) #f) - (if (if (eq? (if (if (= (vector-length - '#(syntax-object - pad - ((top) - #(ribcage - #(pat exp) - #((top) (top)) - #("l-*-6087" - "l-*-6088")) - #(ribcage () () ()) - #(ribcage - #(x - keys - clauses - r - mod) - #((top) - (top) - (top) - (top) - (top)) - #("l-*-6076" - "l-*-6077" - "l-*-6078" - "l-*-6079" - "l-*-6080")) - #(ribcage - (gen-syntax-case - gen-clause - build-dispatch-call - convert-pattern) - ((top) - (top) - (top) - (top)) - ("l-*-5886" - "l-*-5884" - "l-*-5882" - "l-*-5880")) - #(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=? - with-transformer-environment - transformer-environment - resolve-identifier - locally-bound-identifiers - 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 - session-id - 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) - (top) - (top) - (top) - (top)) - ("l-*-2527" - "l-*-2525" - "l-*-2523" - "l-*-2521" - "l-*-2519" - "l-*-2517" - "l-*-2515" - "l-*-2513" - "l-*-2511" - "l-*-2509" - "l-*-2507" - "l-*-2505" - "l-*-2503" - "l-*-2501" - "l-*-2499" - "l-*-2497" - "l-*-2495" - "l-*-2493" - "l-*-2491" - "l-*-2489" - "l-*-2487" - "l-*-2485" - "l-*-2483" - "l-*-2481" - "l-*-2479" - "l-*-2477" - "l-*-2475" - "l-*-2473" - "l-*-2471" - "l-*-2469" - "l-*-2467" - "l-*-2465" - "l-*-2463" - "l-*-2461" - "l-*-2459" - "l-*-2457" - "l-*-2455" - "l-*-2453" - "l-*-2451" - "l-*-2450" - "l-*-2448" - "l-*-2445" - "l-*-2444" - "l-*-2443" - "l-*-2441" - "l-*-2440" - "l-*-2438" - "l-*-2436" - "l-*-2434" - "l-*-2432" - "l-*-2430" - "l-*-2428" - "l-*-2426" - "l-*-2424" - "l-*-2421" - "l-*-2419" - "l-*-2418" - "l-*-2416" - "l-*-2414" - "l-*-2412" - "l-*-2410" - "l-*-2409" - "l-*-2408" - "l-*-2407" - "l-*-2405" - "l-*-2404" - "l-*-2401" - "l-*-2399" - "l-*-2397" - "l-*-2395" - "l-*-2393" - "l-*-2391" - "l-*-2389" - "l-*-2388" - "l-*-2387" - "l-*-2385" - "l-*-2383" - "l-*-2382" - "l-*-2379" - "l-*-2378" - "l-*-2376" - "l-*-2374" - "l-*-2372" - "l-*-2370" - "l-*-2368" - "l-*-2366" - "l-*-2364" - "l-*-2362" - "l-*-2360" - "l-*-2357" - "l-*-2355" - "l-*-2353" - "l-*-2351" - "l-*-2349" - "l-*-2347" - "l-*-2345" - "l-*-2343" - "l-*-2341" - "l-*-2339" - "l-*-2337" - "l-*-2335" - "l-*-2333" - "l-*-2331" - "l-*-2329" - "l-*-2327" - "l-*-2325" - "l-*-2323" - "l-*-2321" - "l-*-2319" - "l-*-2317" - "l-*-2315" - "l-*-2313" - "l-*-2311" - "l-*-2309" - "l-*-2307" - "l-*-2306" - "l-*-2305" - "l-*-2304" - "l-*-2303" - "l-*-2301" - "l-*-2299" - "l-*-2297" - "l-*-2294" - "l-*-2292" - "l-*-2290" - "l-*-2288" - "l-*-2286" - "l-*-2284" - "l-*-2282" - "l-*-2280" - "l-*-2278" - "l-*-2276" - "l-*-2274" - "l-*-2272" - "l-*-2270" - "l-*-2268" - "l-*-2266" - "l-*-2264" - "l-*-2262" - "l-*-2260")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) - (top) - (top)) - ("l-*-2098" - "l-*-2097" - "l-*-2096"))) - (hygiene guile))) - 4) - #t - #f) - 'pad - '#(syntax-object - pad - ((top) - #(ribcage - #(pat exp) - #((top) (top)) - #("l-*-6087" "l-*-6088")) - #(ribcage () () ()) - #(ribcage - #(x keys clauses r mod) - #((top) - (top) - (top) - (top) - (top)) - #("l-*-6076" - "l-*-6077" - "l-*-6078" - "l-*-6079" - "l-*-6080")) - #(ribcage - (gen-syntax-case - gen-clause - build-dispatch-call - convert-pattern) - ((top) (top) (top) (top)) - ("l-*-5886" - "l-*-5884" - "l-*-5882" - "l-*-5880")) - #(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=? - with-transformer-environment - transformer-environment - resolve-identifier - locally-bound-identifiers - 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 - session-id - 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) - (top) - (top) - (top) - (top)) - ("l-*-2527" - "l-*-2525" - "l-*-2523" - "l-*-2521" - "l-*-2519" - "l-*-2517" - "l-*-2515" - "l-*-2513" - "l-*-2511" - "l-*-2509" - "l-*-2507" - "l-*-2505" - "l-*-2503" - "l-*-2501" - "l-*-2499" - "l-*-2497" - "l-*-2495" - "l-*-2493" - "l-*-2491" - "l-*-2489" - "l-*-2487" - "l-*-2485" - "l-*-2483" - "l-*-2481" - "l-*-2479" - "l-*-2477" - "l-*-2475" - "l-*-2473" - "l-*-2471" - "l-*-2469" - "l-*-2467" - "l-*-2465" - "l-*-2463" - "l-*-2461" - "l-*-2459" - "l-*-2457" - "l-*-2455" - "l-*-2453" - "l-*-2451" - "l-*-2450" - "l-*-2448" - "l-*-2445" - "l-*-2444" - "l-*-2443" - "l-*-2441" - "l-*-2440" - "l-*-2438" - "l-*-2436" - "l-*-2434" - "l-*-2432" - "l-*-2430" - "l-*-2428" - "l-*-2426" - "l-*-2424" - "l-*-2421" - "l-*-2419" - "l-*-2418" - "l-*-2416" - "l-*-2414" - "l-*-2412" - "l-*-2410" - "l-*-2409" - "l-*-2408" - "l-*-2407" - "l-*-2405" - "l-*-2404" - "l-*-2401" - "l-*-2399" - "l-*-2397" - "l-*-2395" - "l-*-2393" - "l-*-2391" - "l-*-2389" - "l-*-2388" - "l-*-2387" - "l-*-2385" - "l-*-2383" - "l-*-2382" - "l-*-2379" - "l-*-2378" - "l-*-2376" - "l-*-2374" - "l-*-2372" - "l-*-2370" - "l-*-2368" - "l-*-2366" - "l-*-2364" - "l-*-2362" - "l-*-2360" - "l-*-2357" - "l-*-2355" - "l-*-2353" - "l-*-2351" - "l-*-2349" - "l-*-2347" - "l-*-2345" - "l-*-2343" - "l-*-2341" - "l-*-2339" - "l-*-2337" - "l-*-2335" - "l-*-2333" - "l-*-2331" - "l-*-2329" - "l-*-2327" - "l-*-2325" - "l-*-2323" - "l-*-2321" - "l-*-2319" - "l-*-2317" - "l-*-2315" - "l-*-2313" - "l-*-2311" - "l-*-2309" - "l-*-2307" - "l-*-2306" - "l-*-2305" - "l-*-2304" - "l-*-2303" - "l-*-2301" - "l-*-2299" - "l-*-2297" - "l-*-2294" - "l-*-2292" - "l-*-2290" - "l-*-2288" - "l-*-2286" - "l-*-2284" - "l-*-2282" - "l-*-2280" - "l-*-2278" - "l-*-2276" - "l-*-2274" - "l-*-2272" - "l-*-2270" - "l-*-2268" - "l-*-2266" - "l-*-2264" - "l-*-2262" - "l-*-2260")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("l-*-2098" - "l-*-2097" - "l-*-2096"))) - (hygiene guile))) - (if (if (= (vector-length - '#(syntax-object - _ - ((top) - #(ribcage - #(pat exp) - #((top) (top)) - #("l-*-6087" - "l-*-6088")) - #(ribcage () () ()) - #(ribcage - #(x - keys - clauses - r - mod) - #((top) - (top) - (top) - (top) - (top)) - #("l-*-6076" - "l-*-6077" - "l-*-6078" - "l-*-6079" - "l-*-6080")) - #(ribcage - (gen-syntax-case - gen-clause - build-dispatch-call - convert-pattern) - ((top) - (top) - (top) - (top)) - ("l-*-5886" - "l-*-5884" - "l-*-5882" - "l-*-5880")) - #(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=? - with-transformer-environment - transformer-environment - resolve-identifier - locally-bound-identifiers - 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 - session-id - 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) - (top) - (top) - (top) - (top)) - ("l-*-2527" - "l-*-2525" - "l-*-2523" - "l-*-2521" - "l-*-2519" - "l-*-2517" - "l-*-2515" - "l-*-2513" - "l-*-2511" - "l-*-2509" - "l-*-2507" - "l-*-2505" - "l-*-2503" - "l-*-2501" - "l-*-2499" - "l-*-2497" - "l-*-2495" - "l-*-2493" - "l-*-2491" - "l-*-2489" - "l-*-2487" - "l-*-2485" - "l-*-2483" - "l-*-2481" - "l-*-2479" - "l-*-2477" - "l-*-2475" - "l-*-2473" - "l-*-2471" - "l-*-2469" - "l-*-2467" - "l-*-2465" - "l-*-2463" - "l-*-2461" - "l-*-2459" - "l-*-2457" - "l-*-2455" - "l-*-2453" - "l-*-2451" - "l-*-2450" - "l-*-2448" - "l-*-2445" - "l-*-2444" - "l-*-2443" - "l-*-2441" - "l-*-2440" - "l-*-2438" - "l-*-2436" - "l-*-2434" - "l-*-2432" - "l-*-2430" - "l-*-2428" - "l-*-2426" - "l-*-2424" - "l-*-2421" - "l-*-2419" - "l-*-2418" - "l-*-2416" - "l-*-2414" - "l-*-2412" - "l-*-2410" - "l-*-2409" - "l-*-2408" - "l-*-2407" - "l-*-2405" - "l-*-2404" - "l-*-2401" - "l-*-2399" - "l-*-2397" - "l-*-2395" - "l-*-2393" - "l-*-2391" - "l-*-2389" - "l-*-2388" - "l-*-2387" - "l-*-2385" - "l-*-2383" - "l-*-2382" - "l-*-2379" - "l-*-2378" - "l-*-2376" - "l-*-2374" - "l-*-2372" - "l-*-2370" - "l-*-2368" - "l-*-2366" - "l-*-2364" - "l-*-2362" - "l-*-2360" - "l-*-2357" - "l-*-2355" - "l-*-2353" - "l-*-2351" - "l-*-2349" - "l-*-2347" - "l-*-2345" - "l-*-2343" - "l-*-2341" - "l-*-2339" - "l-*-2337" - "l-*-2335" - "l-*-2333" - "l-*-2331" - "l-*-2329" - "l-*-2327" - "l-*-2325" - "l-*-2323" - "l-*-2321" - "l-*-2319" - "l-*-2317" - "l-*-2315" - "l-*-2313" - "l-*-2311" - "l-*-2309" - "l-*-2307" - "l-*-2306" - "l-*-2305" - "l-*-2304" - "l-*-2303" - "l-*-2301" - "l-*-2299" - "l-*-2297" - "l-*-2294" - "l-*-2292" - "l-*-2290" - "l-*-2288" - "l-*-2286" - "l-*-2284" - "l-*-2282" - "l-*-2280" - "l-*-2278" - "l-*-2276" - "l-*-2274" - "l-*-2272" - "l-*-2270" - "l-*-2268" - "l-*-2266" - "l-*-2264" - "l-*-2262" - "l-*-2260")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) - (top) - (top)) - ("l-*-2098" - "l-*-2097" - "l-*-2096"))) - (hygiene guile))) - 4) - #t - #f) - '_ - '#(syntax-object - _ - ((top) - #(ribcage - #(pat exp) - #((top) (top)) - #("l-*-6087" "l-*-6088")) - #(ribcage () () ()) - #(ribcage - #(x keys clauses r mod) - #((top) - (top) - (top) - (top) - (top)) - #("l-*-6076" - "l-*-6077" - "l-*-6078" - "l-*-6079" - "l-*-6080")) - #(ribcage - (gen-syntax-case - gen-clause - build-dispatch-call - convert-pattern) - ((top) (top) (top) (top)) - ("l-*-5886" - "l-*-5884" - "l-*-5882" - "l-*-5880")) - #(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=? - with-transformer-environment - transformer-environment - resolve-identifier - locally-bound-identifiers - 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 - session-id - 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) - (top) - (top) - (top) - (top)) - ("l-*-2527" - "l-*-2525" - "l-*-2523" - "l-*-2521" - "l-*-2519" - "l-*-2517" - "l-*-2515" - "l-*-2513" - "l-*-2511" - "l-*-2509" - "l-*-2507" - "l-*-2505" - "l-*-2503" - "l-*-2501" - "l-*-2499" - "l-*-2497" - "l-*-2495" - "l-*-2493" - "l-*-2491" - "l-*-2489" - "l-*-2487" - "l-*-2485" - "l-*-2483" - "l-*-2481" - "l-*-2479" - "l-*-2477" - "l-*-2475" - "l-*-2473" - "l-*-2471" - "l-*-2469" - "l-*-2467" - "l-*-2465" - "l-*-2463" - "l-*-2461" - "l-*-2459" - "l-*-2457" - "l-*-2455" - "l-*-2453" - "l-*-2451" - "l-*-2450" - "l-*-2448" - "l-*-2445" - "l-*-2444" - "l-*-2443" - "l-*-2441" - "l-*-2440" - "l-*-2438" - "l-*-2436" - "l-*-2434" - "l-*-2432" - "l-*-2430" - "l-*-2428" - "l-*-2426" - "l-*-2424" - "l-*-2421" - "l-*-2419" - "l-*-2418" - "l-*-2416" - "l-*-2414" - "l-*-2412" - "l-*-2410" - "l-*-2409" - "l-*-2408" - "l-*-2407" - "l-*-2405" - "l-*-2404" - "l-*-2401" - "l-*-2399" - "l-*-2397" - "l-*-2395" - "l-*-2393" - "l-*-2391" - "l-*-2389" - "l-*-2388" - "l-*-2387" - "l-*-2385" - "l-*-2383" - "l-*-2382" - "l-*-2379" - "l-*-2378" - "l-*-2376" - "l-*-2374" - "l-*-2372" - "l-*-2370" - "l-*-2368" - "l-*-2366" - "l-*-2364" - "l-*-2362" - "l-*-2360" - "l-*-2357" - "l-*-2355" - "l-*-2353" - "l-*-2351" - "l-*-2349" - "l-*-2347" - "l-*-2345" - "l-*-2343" - "l-*-2341" - "l-*-2339" - "l-*-2337" - "l-*-2335" - "l-*-2333" - "l-*-2331" - "l-*-2329" - "l-*-2327" - "l-*-2325" - "l-*-2323" - "l-*-2321" - "l-*-2319" - "l-*-2317" - "l-*-2315" - "l-*-2313" - "l-*-2311" - "l-*-2309" - "l-*-2307" - "l-*-2306" - "l-*-2305" - "l-*-2304" - "l-*-2303" - "l-*-2301" - "l-*-2299" - "l-*-2297" - "l-*-2294" - "l-*-2292" - "l-*-2290" - "l-*-2288" - "l-*-2286" - "l-*-2284" - "l-*-2282" - "l-*-2280" - "l-*-2278" - "l-*-2276" - "l-*-2274" - "l-*-2272" - "l-*-2270" - "l-*-2268" - "l-*-2266" - "l-*-2264" - "l-*-2262" - "l-*-2260")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("l-*-2098" - "l-*-2097" - "l-*-2096"))) - (hygiene guile)))) - (eq? (id-var-name-6568 - '#(syntax-object - pad - ((top) - #(ribcage - #(pat exp) - #((top) (top)) - #("l-*-6087" "l-*-6088")) - #(ribcage () () ()) - #(ribcage - #(x keys clauses r mod) - #((top) - (top) - (top) - (top) - (top)) - #("l-*-6076" - "l-*-6077" - "l-*-6078" - "l-*-6079" - "l-*-6080")) - #(ribcage - (gen-syntax-case - gen-clause - build-dispatch-call - convert-pattern) - ((top) (top) (top) (top)) - ("l-*-5886" - "l-*-5884" - "l-*-5882" - "l-*-5880")) - #(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=? - with-transformer-environment - transformer-environment - resolve-identifier - locally-bound-identifiers - 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 - session-id - 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) - (top) - (top) - (top) - (top)) - ("l-*-2527" - "l-*-2525" - "l-*-2523" - "l-*-2521" - "l-*-2519" - "l-*-2517" - "l-*-2515" - "l-*-2513" - "l-*-2511" - "l-*-2509" - "l-*-2507" - "l-*-2505" - "l-*-2503" - "l-*-2501" - "l-*-2499" - "l-*-2497" - "l-*-2495" - "l-*-2493" - "l-*-2491" - "l-*-2489" - "l-*-2487" - "l-*-2485" - "l-*-2483" - "l-*-2481" - "l-*-2479" - "l-*-2477" - "l-*-2475" - "l-*-2473" - "l-*-2471" - "l-*-2469" - "l-*-2467" - "l-*-2465" - "l-*-2463" - "l-*-2461" - "l-*-2459" - "l-*-2457" - "l-*-2455" - "l-*-2453" - "l-*-2451" - "l-*-2450" - "l-*-2448" - "l-*-2445" - "l-*-2444" - "l-*-2443" - "l-*-2441" - "l-*-2440" - "l-*-2438" - "l-*-2436" - "l-*-2434" - "l-*-2432" - "l-*-2430" - "l-*-2428" - "l-*-2426" - "l-*-2424" - "l-*-2421" - "l-*-2419" - "l-*-2418" - "l-*-2416" - "l-*-2414" - "l-*-2412" - "l-*-2410" - "l-*-2409" - "l-*-2408" - "l-*-2407" - "l-*-2405" - "l-*-2404" - "l-*-2401" - "l-*-2399" - "l-*-2397" - "l-*-2395" - "l-*-2393" - "l-*-2391" - "l-*-2389" - "l-*-2388" - "l-*-2387" - "l-*-2385" - "l-*-2383" - "l-*-2382" - "l-*-2379" - "l-*-2378" - "l-*-2376" - "l-*-2374" - "l-*-2372" - "l-*-2370" - "l-*-2368" - "l-*-2366" - "l-*-2364" - "l-*-2362" - "l-*-2360" - "l-*-2357" - "l-*-2355" - "l-*-2353" - "l-*-2351" - "l-*-2349" - "l-*-2347" - "l-*-2345" - "l-*-2343" - "l-*-2341" - "l-*-2339" - "l-*-2337" - "l-*-2335" - "l-*-2333" - "l-*-2331" - "l-*-2329" - "l-*-2327" - "l-*-2325" - "l-*-2323" - "l-*-2321" - "l-*-2319" - "l-*-2317" - "l-*-2315" - "l-*-2313" - "l-*-2311" - "l-*-2309" - "l-*-2307" - "l-*-2306" - "l-*-2305" - "l-*-2304" - "l-*-2303" - "l-*-2301" - "l-*-2299" - "l-*-2297" - "l-*-2294" - "l-*-2292" - "l-*-2290" - "l-*-2288" - "l-*-2286" - "l-*-2284" - "l-*-2282" - "l-*-2280" - "l-*-2278" - "l-*-2276" - "l-*-2274" - "l-*-2272" - "l-*-2270" - "l-*-2268" - "l-*-2266" - "l-*-2264" - "l-*-2262" - "l-*-2260")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("l-*-2098" - "l-*-2097" - "l-*-2096"))) - (hygiene guile)) - '(())) - (id-var-name-6568 - '#(syntax-object - _ - ((top) - #(ribcage - #(pat exp) - #((top) (top)) - #("l-*-6087" "l-*-6088")) - #(ribcage () () ()) - #(ribcage - #(x keys clauses r mod) - #((top) - (top) - (top) - (top) - (top)) - #("l-*-6076" - "l-*-6077" - "l-*-6078" - "l-*-6079" - "l-*-6080")) - #(ribcage - (gen-syntax-case - gen-clause - build-dispatch-call - convert-pattern) - ((top) (top) (top) (top)) - ("l-*-5886" - "l-*-5884" - "l-*-5882" - "l-*-5880")) - #(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=? - with-transformer-environment - transformer-environment - resolve-identifier - locally-bound-identifiers - 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 - session-id - 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) - (top) - (top) - (top) - (top)) - ("l-*-2527" - "l-*-2525" - "l-*-2523" - "l-*-2521" - "l-*-2519" - "l-*-2517" - "l-*-2515" - "l-*-2513" - "l-*-2511" - "l-*-2509" - "l-*-2507" - "l-*-2505" - "l-*-2503" - "l-*-2501" - "l-*-2499" - "l-*-2497" - "l-*-2495" - "l-*-2493" - "l-*-2491" - "l-*-2489" - "l-*-2487" - "l-*-2485" - "l-*-2483" - "l-*-2481" - "l-*-2479" - "l-*-2477" - "l-*-2475" - "l-*-2473" - "l-*-2471" - "l-*-2469" - "l-*-2467" - "l-*-2465" - "l-*-2463" - "l-*-2461" - "l-*-2459" - "l-*-2457" - "l-*-2455" - "l-*-2453" - "l-*-2451" - "l-*-2450" - "l-*-2448" - "l-*-2445" - "l-*-2444" - "l-*-2443" - "l-*-2441" - "l-*-2440" - "l-*-2438" - "l-*-2436" - "l-*-2434" - "l-*-2432" - "l-*-2430" - "l-*-2428" - "l-*-2426" - "l-*-2424" - "l-*-2421" - "l-*-2419" - "l-*-2418" - "l-*-2416" - "l-*-2414" - "l-*-2412" - "l-*-2410" - "l-*-2409" - "l-*-2408" - "l-*-2407" - "l-*-2405" - "l-*-2404" - "l-*-2401" - "l-*-2399" - "l-*-2397" - "l-*-2395" - "l-*-2393" - "l-*-2391" - "l-*-2389" - "l-*-2388" - "l-*-2387" - "l-*-2385" - "l-*-2383" - "l-*-2382" - "l-*-2379" - "l-*-2378" - "l-*-2376" - "l-*-2374" - "l-*-2372" - "l-*-2370" - "l-*-2368" - "l-*-2366" - "l-*-2364" - "l-*-2362" - "l-*-2360" - "l-*-2357" - "l-*-2355" - "l-*-2353" - "l-*-2351" - "l-*-2349" - "l-*-2347" - "l-*-2345" - "l-*-2343" - "l-*-2341" - "l-*-2339" - "l-*-2337" - "l-*-2335" - "l-*-2333" - "l-*-2331" - "l-*-2329" - "l-*-2327" - "l-*-2325" - "l-*-2323" - "l-*-2321" - "l-*-2319" - "l-*-2317" - "l-*-2315" - "l-*-2313" - "l-*-2311" - "l-*-2309" - "l-*-2307" - "l-*-2306" - "l-*-2305" - "l-*-2304" - "l-*-2303" - "l-*-2301" - "l-*-2299" - "l-*-2297" - "l-*-2294" - "l-*-2292" - "l-*-2290" - "l-*-2288" - "l-*-2286" - "l-*-2284" - "l-*-2282" - "l-*-2280" - "l-*-2278" - "l-*-2276" - "l-*-2274" - "l-*-2272" - "l-*-2270" - "l-*-2268" - "l-*-2266" - "l-*-2264" - "l-*-2262" - "l-*-2260")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("l-*-2098" - "l-*-2097" - "l-*-2096"))) - (hygiene guile)) - '(()))) - #f) - (expand-6585 exp-13675 r-13631 '(()) mod-13632) - (let ((labels-13878 + (if (free-id=?-4574 + '#(syntax-object + pad + ((top) + #(ribcage + #(pat exp) + #((top) (top)) + #("l-*-4087" "l-*-4088")) + #(ribcage () () ()) + #(ribcage + #(x keys clauses r mod) + #((top) (top) (top) (top) (top)) + #("l-*-4077" + "l-*-4078" + "l-*-4079" + "l-*-4080" + "l-*-4081")) + #(ribcage + (gen-syntax-case + gen-clause + build-dispatch-call + convert-pattern) + ((top) (top) (top) (top)) + ("l-*-3890" + "l-*-3888" + "l-*-3886" + "l-*-3884")) + #(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=? + with-transformer-environment + transformer-environment + resolve-identifier + locally-bound-identifiers + 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 + session-id + 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) + (top) + (top) + (top)) + ("l-*-478" + "l-*-476" + "l-*-474" + "l-*-472" + "l-*-470" + "l-*-468" + "l-*-466" + "l-*-464" + "l-*-462" + "l-*-460" + "l-*-458" + "l-*-456" + "l-*-454" + "l-*-452" + "l-*-450" + "l-*-448" + "l-*-446" + "l-*-444" + "l-*-442" + "l-*-440" + "l-*-438" + "l-*-436" + "l-*-434" + "l-*-432" + "l-*-430" + "l-*-428" + "l-*-426" + "l-*-424" + "l-*-422" + "l-*-420" + "l-*-418" + "l-*-416" + "l-*-414" + "l-*-412" + "l-*-410" + "l-*-408" + "l-*-406" + "l-*-404" + "l-*-402" + "l-*-401" + "l-*-399" + "l-*-396" + "l-*-395" + "l-*-394" + "l-*-392" + "l-*-391" + "l-*-389" + "l-*-387" + "l-*-385" + "l-*-383" + "l-*-381" + "l-*-379" + "l-*-377" + "l-*-375" + "l-*-372" + "l-*-370" + "l-*-369" + "l-*-367" + "l-*-365" + "l-*-363" + "l-*-361" + "l-*-360" + "l-*-359" + "l-*-358" + "l-*-356" + "l-*-355" + "l-*-352" + "l-*-350" + "l-*-348" + "l-*-346" + "l-*-344" + "l-*-342" + "l-*-341" + "l-*-340" + "l-*-338" + "l-*-336" + "l-*-335" + "l-*-332" + "l-*-331" + "l-*-329" + "l-*-327" + "l-*-325" + "l-*-323" + "l-*-321" + "l-*-319" + "l-*-317" + "l-*-315" + "l-*-313" + "l-*-310" + "l-*-308" + "l-*-306" + "l-*-304" + "l-*-302" + "l-*-300" + "l-*-298" + "l-*-296" + "l-*-294" + "l-*-292" + "l-*-290" + "l-*-288" + "l-*-286" + "l-*-284" + "l-*-282" + "l-*-280" + "l-*-278" + "l-*-276" + "l-*-274" + "l-*-272" + "l-*-270" + "l-*-268" + "l-*-266" + "l-*-264" + "l-*-262" + "l-*-260" + "l-*-258" + "l-*-257" + "l-*-256" + "l-*-255" + "l-*-254" + "l-*-252" + "l-*-250" + "l-*-248" + "l-*-245" + "l-*-243" + "l-*-241" + "l-*-239" + "l-*-237" + "l-*-235" + "l-*-233" + "l-*-231" + "l-*-229" + "l-*-227" + "l-*-225" + "l-*-223" + "l-*-221" + "l-*-219" + "l-*-217" + "l-*-215" + "l-*-213" + "l-*-211" + "l-*-209")) + #(ribcage + (define-structure + define-expansion-accessors + define-expansion-constructors) + ((top) (top) (top)) + ("l-*-47" "l-*-46" "l-*-45")) + #(ribcage () () ())) + (hygiene guile)) + '#(syntax-object + _ + ((top) + #(ribcage + #(pat exp) + #((top) (top)) + #("l-*-4087" "l-*-4088")) + #(ribcage () () ()) + #(ribcage + #(x keys clauses r mod) + #((top) (top) (top) (top) (top)) + #("l-*-4077" + "l-*-4078" + "l-*-4079" + "l-*-4080" + "l-*-4081")) + #(ribcage + (gen-syntax-case + gen-clause + build-dispatch-call + convert-pattern) + ((top) (top) (top) (top)) + ("l-*-3890" + "l-*-3888" + "l-*-3886" + "l-*-3884")) + #(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=? + with-transformer-environment + transformer-environment + resolve-identifier + locally-bound-identifiers + 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 + session-id + 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) + (top) + (top) + (top)) + ("l-*-478" + "l-*-476" + "l-*-474" + "l-*-472" + "l-*-470" + "l-*-468" + "l-*-466" + "l-*-464" + "l-*-462" + "l-*-460" + "l-*-458" + "l-*-456" + "l-*-454" + "l-*-452" + "l-*-450" + "l-*-448" + "l-*-446" + "l-*-444" + "l-*-442" + "l-*-440" + "l-*-438" + "l-*-436" + "l-*-434" + "l-*-432" + "l-*-430" + "l-*-428" + "l-*-426" + "l-*-424" + "l-*-422" + "l-*-420" + "l-*-418" + "l-*-416" + "l-*-414" + "l-*-412" + "l-*-410" + "l-*-408" + "l-*-406" + "l-*-404" + "l-*-402" + "l-*-401" + "l-*-399" + "l-*-396" + "l-*-395" + "l-*-394" + "l-*-392" + "l-*-391" + "l-*-389" + "l-*-387" + "l-*-385" + "l-*-383" + "l-*-381" + "l-*-379" + "l-*-377" + "l-*-375" + "l-*-372" + "l-*-370" + "l-*-369" + "l-*-367" + "l-*-365" + "l-*-363" + "l-*-361" + "l-*-360" + "l-*-359" + "l-*-358" + "l-*-356" + "l-*-355" + "l-*-352" + "l-*-350" + "l-*-348" + "l-*-346" + "l-*-344" + "l-*-342" + "l-*-341" + "l-*-340" + "l-*-338" + "l-*-336" + "l-*-335" + "l-*-332" + "l-*-331" + "l-*-329" + "l-*-327" + "l-*-325" + "l-*-323" + "l-*-321" + "l-*-319" + "l-*-317" + "l-*-315" + "l-*-313" + "l-*-310" + "l-*-308" + "l-*-306" + "l-*-304" + "l-*-302" + "l-*-300" + "l-*-298" + "l-*-296" + "l-*-294" + "l-*-292" + "l-*-290" + "l-*-288" + "l-*-286" + "l-*-284" + "l-*-282" + "l-*-280" + "l-*-278" + "l-*-276" + "l-*-274" + "l-*-272" + "l-*-270" + "l-*-268" + "l-*-266" + "l-*-264" + "l-*-262" + "l-*-260" + "l-*-258" + "l-*-257" + "l-*-256" + "l-*-255" + "l-*-254" + "l-*-252" + "l-*-250" + "l-*-248" + "l-*-245" + "l-*-243" + "l-*-241" + "l-*-239" + "l-*-237" + "l-*-235" + "l-*-233" + "l-*-231" + "l-*-229" + "l-*-227" + "l-*-225" + "l-*-223" + "l-*-221" + "l-*-219" + "l-*-217" + "l-*-215" + "l-*-213" + "l-*-211" + "l-*-209")) + #(ribcage + (define-structure + define-expansion-accessors + define-expansion-constructors) + ((top) (top) (top)) + ("l-*-47" "l-*-46" "l-*-45")) + #(ribcage () () ())) + (hygiene guile))) + (expand-4586 exp-14376 r-14346 '(()) mod-14347) + (let ((labels-14485 (list (string-append "l-" - (session-id-6510) + (session-id-4511) (symbol->string (gensym "-"))))) - (var-13879 - (let ((id-13917 - (if (if (vector? pat-13674) + (var-14486 + (let ((id-14524 + (if (if (vector? pat-14375) (if (= (vector-length - pat-13674) + pat-14375) 4) (eq? (vector-ref - pat-13674 + pat-14375 0) 'syntax-object) #f) #f) - (vector-ref pat-13674 1) - pat-13674))) + (vector-ref pat-14375 1) + pat-14375))) (gensym (string-append - (symbol->string id-13917) + (symbol->string id-14524) "-"))))) - (build-application-6516 + (build-call-4517 #f - (build-simple-lambda-6525 + (build-simple-lambda-4526 #f - (list (syntax->datum pat-13674)) + (list (syntax->datum pat-14375)) #f - (list var-13879) + (list var-14486) '() - (expand-6585 - exp-13675 - (extend-env-6543 - labels-13878 + (expand-4586 + exp-14376 + (extend-env-4545 + labels-14485 (list (cons 'syntax - (cons var-13879 0))) - r-13631) - (make-binding-wrap-6563 - (list pat-13674) - labels-13878 + (cons var-14486 0))) + r-14346) + (make-binding-wrap-4564 + (list pat-14375) + labels-14485 '(())) - mod-13632)) - (list x-13628)))) - (gen-clause-13228 - x-13628 - keys-13629 - (cdr clauses-13630) - r-13631 - pat-13674 + mod-14347)) + (list x-14343)))) + (gen-clause-13638 + x-14343 + keys-14344 + (cdr clauses-14345) + r-14346 + pat-14375 #t - exp-13675 - mod-13632))) - tmp-13672) - (let ((tmp-14187 - ($sc-dispatch tmp-13671 '(any any any)))) - (if tmp-14187 + exp-14376 + mod-14347))) + tmp-14373) + (let ((tmp-14834 + ($sc-dispatch tmp-14372 '(any any any)))) + (if tmp-14834 (@apply - (lambda (pat-14189 fender-14190 exp-14191) - (gen-clause-13228 - x-13628 - keys-13629 - (cdr clauses-13630) - r-13631 - pat-14189 - fender-14190 - exp-14191 - mod-13632)) - tmp-14187) + (lambda (pat-14836 fender-14837 exp-14838) + (gen-clause-13638 + x-14343 + keys-14344 + (cdr clauses-14345) + r-14346 + pat-14836 + fender-14837 + exp-14838 + mod-14347)) + tmp-14834) (syntax-violation 'syntax-case "invalid clause" - (car clauses-13630))))))))))) - (lambda (e-13230 r-13231 w-13232 s-13233 mod-13234) - (let ((e-13235 - (wrap-6578 - (begin - (if (if (pair? e-13230) s-13233 #f) - (set-source-properties! e-13230 s-13233)) - e-13230) - w-13232 - mod-13234))) - (let ((tmp-13237 - ($sc-dispatch - e-13235 - '(_ any each-any . each-any)))) - (if tmp-13237 - (@apply - (lambda (val-13262 key-13263 m-13264) - (if (and-map - (lambda (x-13265) - (if (if (symbol? x-13265) - #t - (if (if (vector? x-13265) - (if (= (vector-length x-13265) 4) - (eq? (vector-ref x-13265 0) - 'syntax-object) + (car clauses-14345))))))))))) + (lambda (e-13640 r-13641 w-13642 s-13643 mod-13644) + (let ((e-13645 + (let ((x-14254 + (begin + (if (if (pair? e-13640) s-13643 #f) + (set-source-properties! e-13640 s-13643)) + e-13640))) + (if (if (null? (car w-13642)) + (null? (cdr w-13642)) + #f) + x-14254 + (if (if (vector? x-14254) + (if (= (vector-length x-14254) 4) + (eq? (vector-ref x-14254 0) 'syntax-object) + #f) + #f) + (let ((expression-14286 (vector-ref x-14254 1)) + (wrap-14287 + (let ((w2-14295 (vector-ref x-14254 2))) + (let ((m1-14296 (car w-13642)) + (s1-14297 (cdr w-13642))) + (if (null? m1-14296) + (if (null? s1-14297) + w2-14295 + (cons (car w2-14295) + (let ((m2-14312 + (cdr w2-14295))) + (if (null? m2-14312) + s1-14297 + (append + s1-14297 + m2-14312))))) + (cons (let ((m2-14320 (car w2-14295))) + (if (null? m2-14320) + m1-14296 + (append m1-14296 m2-14320))) + (let ((m2-14328 (cdr w2-14295))) + (if (null? m2-14328) + s1-14297 + (append + s1-14297 + m2-14328)))))))) + (module-14288 (vector-ref x-14254 3))) + (vector + 'syntax-object + expression-14286 + wrap-14287 + module-14288)) + (if (null? x-14254) + x-14254 + (vector + 'syntax-object + x-14254 + w-13642 + mod-13644))))))) + (let ((tmp-13646 e-13645)) + (let ((tmp-13647 + ($sc-dispatch + tmp-13646 + '(_ any each-any . each-any)))) + (if tmp-13647 + (@apply + (lambda (val-13695 key-13696 m-13697) + (if (and-map + (lambda (x-13698) + (if (if (symbol? x-13698) + #t + (if (if (vector? x-13698) + (if (= (vector-length x-13698) 4) + (eq? (vector-ref x-13698 0) + 'syntax-object) + #f) #f) - #f) - (symbol? (vector-ref x-13265 1)) - #f)) - (not (if (if (if (vector? x-13265) - (if (= (vector-length x-13265) - 4) - (eq? (vector-ref x-13265 0) - 'syntax-object) + (symbol? (vector-ref x-13698 1)) + #f)) + (not (if (if (if (vector? x-13698) + (if (= (vector-length x-13698) + 4) + (eq? (vector-ref x-13698 0) + 'syntax-object) + #f) #f) - #f) - (symbol? (vector-ref x-13265 1)) - #f) - (if (eq? (if (if (vector? x-13265) - (if (= (vector-length - x-13265) - 4) - (eq? (vector-ref - x-13265 - 0) - 'syntax-object) - #f) - #f) - (vector-ref x-13265 1) - x-13265) - (if (if (= (vector-length - '#(syntax-object - ... - ((top) - #(ribcage - () - () - ()) - #(ribcage - () - () - ()) - #(ribcage - #(x) - #((top)) - #("l-*-4404")) - #(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=? - with-transformer-environment - transformer-environment - resolve-identifier - locally-bound-identifiers - 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 - session-id - 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) - (top) - (top) - (top) - (top)) - ("l-*-2527" - "l-*-2525" - "l-*-2523" - "l-*-2521" - "l-*-2519" - "l-*-2517" - "l-*-2515" - "l-*-2513" - "l-*-2511" - "l-*-2509" - "l-*-2507" - "l-*-2505" - "l-*-2503" - "l-*-2501" - "l-*-2499" - "l-*-2497" - "l-*-2495" - "l-*-2493" - "l-*-2491" - "l-*-2489" - "l-*-2487" - "l-*-2485" - "l-*-2483" - "l-*-2481" - "l-*-2479" - "l-*-2477" - "l-*-2475" - "l-*-2473" - "l-*-2471" - "l-*-2469" - "l-*-2467" - "l-*-2465" - "l-*-2463" - "l-*-2461" - "l-*-2459" - "l-*-2457" - "l-*-2455" - "l-*-2453" - "l-*-2451" - "l-*-2450" - "l-*-2448" - "l-*-2445" - "l-*-2444" - "l-*-2443" - "l-*-2441" - "l-*-2440" - "l-*-2438" - "l-*-2436" - "l-*-2434" - "l-*-2432" - "l-*-2430" - "l-*-2428" - "l-*-2426" - "l-*-2424" - "l-*-2421" - "l-*-2419" - "l-*-2418" - "l-*-2416" - "l-*-2414" - "l-*-2412" - "l-*-2410" - "l-*-2409" - "l-*-2408" - "l-*-2407" - "l-*-2405" - "l-*-2404" - "l-*-2401" - "l-*-2399" - "l-*-2397" - "l-*-2395" - "l-*-2393" - "l-*-2391" - "l-*-2389" - "l-*-2388" - "l-*-2387" - "l-*-2385" - "l-*-2383" - "l-*-2382" - "l-*-2379" - "l-*-2378" - "l-*-2376" - "l-*-2374" - "l-*-2372" - "l-*-2370" - "l-*-2368" - "l-*-2366" - "l-*-2364" - "l-*-2362" - "l-*-2360" - "l-*-2357" - "l-*-2355" - "l-*-2353" - "l-*-2351" - "l-*-2349" - "l-*-2347" - "l-*-2345" - "l-*-2343" - "l-*-2341" - "l-*-2339" - "l-*-2337" - "l-*-2335" - "l-*-2333" - "l-*-2331" - "l-*-2329" - "l-*-2327" - "l-*-2325" - "l-*-2323" - "l-*-2321" - "l-*-2319" - "l-*-2317" - "l-*-2315" - "l-*-2313" - "l-*-2311" - "l-*-2309" - "l-*-2307" - "l-*-2306" - "l-*-2305" - "l-*-2304" - "l-*-2303" - "l-*-2301" - "l-*-2299" - "l-*-2297" - "l-*-2294" - "l-*-2292" - "l-*-2290" - "l-*-2288" - "l-*-2286" - "l-*-2284" - "l-*-2282" - "l-*-2280" - "l-*-2278" - "l-*-2276" - "l-*-2274" - "l-*-2272" - "l-*-2270" - "l-*-2268" - "l-*-2266" - "l-*-2264" - "l-*-2262" - "l-*-2260")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) - (top) - (top)) - ("l-*-2098" - "l-*-2097" - "l-*-2096"))) - (hygiene - guile))) - 4) - #t - #f) - '... - '#(syntax-object - ... - ((top) - #(ribcage () () ()) - #(ribcage () () ()) - #(ribcage - #(x) - #((top)) - #("l-*-4404")) - #(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=? - with-transformer-environment - transformer-environment - resolve-identifier - locally-bound-identifiers - 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 - session-id - 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) - (top) - (top) - (top) - (top)) - ("l-*-2527" - "l-*-2525" - "l-*-2523" - "l-*-2521" - "l-*-2519" - "l-*-2517" - "l-*-2515" - "l-*-2513" - "l-*-2511" - "l-*-2509" - "l-*-2507" - "l-*-2505" - "l-*-2503" - "l-*-2501" - "l-*-2499" - "l-*-2497" - "l-*-2495" - "l-*-2493" - "l-*-2491" - "l-*-2489" - "l-*-2487" - "l-*-2485" - "l-*-2483" - "l-*-2481" - "l-*-2479" - "l-*-2477" - "l-*-2475" - "l-*-2473" - "l-*-2471" - "l-*-2469" - "l-*-2467" - "l-*-2465" - "l-*-2463" - "l-*-2461" - "l-*-2459" - "l-*-2457" - "l-*-2455" - "l-*-2453" - "l-*-2451" - "l-*-2450" - "l-*-2448" - "l-*-2445" - "l-*-2444" - "l-*-2443" - "l-*-2441" - "l-*-2440" - "l-*-2438" - "l-*-2436" - "l-*-2434" - "l-*-2432" - "l-*-2430" - "l-*-2428" - "l-*-2426" - "l-*-2424" - "l-*-2421" - "l-*-2419" - "l-*-2418" - "l-*-2416" - "l-*-2414" - "l-*-2412" - "l-*-2410" - "l-*-2409" - "l-*-2408" - "l-*-2407" - "l-*-2405" - "l-*-2404" - "l-*-2401" - "l-*-2399" - "l-*-2397" - "l-*-2395" - "l-*-2393" - "l-*-2391" - "l-*-2389" - "l-*-2388" - "l-*-2387" - "l-*-2385" - "l-*-2383" - "l-*-2382" - "l-*-2379" - "l-*-2378" - "l-*-2376" - "l-*-2374" - "l-*-2372" - "l-*-2370" - "l-*-2368" - "l-*-2366" - "l-*-2364" - "l-*-2362" - "l-*-2360" - "l-*-2357" - "l-*-2355" - "l-*-2353" - "l-*-2351" - "l-*-2349" - "l-*-2347" - "l-*-2345" - "l-*-2343" - "l-*-2341" - "l-*-2339" - "l-*-2337" - "l-*-2335" - "l-*-2333" - "l-*-2331" - "l-*-2329" - "l-*-2327" - "l-*-2325" - "l-*-2323" - "l-*-2321" - "l-*-2319" - "l-*-2317" - "l-*-2315" - "l-*-2313" - "l-*-2311" - "l-*-2309" - "l-*-2307" - "l-*-2306" - "l-*-2305" - "l-*-2304" - "l-*-2303" - "l-*-2301" - "l-*-2299" - "l-*-2297" - "l-*-2294" - "l-*-2292" - "l-*-2290" - "l-*-2288" - "l-*-2286" - "l-*-2284" - "l-*-2282" - "l-*-2280" - "l-*-2278" - "l-*-2276" - "l-*-2274" - "l-*-2272" - "l-*-2270" - "l-*-2268" - "l-*-2266" - "l-*-2264" - "l-*-2262" - "l-*-2260")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("l-*-2098" - "l-*-2097" - "l-*-2096"))) - (hygiene guile)))) - (eq? (id-var-name-6568 x-13265 '(())) - (id-var-name-6568 - '#(syntax-object - ... - ((top) - #(ribcage () () ()) - #(ribcage () () ()) - #(ribcage - #(x) - #((top)) - #("l-*-4404")) - #(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=? - with-transformer-environment - transformer-environment - resolve-identifier - locally-bound-identifiers - 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 - session-id - 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) - (top) - (top) - (top) - (top)) - ("l-*-2527" - "l-*-2525" - "l-*-2523" - "l-*-2521" - "l-*-2519" - "l-*-2517" - "l-*-2515" - "l-*-2513" - "l-*-2511" - "l-*-2509" - "l-*-2507" - "l-*-2505" - "l-*-2503" - "l-*-2501" - "l-*-2499" - "l-*-2497" - "l-*-2495" - "l-*-2493" - "l-*-2491" - "l-*-2489" - "l-*-2487" - "l-*-2485" - "l-*-2483" - "l-*-2481" - "l-*-2479" - "l-*-2477" - "l-*-2475" - "l-*-2473" - "l-*-2471" - "l-*-2469" - "l-*-2467" - "l-*-2465" - "l-*-2463" - "l-*-2461" - "l-*-2459" - "l-*-2457" - "l-*-2455" - "l-*-2453" - "l-*-2451" - "l-*-2450" - "l-*-2448" - "l-*-2445" - "l-*-2444" - "l-*-2443" - "l-*-2441" - "l-*-2440" - "l-*-2438" - "l-*-2436" - "l-*-2434" - "l-*-2432" - "l-*-2430" - "l-*-2428" - "l-*-2426" - "l-*-2424" - "l-*-2421" - "l-*-2419" - "l-*-2418" - "l-*-2416" - "l-*-2414" - "l-*-2412" - "l-*-2410" - "l-*-2409" - "l-*-2408" - "l-*-2407" - "l-*-2405" - "l-*-2404" - "l-*-2401" - "l-*-2399" - "l-*-2397" - "l-*-2395" - "l-*-2393" - "l-*-2391" - "l-*-2389" - "l-*-2388" - "l-*-2387" - "l-*-2385" - "l-*-2383" - "l-*-2382" - "l-*-2379" - "l-*-2378" - "l-*-2376" - "l-*-2374" - "l-*-2372" - "l-*-2370" - "l-*-2368" - "l-*-2366" - "l-*-2364" - "l-*-2362" - "l-*-2360" - "l-*-2357" - "l-*-2355" - "l-*-2353" - "l-*-2351" - "l-*-2349" - "l-*-2347" - "l-*-2345" - "l-*-2343" - "l-*-2341" - "l-*-2339" - "l-*-2337" - "l-*-2335" - "l-*-2333" - "l-*-2331" - "l-*-2329" - "l-*-2327" - "l-*-2325" - "l-*-2323" - "l-*-2321" - "l-*-2319" - "l-*-2317" - "l-*-2315" - "l-*-2313" - "l-*-2311" - "l-*-2309" - "l-*-2307" - "l-*-2306" - "l-*-2305" - "l-*-2304" - "l-*-2303" - "l-*-2301" - "l-*-2299" - "l-*-2297" - "l-*-2294" - "l-*-2292" - "l-*-2290" - "l-*-2288" - "l-*-2286" - "l-*-2284" - "l-*-2282" - "l-*-2280" - "l-*-2278" - "l-*-2276" - "l-*-2274" - "l-*-2272" - "l-*-2270" - "l-*-2268" - "l-*-2266" - "l-*-2264" - "l-*-2262" - "l-*-2260")) - #(ribcage - (define-structure - define-expansion-accessors - define-expansion-constructors) - ((top) (top) (top)) - ("l-*-2098" - "l-*-2097" - "l-*-2096"))) - (hygiene guile)) - '(()))) - #f) - #f)) - #f)) - key-13263) - (let ((x-13391 - (gensym - (string-append (symbol->string 'tmp) "-")))) - (build-application-6516 - s-13233 - (let ((req-13521 (list 'tmp)) - (vars-13523 (list x-13391)) - (exp-13525 - (gen-syntax-case-13229 - (make-struct/no-tail - (vector-ref %expanded-vtables 3) - #f - 'tmp - x-13391) - key-13263 - m-13264 - r-13231 - mod-13234))) - (let ((body-13530 - (make-struct/no-tail - (vector-ref %expanded-vtables 14) - #f - req-13521 - #f - #f - #f - '() - vars-13523 - exp-13525 - #f))) - (make-struct/no-tail - (vector-ref %expanded-vtables 13) - #f - '() - body-13530))) - (list (expand-6585 - val-13262 - r-13231 - '(()) - mod-13234)))) - (syntax-violation - 'syntax-case - "invalid literals list" - e-13235))) - tmp-13237) - (syntax-violation - #f - "source expression failed to match any pattern" - e-13235))))))) + (symbol? (vector-ref x-13698 1)) + #f) + (free-id=?-4574 + x-13698 + '#(syntax-object + ... + ((top) + #(ribcage () () ()) + #(ribcage () () ()) + #(ribcage + #(x) + #((top)) + #("l-*-2416")) + #(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=? + with-transformer-environment + transformer-environment + resolve-identifier + locally-bound-identifiers + 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 + session-id + 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) + (top) + (top) + (top)) + ("l-*-478" + "l-*-476" + "l-*-474" + "l-*-472" + "l-*-470" + "l-*-468" + "l-*-466" + "l-*-464" + "l-*-462" + "l-*-460" + "l-*-458" + "l-*-456" + "l-*-454" + "l-*-452" + "l-*-450" + "l-*-448" + "l-*-446" + "l-*-444" + "l-*-442" + "l-*-440" + "l-*-438" + "l-*-436" + "l-*-434" + "l-*-432" + "l-*-430" + "l-*-428" + "l-*-426" + "l-*-424" + "l-*-422" + "l-*-420" + "l-*-418" + "l-*-416" + "l-*-414" + "l-*-412" + "l-*-410" + "l-*-408" + "l-*-406" + "l-*-404" + "l-*-402" + "l-*-401" + "l-*-399" + "l-*-396" + "l-*-395" + "l-*-394" + "l-*-392" + "l-*-391" + "l-*-389" + "l-*-387" + "l-*-385" + "l-*-383" + "l-*-381" + "l-*-379" + "l-*-377" + "l-*-375" + "l-*-372" + "l-*-370" + "l-*-369" + "l-*-367" + "l-*-365" + "l-*-363" + "l-*-361" + "l-*-360" + "l-*-359" + "l-*-358" + "l-*-356" + "l-*-355" + "l-*-352" + "l-*-350" + "l-*-348" + "l-*-346" + "l-*-344" + "l-*-342" + "l-*-341" + "l-*-340" + "l-*-338" + "l-*-336" + "l-*-335" + "l-*-332" + "l-*-331" + "l-*-329" + "l-*-327" + "l-*-325" + "l-*-323" + "l-*-321" + "l-*-319" + "l-*-317" + "l-*-315" + "l-*-313" + "l-*-310" + "l-*-308" + "l-*-306" + "l-*-304" + "l-*-302" + "l-*-300" + "l-*-298" + "l-*-296" + "l-*-294" + "l-*-292" + "l-*-290" + "l-*-288" + "l-*-286" + "l-*-284" + "l-*-282" + "l-*-280" + "l-*-278" + "l-*-276" + "l-*-274" + "l-*-272" + "l-*-270" + "l-*-268" + "l-*-266" + "l-*-264" + "l-*-262" + "l-*-260" + "l-*-258" + "l-*-257" + "l-*-256" + "l-*-255" + "l-*-254" + "l-*-252" + "l-*-250" + "l-*-248" + "l-*-245" + "l-*-243" + "l-*-241" + "l-*-239" + "l-*-237" + "l-*-235" + "l-*-233" + "l-*-231" + "l-*-229" + "l-*-227" + "l-*-225" + "l-*-223" + "l-*-221" + "l-*-219" + "l-*-217" + "l-*-215" + "l-*-213" + "l-*-211" + "l-*-209")) + #(ribcage + (define-structure + define-expansion-accessors + define-expansion-constructors) + ((top) (top) (top)) + ("l-*-47" "l-*-46" "l-*-45")) + #(ribcage () () ())) + (hygiene guile))) + #f)) + #f)) + key-13696) + (let ((x-13763 + (gensym + (string-append + (symbol->string 'tmp) + "-")))) + (build-call-4517 + s-13643 + (let ((req-13901 (list 'tmp)) + (vars-13903 (list x-13763)) + (exp-13905 + (gen-syntax-case-13639 + (make-struct/no-tail + (vector-ref %expanded-vtables 3) + #f + 'tmp + x-13763) + key-13696 + m-13697 + r-13641 + mod-13644))) + (let ((body-13910 + (make-struct/no-tail + (vector-ref %expanded-vtables 15) + #f + req-13901 + #f + #f + #f + '() + vars-13903 + exp-13905 + #f))) + (make-struct/no-tail + (vector-ref %expanded-vtables 14) + #f + '() + body-13910))) + (list (expand-4586 + val-13695 + r-13641 + '(()) + mod-13644)))) + (syntax-violation + 'syntax-case + "invalid literals list" + e-13645))) + tmp-13647) + (syntax-violation + #f + "source expression failed to match any pattern" + tmp-13646)))))))) (set! macroexpand (lambda* - (x-15948 + (x-16590 #:optional - (m-15949 'e) - (esew-15950 '(eval))) - (expand-top-sequence-6581 - (list x-15948) + (m-16591 'e) + (esew-16592 '(eval))) + (expand-top-sequence-4582 + (list x-16590) '() '((top)) #f - m-15949 - esew-15950 + m-16591 + esew-16592 (cons 'hygiene (module-name (current-module)))))) (set! identifier? - (lambda (x-15953) - (if (if (vector? x-15953) - (if (= (vector-length x-15953) 4) - (eq? (vector-ref x-15953 0) 'syntax-object) + (lambda (x-16595) + (if (if (vector? x-16595) + (if (= (vector-length x-16595) 4) + (eq? (vector-ref x-16595 0) 'syntax-object) #f) #f) - (symbol? (vector-ref x-15953 1)) + (symbol? (vector-ref x-16595 1)) #f))) (set! datum->syntax - (lambda (id-15978 datum-15979) - (let ((wrap-15984 (vector-ref id-15978 2)) - (module-15985 (vector-ref id-15978 3))) + (lambda (id-16620 datum-16621) + (let ((wrap-16626 (vector-ref id-16620 2)) + (module-16627 (vector-ref id-16620 3))) (vector 'syntax-object - datum-15979 - wrap-15984 - module-15985)))) + datum-16621 + wrap-16626 + module-16627)))) (set! syntax->datum - (lambda (x-15992) (strip-6598 x-15992 '(())))) + (lambda (x-16634) (strip-4599 x-16634 '(())))) (set! syntax-source - (lambda (x-15995) - (source-annotation-6542 x-15995))) + (lambda (x-16637) + (source-annotation-4544 x-16637))) (set! generate-temporaries - (lambda (ls-16148) + (lambda (ls-16821) (begin - (if (not (list? ls-16148)) + (if (not (list? ls-16821)) (syntax-violation 'generate-temporaries "invalid argument" - ls-16148)) - (let ((mod-16156 + ls-16821)) + (let ((mod-16829 (cons 'hygiene (module-name (current-module))))) - (map (lambda (x-16157) - (wrap-6578 (gensym "t-") '((top)) mod-16156)) - ls-16148))))) + (map (lambda (x-16830) + (let ((x-16834 (gensym "t-"))) + (if (if (vector? x-16834) + (if (= (vector-length x-16834) 4) + (eq? (vector-ref x-16834 0) 'syntax-object) + #f) + #f) + (let ((expression-16849 (vector-ref x-16834 1)) + (wrap-16850 + (let ((w2-16858 (vector-ref x-16834 2))) + (cons (let ((m2-16865 (car w2-16858))) + (if (null? m2-16865) + '(top) + (append '(top) m2-16865))) + (let ((m2-16872 (cdr w2-16858))) + (if (null? m2-16872) + '() + (append '() m2-16872)))))) + (module-16851 (vector-ref x-16834 3))) + (vector + 'syntax-object + expression-16849 + wrap-16850 + module-16851)) + (if (null? x-16834) + x-16834 + (vector + 'syntax-object + x-16834 + '((top)) + mod-16829))))) + ls-16821))))) (set! free-identifier=? - (lambda (x-16161 y-16162) + (lambda (x-16881 y-16882) (begin - (if (not (if (if (vector? x-16161) - (if (= (vector-length x-16161) 4) - (eq? (vector-ref x-16161 0) 'syntax-object) + (if (not (if (if (vector? x-16881) + (if (= (vector-length x-16881) 4) + (eq? (vector-ref x-16881 0) 'syntax-object) #f) #f) - (symbol? (vector-ref x-16161 1)) + (symbol? (vector-ref x-16881 1)) #f)) (syntax-violation 'free-identifier=? "invalid argument" - x-16161)) - (if (not (if (if (vector? y-16162) - (if (= (vector-length y-16162) 4) - (eq? (vector-ref y-16162 0) 'syntax-object) + x-16881)) + (if (not (if (if (vector? y-16882) + (if (= (vector-length y-16882) 4) + (eq? (vector-ref y-16882 0) 'syntax-object) #f) #f) - (symbol? (vector-ref y-16162 1)) + (symbol? (vector-ref y-16882 1)) #f)) (syntax-violation 'free-identifier=? "invalid argument" - y-16162)) - (if (eq? (if (if (vector? x-16161) - (if (= (vector-length x-16161) 4) - (eq? (vector-ref x-16161 0) 'syntax-object) - #f) - #f) - (vector-ref x-16161 1) - x-16161) - (if (if (vector? y-16162) - (if (= (vector-length y-16162) 4) - (eq? (vector-ref y-16162 0) 'syntax-object) - #f) - #f) - (vector-ref y-16162 1) - y-16162)) - (eq? (id-var-name-6568 x-16161 '(())) - (id-var-name-6568 y-16162 '(()))) - #f)))) + y-16882)) + (free-id=?-4574 x-16881 y-16882)))) (set! bound-identifier=? - (lambda (x-16312 y-16313) + (lambda (x-16957 y-16958) (begin - (if (not (if (if (vector? x-16312) - (if (= (vector-length x-16312) 4) - (eq? (vector-ref x-16312 0) 'syntax-object) + (if (not (if (if (vector? x-16957) + (if (= (vector-length x-16957) 4) + (eq? (vector-ref x-16957 0) 'syntax-object) #f) #f) - (symbol? (vector-ref x-16312 1)) + (symbol? (vector-ref x-16957 1)) #f)) (syntax-violation 'bound-identifier=? "invalid argument" - x-16312)) - (if (not (if (if (vector? y-16313) - (if (= (vector-length y-16313) 4) - (eq? (vector-ref y-16313 0) 'syntax-object) + x-16957)) + (if (not (if (if (vector? y-16958) + (if (= (vector-length y-16958) 4) + (eq? (vector-ref y-16958 0) 'syntax-object) #f) #f) - (symbol? (vector-ref y-16313 1)) + (symbol? (vector-ref y-16958 1)) #f)) (syntax-violation 'bound-identifier=? "invalid argument" - y-16313)) - (if (if (if (vector? x-16312) - (if (= (vector-length x-16312) 4) - (eq? (vector-ref x-16312 0) 'syntax-object) - #f) - #f) - (if (vector? y-16313) - (if (= (vector-length y-16313) 4) - (eq? (vector-ref y-16313 0) 'syntax-object) - #f) - #f) - #f) - (if (eq? (vector-ref x-16312 1) - (vector-ref y-16313 1)) - (same-marks?-6567 - (car (vector-ref x-16312 2)) - (car (vector-ref y-16313 2))) - #f) - (eq? x-16312 y-16313))))) + y-16958)) + (bound-id=?-4575 x-16957 y-16958)))) (set! syntax-violation (lambda* - (who-16446 - message-16447 - form-16448 + (who-17124 + message-17125 + form-17126 #:optional - (subform-16449 #f)) + (subform-17127 #f)) (begin - (if (not (if (not who-16446) - (not who-16446) - (let ((t-16467 (string? who-16446))) - (if t-16467 t-16467 (symbol? who-16446))))) + (if (not (if (not who-17124) + (not who-17124) + (let ((t-17145 (string? who-17124))) + (if t-17145 t-17145 (symbol? who-17124))))) (syntax-violation 'syntax-violation "invalid argument" - who-16446)) - (if (not (string? message-16447)) + who-17124)) + (if (not (string? message-17125)) (syntax-violation 'syntax-violation "invalid argument" - message-16447)) + message-17125)) (throw 'syntax-error - who-16446 - message-16447 - (source-annotation-6542 - (if form-16448 form-16448 subform-16449)) - (strip-6598 form-16448 '(())) - (if subform-16449 - (strip-6598 subform-16449 '(())) + who-17124 + message-17125 + (source-annotation-4544 + (if form-17126 form-17126 subform-17127)) + (strip-4599 form-17126 '(())) + (if subform-17127 + (strip-4599 subform-17127 '(())) #f))))) (letrec* - ((syntax-local-binding-16671 - (lambda (id-16804) + ((syntax-local-binding-17377 + (lambda (id-17517) (begin - (if (not (if (if (vector? id-16804) - (if (= (vector-length id-16804) 4) - (eq? (vector-ref id-16804 0) 'syntax-object) + (if (not (if (if (vector? id-17517) + (if (= (vector-length id-17517) 4) + (eq? (vector-ref id-17517 0) 'syntax-object) #f) #f) - (symbol? (vector-ref id-16804 1)) + (symbol? (vector-ref id-17517 1)) #f)) (syntax-violation 'syntax-local-binding "invalid argument" - id-16804)) - ((fluid-ref transformer-environment-6571) - (lambda (e-16844 - r-16845 - w-16846 - s-16847 - rib-16848 - mod-16849) + id-17517)) + ((fluid-ref transformer-environment-4572) + (lambda (e-17557 + r-17558 + w-17559 + s-17560 + rib-17561 + mod-17562) (call-with-values (lambda () - (let ((id-16852 (vector-ref id-16804 1)) - (w-16853 - (let ((w-16864 (vector-ref id-16804 2))) - (let ((ms-16865 (car w-16864)) - (s-16866 (cdr w-16864))) - (if (if (pair? ms-16865) - (eq? (car ms-16865) #f) - #f) - (cons (cdr ms-16865) - (if rib-16848 - (cons rib-16848 (cdr s-16866)) - (cdr s-16866))) - (cons ms-16865 - (if rib-16848 - (cons rib-16848 s-16866) - s-16866)))))) - (mod-16855 (vector-ref id-16804 3))) - (let ((n-16858 (id-var-name-6568 id-16852 w-16853))) - (if (symbol? n-16858) - (let ((mod-16872 - (if (if (vector? id-16852) - (if (= (vector-length id-16852) 4) - (eq? (vector-ref id-16852 0) - 'syntax-object) - #f) - #f) - (vector-ref id-16852 3) - mod-16855))) - (let ((b-16873 - (let ((t-16874 - (get-global-definition-hook-6512 - n-16858 - mod-16872))) - (if t-16874 t-16874 '(global))))) - (if (eq? (car b-16873) 'global) - (values 'global n-16858 mod-16872) - (values - (car b-16873) - (cdr b-16873) - mod-16872)))) - (if (string? n-16858) - (let ((mod-16900 - (if (if (vector? id-16852) - (if (= (vector-length id-16852) 4) - (eq? (vector-ref id-16852 0) - 'syntax-object) - #f) - #f) - (vector-ref id-16852 3) - mod-16855))) - (let ((b-16901 - (let ((t-16902 - (assq-ref r-16845 n-16858))) - (if t-16902 - t-16902 - '(displaced-lexical))))) - (values - (car b-16901) - (cdr b-16901) - mod-16900))) - (error "unexpected id-var-name" - id-16852 - w-16853 - n-16858)))))) - (lambda (type-16915 value-16916 mod-16917) - (if (eqv? type-16915 'lexical) - (values 'lexical value-16916) - (if (eqv? type-16915 'macro) - (values 'macro value-16916) - (if (eqv? type-16915 'syntax) - (values 'pattern-variable value-16916) - (if (eqv? type-16915 'displaced-lexical) + (resolve-identifier-4571 + (vector-ref id-17517 1) + (let ((w-17569 (vector-ref id-17517 2))) + (let ((ms-17570 (car w-17569)) + (s-17571 (cdr w-17569))) + (if (if (pair? ms-17570) + (eq? (car ms-17570) #f) + #f) + (cons (cdr ms-17570) + (if rib-17561 + (cons rib-17561 (cdr s-17571)) + (cdr s-17571))) + (cons ms-17570 + (if rib-17561 + (cons rib-17561 s-17571) + s-17571))))) + r-17558 + (vector-ref id-17517 3) + #t)) + (lambda (type-17578 value-17579 mod-17580) + (if (eqv? type-17578 'lexical) + (values 'lexical value-17579) + (if (eqv? type-17578 'macro) + (values 'macro value-17579) + (if (eqv? type-17578 'syntax) + (values 'pattern-variable value-17579) + (if (eqv? type-17578 'displaced-lexical) (values 'displaced-lexical #f) - (if (eqv? type-16915 'global) + (if (eqv? type-17578 'global) (values 'global - (cons value-16916 (cdr mod-16917))) + (cons value-17579 (cdr mod-17580))) (values 'other #f))))))))))))) - (syntax-locally-bound-identifiers-16672 - (lambda (id-16928) + (syntax-locally-bound-identifiers-17378 + (lambda (id-17591) (begin - (if (not (if (if (vector? id-16928) - (if (= (vector-length id-16928) 4) - (eq? (vector-ref id-16928 0) 'syntax-object) + (if (not (if (if (vector? id-17591) + (if (= (vector-length id-17591) 4) + (eq? (vector-ref id-17591 0) 'syntax-object) #f) #f) - (symbol? (vector-ref id-16928 1)) + (symbol? (vector-ref id-17591 1)) #f)) (syntax-violation 'syntax-locally-bound-identifiers "invalid argument" - id-16928)) - (locally-bound-identifiers-6569 - (vector-ref id-16928 2) - (vector-ref id-16928 3)))))) + id-17591)) + (locally-bound-identifiers-4570 + (vector-ref id-17591 2) + (vector-ref id-17591 3)))))) (begin (define! 'syntax-module - (lambda (id-16674) + (lambda (id-17380) (begin - (if (not (if (if (vector? id-16674) - (if (= (vector-length id-16674) 4) - (eq? (vector-ref id-16674 0) 'syntax-object) + (if (not (if (if (vector? id-17380) + (if (= (vector-length id-17380) 4) + (eq? (vector-ref id-17380 0) 'syntax-object) #f) #f) - (symbol? (vector-ref id-16674 1)) + (symbol? (vector-ref id-17380 1)) #f)) (syntax-violation 'syntax-module "invalid argument" - id-16674)) - (cdr (vector-ref id-16674 3))))) + id-17380)) + (cdr (vector-ref id-17380 3))))) (define! 'syntax-local-binding - syntax-local-binding-16671) + syntax-local-binding-17377) (define! 'syntax-locally-bound-identifiers - syntax-locally-bound-identifiers-16672))) + syntax-locally-bound-identifiers-17378))) (letrec* - ((match-each-17035 - (lambda (e-17622 p-17623 w-17624 mod-17625) - (if (pair? e-17622) - (let ((first-17626 - (match-17041 - (car e-17622) - p-17623 - w-17624 + ((match-each-17708 + (lambda (e-18587 p-18588 w-18589 mod-18590) + (if (pair? e-18587) + (let ((first-18591 + (match-17714 + (car e-18587) + p-18588 + w-18589 '() - mod-17625))) - (if first-17626 - (let ((rest-17629 - (match-each-17035 - (cdr e-17622) - p-17623 - w-17624 - mod-17625))) - (if rest-17629 (cons first-17626 rest-17629) #f)) + mod-18590))) + (if first-18591 + (let ((rest-18594 + (match-each-17708 + (cdr e-18587) + p-18588 + w-18589 + mod-18590))) + (if rest-18594 (cons first-18591 rest-18594) #f)) #f)) - (if (null? e-17622) + (if (null? e-18587) '() - (if (if (vector? e-17622) - (if (= (vector-length e-17622) 4) - (eq? (vector-ref e-17622 0) 'syntax-object) + (if (if (vector? e-18587) + (if (= (vector-length e-18587) 4) + (eq? (vector-ref e-18587 0) 'syntax-object) #f) #f) - (match-each-17035 - (vector-ref e-17622 1) - p-17623 - (join-wraps-6565 w-17624 (vector-ref e-17622 2)) - (vector-ref e-17622 3)) + (match-each-17708 + (vector-ref e-18587 1) + p-18588 + (let ((w2-18616 (vector-ref e-18587 2))) + (let ((m1-18617 (car w-18589)) + (s1-18618 (cdr w-18589))) + (if (null? m1-18617) + (if (null? s1-18618) + w2-18616 + (cons (car w2-18616) + (let ((m2-18629 (cdr w2-18616))) + (if (null? m2-18629) + s1-18618 + (append s1-18618 m2-18629))))) + (cons (let ((m2-18637 (car w2-18616))) + (if (null? m2-18637) + m1-18617 + (append m1-18617 m2-18637))) + (let ((m2-18645 (cdr w2-18616))) + (if (null? m2-18645) + s1-18618 + (append s1-18618 m2-18645))))))) + (vector-ref e-18587 3)) #f))))) - (match-each-any-17037 - (lambda (e-17657 w-17658 mod-17659) - (if (pair? e-17657) - (let ((l-17660 - (match-each-any-17037 - (cdr e-17657) - w-17658 - mod-17659))) - (if l-17660 - (cons (wrap-6578 (car e-17657) w-17658 mod-17659) - l-17660) + (match-each-any-17710 + (lambda (e-18654 w-18655 mod-18656) + (if (pair? e-18654) + (let ((l-18657 + (match-each-any-17710 + (cdr e-18654) + w-18655 + mod-18656))) + (if l-18657 + (cons (let ((x-18662 (car e-18654))) + (if (if (null? (car w-18655)) + (null? (cdr w-18655)) + #f) + x-18662 + (if (if (vector? x-18662) + (if (= (vector-length x-18662) 4) + (eq? (vector-ref x-18662 0) + 'syntax-object) + #f) + #f) + (let ((expression-18680 (vector-ref x-18662 1)) + (wrap-18681 + (let ((w2-18689 (vector-ref x-18662 2))) + (let ((m1-18690 (car w-18655)) + (s1-18691 (cdr w-18655))) + (if (null? m1-18690) + (if (null? s1-18691) + w2-18689 + (cons (car w2-18689) + (let ((m2-18706 + (cdr w2-18689))) + (if (null? m2-18706) + s1-18691 + (append + s1-18691 + m2-18706))))) + (cons (let ((m2-18714 + (car w2-18689))) + (if (null? m2-18714) + m1-18690 + (append + m1-18690 + m2-18714))) + (let ((m2-18722 + (cdr w2-18689))) + (if (null? m2-18722) + s1-18691 + (append + s1-18691 + m2-18722)))))))) + (module-18682 (vector-ref x-18662 3))) + (vector + 'syntax-object + expression-18680 + wrap-18681 + module-18682)) + (if (null? x-18662) + x-18662 + (vector + 'syntax-object + x-18662 + w-18655 + mod-18656))))) + l-18657) #f)) - (if (null? e-17657) + (if (null? e-18654) '() - (if (if (vector? e-17657) - (if (= (vector-length e-17657) 4) - (eq? (vector-ref e-17657 0) 'syntax-object) + (if (if (vector? e-18654) + (if (= (vector-length e-18654) 4) + (eq? (vector-ref e-18654 0) 'syntax-object) #f) #f) - (match-each-any-17037 - (vector-ref e-17657 1) - (join-wraps-6565 w-17658 (vector-ref e-17657 2)) - mod-17659) + (match-each-any-17710 + (vector-ref e-18654 1) + (let ((w2-18755 (vector-ref e-18654 2))) + (let ((m1-18756 (car w-18655)) + (s1-18757 (cdr w-18655))) + (if (null? m1-18756) + (if (null? s1-18757) + w2-18755 + (cons (car w2-18755) + (let ((m2-18768 (cdr w2-18755))) + (if (null? m2-18768) + s1-18757 + (append s1-18757 m2-18768))))) + (cons (let ((m2-18776 (car w2-18755))) + (if (null? m2-18776) + m1-18756 + (append m1-18756 m2-18776))) + (let ((m2-18784 (cdr w2-18755))) + (if (null? m2-18784) + s1-18757 + (append s1-18757 m2-18784))))))) + mod-18656) #f))))) - (match-empty-17038 - (lambda (p-17684 r-17685) - (if (null? p-17684) - r-17685 - (if (eq? p-17684 '_) - r-17685 - (if (eq? p-17684 'any) - (cons '() r-17685) - (if (pair? p-17684) - (match-empty-17038 - (car p-17684) - (match-empty-17038 (cdr p-17684) r-17685)) - (if (eq? p-17684 'each-any) - (cons '() r-17685) - (let ((atom-key-17686 (vector-ref p-17684 0))) - (if (eqv? atom-key-17686 'each) - (match-empty-17038 - (vector-ref p-17684 1) - r-17685) - (if (eqv? atom-key-17686 'each+) - (match-empty-17038 - (vector-ref p-17684 1) - (match-empty-17038 - (reverse (vector-ref p-17684 2)) - (match-empty-17038 - (vector-ref p-17684 3) - r-17685))) - (if (if (eqv? atom-key-17686 'free-id) + (match-empty-17711 + (lambda (p-18789 r-18790) + (if (null? p-18789) + r-18790 + (if (eq? p-18789 '_) + r-18790 + (if (eq? p-18789 'any) + (cons '() r-18790) + (if (pair? p-18789) + (match-empty-17711 + (car p-18789) + (match-empty-17711 (cdr p-18789) r-18790)) + (if (eq? p-18789 'each-any) + (cons '() r-18790) + (let ((atom-key-18791 (vector-ref p-18789 0))) + (if (eqv? atom-key-18791 'each) + (match-empty-17711 + (vector-ref p-18789 1) + r-18790) + (if (eqv? atom-key-18791 'each+) + (match-empty-17711 + (vector-ref p-18789 1) + (match-empty-17711 + (reverse (vector-ref p-18789 2)) + (match-empty-17711 + (vector-ref p-18789 3) + r-18790))) + (if (if (eqv? atom-key-18791 'free-id) #t - (eqv? atom-key-17686 'atom)) - r-17685 - (if (eqv? atom-key-17686 'vector) - (match-empty-17038 - (vector-ref p-17684 1) - r-17685))))))))))))) - (combine-17039 - (lambda (r*-17705 r-17706) - (if (null? (car r*-17705)) - r-17706 - (cons (map car r*-17705) - (combine-17039 (map cdr r*-17705) r-17706))))) - (match*-17040 - (lambda (e-17070 p-17071 w-17072 r-17073 mod-17074) - (if (null? p-17071) - (if (null? e-17070) r-17073 #f) - (if (pair? p-17071) - (if (pair? e-17070) - (match-17041 - (car e-17070) - (car p-17071) - w-17072 - (match-17041 - (cdr e-17070) - (cdr p-17071) - w-17072 - r-17073 - mod-17074) - mod-17074) + (eqv? atom-key-18791 'atom)) + r-18790 + (if (eqv? atom-key-18791 'vector) + (match-empty-17711 + (vector-ref p-18789 1) + r-18790))))))))))))) + (combine-17712 + (lambda (r*-18810 r-18811) + (if (null? (car r*-18810)) + r-18811 + (cons (map car r*-18810) + (combine-17712 (map cdr r*-18810) r-18811))))) + (match*-17713 + (lambda (e-17743 p-17744 w-17745 r-17746 mod-17747) + (if (null? p-17744) + (if (null? e-17743) r-17746 #f) + (if (pair? p-17744) + (if (pair? e-17743) + (match-17714 + (car e-17743) + (car p-17744) + w-17745 + (match-17714 + (cdr e-17743) + (cdr p-17744) + w-17745 + r-17746 + mod-17747) + mod-17747) #f) - (if (eq? p-17071 'each-any) - (let ((l-17079 - (match-each-any-17037 e-17070 w-17072 mod-17074))) - (if l-17079 (cons l-17079 r-17073) #f)) - (let ((atom-key-17084 (vector-ref p-17071 0))) - (if (eqv? atom-key-17084 'each) - (if (null? e-17070) - (match-empty-17038 - (vector-ref p-17071 1) - r-17073) - (let ((l-17091 - (match-each-17035 - e-17070 - (vector-ref p-17071 1) - w-17072 - mod-17074))) - (if l-17091 + (if (eq? p-17744 'each-any) + (let ((l-17752 + (match-each-any-17710 e-17743 w-17745 mod-17747))) + (if l-17752 (cons l-17752 r-17746) #f)) + (let ((atom-key-17757 (vector-ref p-17744 0))) + (if (eqv? atom-key-17757 'each) + (if (null? e-17743) + (match-empty-17711 + (vector-ref p-17744 1) + r-17746) + (let ((l-17764 + (match-each-17708 + e-17743 + (vector-ref p-17744 1) + w-17745 + mod-17747))) + (if l-17764 (letrec* - ((collect-17094 - (lambda (l-17145) - (if (null? (car l-17145)) - r-17073 - (cons (map car l-17145) - (collect-17094 - (map cdr l-17145))))))) - (collect-17094 l-17091)) + ((collect-17767 + (lambda (l-17824) + (if (null? (car l-17824)) + r-17746 + (cons (map car l-17824) + (collect-17767 + (map cdr l-17824))))))) + (collect-17767 l-17764)) #f))) - (if (eqv? atom-key-17084 'each+) + (if (eqv? atom-key-17757 'each+) (call-with-values (lambda () - (let ((x-pat-17154 (vector-ref p-17071 1)) - (y-pat-17155 (vector-ref p-17071 2)) - (z-pat-17156 (vector-ref p-17071 3))) + (let ((x-pat-17833 (vector-ref p-17744 1)) + (y-pat-17834 (vector-ref p-17744 2)) + (z-pat-17835 (vector-ref p-17744 3))) (letrec* - ((f-17160 - (lambda (e-17162 w-17163) - (if (pair? e-17162) + ((f-17839 + (lambda (e-17841 w-17842) + (if (pair? e-17841) (call-with-values (lambda () - (f-17160 (cdr e-17162) w-17163)) - (lambda (xr*-17164 - y-pat-17165 - r-17166) - (if r-17166 - (if (null? y-pat-17165) - (let ((xr-17167 - (match-17041 - (car e-17162) - x-pat-17154 - w-17163 + (f-17839 (cdr e-17841) w-17842)) + (lambda (xr*-17843 + y-pat-17844 + r-17845) + (if r-17845 + (if (null? y-pat-17844) + (let ((xr-17846 + (match-17714 + (car e-17841) + x-pat-17833 + w-17842 '() - mod-17074))) - (if xr-17167 + mod-17747))) + (if xr-17846 (values - (cons xr-17167 xr*-17164) - y-pat-17165 - r-17166) + (cons xr-17846 xr*-17843) + y-pat-17844 + r-17845) (values #f #f #f))) (values '() - (cdr y-pat-17165) - (match-17041 - (car e-17162) - (car y-pat-17165) - w-17163 - r-17166 - mod-17074))) + (cdr y-pat-17844) + (match-17714 + (car e-17841) + (car y-pat-17844) + w-17842 + r-17845 + mod-17747))) (values #f #f #f)))) - (if (if (vector? e-17162) - (if (= (vector-length e-17162) 4) - (eq? (vector-ref e-17162 0) + (if (if (vector? e-17841) + (if (= (vector-length e-17841) 4) + (eq? (vector-ref e-17841 0) 'syntax-object) #f) #f) - (f-17160 - (vector-ref e-17162 1) - (join-wraps-6565 w-17163 e-17162)) + (f-17839 + (vector-ref e-17841 1) + (let ((m1-17872 (car w-17842)) + (s1-17873 (cdr w-17842))) + (if (null? m1-17872) + (if (null? s1-17873) + e-17841 + (cons (car e-17841) + (let ((m2-17885 + (cdr e-17841))) + (if (null? m2-17885) + s1-17873 + (append + s1-17873 + m2-17885))))) + (cons (let ((m2-17895 + (car e-17841))) + (if (null? m2-17895) + m1-17872 + (append + m1-17872 + m2-17895))) + (let ((m2-17905 + (cdr e-17841))) + (if (null? m2-17905) + s1-17873 + (append + s1-17873 + m2-17905))))))) (values '() - y-pat-17155 - (match-17041 - e-17162 - z-pat-17156 - w-17163 - r-17073 - mod-17074))))))) - (f-17160 e-17070 w-17072)))) - (lambda (xr*-17193 y-pat-17194 r-17195) - (if r-17195 - (if (null? y-pat-17194) - (if (null? xr*-17193) - (match-empty-17038 - (vector-ref p-17071 1) - r-17195) - (combine-17039 xr*-17193 r-17195)) + y-pat-17834 + (match-17714 + e-17841 + z-pat-17835 + w-17842 + r-17746 + mod-17747))))))) + (f-17839 e-17743 w-17745)))) + (lambda (xr*-17915 y-pat-17916 r-17917) + (if r-17917 + (if (null? y-pat-17916) + (if (null? xr*-17915) + (match-empty-17711 + (vector-ref p-17744 1) + r-17917) + (combine-17712 xr*-17915 r-17917)) #f) #f))) - (if (eqv? atom-key-17084 'free-id) - (if (if (symbol? e-17070) + (if (eqv? atom-key-17757 'free-id) + (if (if (symbol? e-17743) #t - (if (if (vector? e-17070) - (if (= (vector-length e-17070) 4) - (eq? (vector-ref e-17070 0) + (if (if (vector? e-17743) + (if (= (vector-length e-17743) 4) + (eq? (vector-ref e-17743 0) 'syntax-object) #f) #f) - (symbol? (vector-ref e-17070 1)) + (symbol? (vector-ref e-17743 1)) #f)) - (if (let ((i-17526 - (wrap-6578 e-17070 w-17072 mod-17074)) - (j-17527 (vector-ref p-17071 1))) - (if (eq? (if (if (vector? i-17526) - (if (= (vector-length - i-17526) - 4) - (eq? (vector-ref i-17526 0) - 'syntax-object) - #f) - #f) - (vector-ref i-17526 1) - i-17526) - (if (if (vector? j-17527) - (if (= (vector-length - j-17527) - 4) - (eq? (vector-ref j-17527 0) - 'syntax-object) - #f) - #f) - (vector-ref j-17527 1) - j-17527)) - (eq? (id-var-name-6568 i-17526 '(())) - (id-var-name-6568 j-17527 '(()))) - #f)) - r-17073 + (if (free-id=?-4574 + (if (if (null? (car w-17745)) + (null? (cdr w-17745)) + #f) + e-17743 + (if (if (vector? e-17743) + (if (= (vector-length e-17743) 4) + (eq? (vector-ref e-17743 0) + 'syntax-object) + #f) + #f) + (let ((expression-18345 + (vector-ref e-17743 1)) + (wrap-18346 + (let ((w2-18356 + (vector-ref e-17743 2))) + (let ((m1-18357 (car w-17745)) + (s1-18358 + (cdr w-17745))) + (if (null? m1-18357) + (if (null? s1-18358) + w2-18356 + (cons (car w2-18356) + (let ((m2-18375 + (cdr w2-18356))) + (if (null? m2-18375) + s1-18358 + (append + s1-18358 + m2-18375))))) + (cons (let ((m2-18383 + (car w2-18356))) + (if (null? m2-18383) + m1-18357 + (append + m1-18357 + m2-18383))) + (let ((m2-18391 + (cdr w2-18356))) + (if (null? m2-18391) + s1-18358 + (append + s1-18358 + m2-18391)))))))) + (module-18347 + (vector-ref e-17743 3))) + (vector + 'syntax-object + expression-18345 + wrap-18346 + module-18347)) + (if (null? e-17743) + e-17743 + (vector + 'syntax-object + e-17743 + w-17745 + mod-17747)))) + (vector-ref p-17744 1)) + r-17746 #f) #f) - (if (eqv? atom-key-17084 'atom) + (if (eqv? atom-key-17757 'atom) (if (equal? - (vector-ref p-17071 1) - (strip-6598 e-17070 w-17072)) - r-17073 + (vector-ref p-17744 1) + (strip-4599 e-17743 w-17745)) + r-17746 #f) - (if (eqv? atom-key-17084 'vector) - (if (vector? e-17070) - (match-17041 - (vector->list e-17070) - (vector-ref p-17071 1) - w-17072 - r-17073 - mod-17074) + (if (eqv? atom-key-17757 'vector) + (if (vector? e-17743) + (match-17714 + (vector->list e-17743) + (vector-ref p-17744 1) + w-17745 + r-17746 + mod-17747) #f)))))))))))) - (match-17041 - (lambda (e-17587 p-17588 w-17589 r-17590 mod-17591) - (if (not r-17590) + (match-17714 + (lambda (e-18424 p-18425 w-18426 r-18427 mod-18428) + (if (not r-18427) #f - (if (eq? p-17588 '_) - r-17590 - (if (eq? p-17588 'any) - (cons (wrap-6578 e-17587 w-17589 mod-17591) - r-17590) - (if (if (vector? e-17587) - (if (= (vector-length e-17587) 4) - (eq? (vector-ref e-17587 0) 'syntax-object) + (if (eq? p-18425 '_) + r-18427 + (if (eq? p-18425 'any) + (cons (if (if (null? (car w-18426)) + (null? (cdr w-18426)) + #f) + e-18424 + (if (if (vector? e-18424) + (if (= (vector-length e-18424) 4) + (eq? (vector-ref e-18424 0) 'syntax-object) + #f) + #f) + (let ((expression-18458 (vector-ref e-18424 1)) + (wrap-18459 + (let ((w2-18469 (vector-ref e-18424 2))) + (let ((m1-18470 (car w-18426)) + (s1-18471 (cdr w-18426))) + (if (null? m1-18470) + (if (null? s1-18471) + w2-18469 + (cons (car w2-18469) + (let ((m2-18488 + (cdr w2-18469))) + (if (null? m2-18488) + s1-18471 + (append + s1-18471 + m2-18488))))) + (cons (let ((m2-18496 + (car w2-18469))) + (if (null? m2-18496) + m1-18470 + (append + m1-18470 + m2-18496))) + (let ((m2-18504 + (cdr w2-18469))) + (if (null? m2-18504) + s1-18471 + (append + s1-18471 + m2-18504)))))))) + (module-18460 (vector-ref e-18424 3))) + (vector + 'syntax-object + expression-18458 + wrap-18459 + module-18460)) + (if (null? e-18424) + e-18424 + (vector + 'syntax-object + e-18424 + w-18426 + mod-18428)))) + r-18427) + (if (if (vector? e-18424) + (if (= (vector-length e-18424) 4) + (eq? (vector-ref e-18424 0) 'syntax-object) #f) #f) - (match*-17040 - (vector-ref e-17587 1) - p-17588 - (join-wraps-6565 w-17589 (vector-ref e-17587 2)) - r-17590 - (vector-ref e-17587 3)) - (match*-17040 - e-17587 - p-17588 - w-17589 - r-17590 - mod-17591)))))))) + (match*-17713 + (vector-ref e-18424 1) + p-18425 + (let ((w2-18547 (vector-ref e-18424 2))) + (let ((m1-18548 (car w-18426)) + (s1-18549 (cdr w-18426))) + (if (null? m1-18548) + (if (null? s1-18549) + w2-18547 + (cons (car w2-18547) + (let ((m2-18560 (cdr w2-18547))) + (if (null? m2-18560) + s1-18549 + (append s1-18549 m2-18560))))) + (cons (let ((m2-18568 (car w2-18547))) + (if (null? m2-18568) + m1-18548 + (append m1-18548 m2-18568))) + (let ((m2-18576 (cdr w2-18547))) + (if (null? m2-18576) + s1-18549 + (append s1-18549 m2-18576))))))) + r-18427 + (vector-ref e-18424 3)) + (match*-17713 + e-18424 + p-18425 + w-18426 + r-18427 + mod-18428)))))))) (set! $sc-dispatch - (lambda (e-17042 p-17043) - (if (eq? p-17043 'any) - (list e-17042) - (if (eq? p-17043 '_) + (lambda (e-17715 p-17716) + (if (eq? p-17716 'any) + (list e-17715) + (if (eq? p-17716 '_) '() - (if (if (vector? e-17042) - (if (= (vector-length e-17042) 4) - (eq? (vector-ref e-17042 0) 'syntax-object) + (if (if (vector? e-17715) + (if (= (vector-length e-17715) 4) + (eq? (vector-ref e-17715 0) 'syntax-object) #f) #f) - (match*-17040 - (vector-ref e-17042 1) - p-17043 - (vector-ref e-17042 2) + (match*-17713 + (vector-ref e-17715 1) + p-17716 + (vector-ref e-17715 2) '() - (vector-ref e-17042 3)) - (match*-17040 e-17042 p-17043 '(()) '() #f)))))))))) + (vector-ref e-17715 3)) + (match*-17713 e-17715 p-17716 '(()) '() #f)))))))))) (define with-syntax (make-syntax-transformer 'with-syntax 'macro - (lambda (x-29889) - (let ((tmp-29891 - ($sc-dispatch x-29889 '(_ () any . each-any)))) - (if tmp-29891 + (lambda (x-37252) + (let ((tmp-37254 + ($sc-dispatch x-37252 '(_ () any . each-any)))) + (if tmp-37254 (@apply - (lambda (e1-29895 e2-29896) + (lambda (e1-37258 e2-37259) (cons '#(syntax-object let ((top) #(ribcage #(e1 e2) #((top) (top)) - #("l-*-29862" "l-*-29863")) + #("l-*-37225" "l-*-37226")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-29859"))) + #(ribcage #(x) #((top)) #("l-*-37222")) + #(ribcage + (with-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + with-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) - (cons '() (cons e1-29895 e2-29896)))) - tmp-29891) - (let ((tmp-29897 + (cons '() (cons e1-37258 e2-37259)))) + tmp-37254) + (let ((tmp-37260 ($sc-dispatch - x-29889 + x-37252 '(_ ((any any)) any . each-any)))) - (if tmp-29897 + (if tmp-37260 (@apply - (lambda (out-29901 in-29902 e1-29903 e2-29904) + (lambda (out-37264 in-37265 e1-37266 e2-37267) (list '#(syntax-object syntax-case ((top) #(ribcage #(out in e1 e2) #((top) (top) (top) (top)) - #("l-*-29868" - "l-*-29869" - "l-*-29870" - "l-*-29871")) + #("l-*-37231" + "l-*-37232" + "l-*-37233" + "l-*-37234")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-29859"))) + #(ribcage #(x) #((top)) #("l-*-37222")) + #(ribcage + (with-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + with-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) - in-29902 + in-37265 '() - (list out-29901 + (list out-37264 (cons '#(syntax-object let ((top) #(ribcage #(out in e1 e2) #((top) (top) (top) (top)) - #("l-*-29868" - "l-*-29869" - "l-*-29870" - "l-*-29871")) + #("l-*-37231" + "l-*-37232" + "l-*-37233" + "l-*-37234")) #(ribcage () () ()) + #(ribcage #(x) #((top)) #("l-*-37222")) #(ribcage - #(x) - #((top)) - #("l-*-29859"))) + (with-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + with-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) - (cons '() (cons e1-29903 e2-29904)))))) - tmp-29897) - (let ((tmp-29905 + (cons '() (cons e1-37266 e2-37267)))))) + tmp-37260) + (let ((tmp-37268 ($sc-dispatch - x-29889 + x-37252 '(_ #(each (any any)) any . each-any)))) - (if tmp-29905 + (if tmp-37268 (@apply - (lambda (out-29909 in-29910 e1-29911 e2-29912) + (lambda (out-37272 in-37273 e1-37274 e2-37275) (list '#(syntax-object syntax-case ((top) #(ribcage #(out in e1 e2) #((top) (top) (top) (top)) - #("l-*-29878" - "l-*-29879" - "l-*-29880" - "l-*-29881")) + #("l-*-37241" + "l-*-37242" + "l-*-37243" + "l-*-37244")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-29859"))) + #(ribcage #(x) #((top)) #("l-*-37222")) + #(ribcage + (with-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + with-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) (cons '#(syntax-object list @@ -22324,66 +17977,93 @@ #(ribcage #(out in e1 e2) #((top) (top) (top) (top)) - #("l-*-29878" - "l-*-29879" - "l-*-29880" - "l-*-29881")) + #("l-*-37241" + "l-*-37242" + "l-*-37243" + "l-*-37244")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-29859"))) + #(ribcage #(x) #((top)) #("l-*-37222")) + #(ribcage + (with-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + with-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) - in-29910) + in-37273) '() - (list out-29909 + (list out-37272 (cons '#(syntax-object let ((top) #(ribcage #(out in e1 e2) #((top) (top) (top) (top)) - #("l-*-29878" - "l-*-29879" - "l-*-29880" - "l-*-29881")) + #("l-*-37241" + "l-*-37242" + "l-*-37243" + "l-*-37244")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("l-*-29859"))) + #("l-*-37222")) + #(ribcage + (with-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + with-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) - (cons '() (cons e1-29911 e2-29912)))))) - tmp-29905) + (cons '() (cons e1-37274 e2-37275)))))) + tmp-37268) (syntax-violation #f "source expression failed to match any pattern" - x-29889)))))))))) + x-37252)))))))))) (define syntax-rules (make-syntax-transformer 'syntax-rules 'macro - (lambda (x-29966) - (let ((tmp-29968 + (lambda (x-37330) + (let ((tmp-37332 ($sc-dispatch - x-29966 + x-37330 '(_ each-any . #(each ((any . any) any)))))) - (if tmp-29968 + (if tmp-37332 (@apply - (lambda (k-29972 - keyword-29973 - pattern-29974 - template-29975) + (lambda (k-37336 + keyword-37337 + pattern-37338 + template-37339) (list '#(syntax-object lambda ((top) #(ribcage #(k keyword pattern template) #((top) (top) (top) (top)) - #("l-*-29929" - "l-*-29930" - "l-*-29931" - "l-*-29932")) + #("l-*-37293" + "l-*-37294" + "l-*-37295" + "l-*-37296")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-29926"))) + #(ribcage #(x) #((top)) #("l-*-37290")) + #(ribcage + (syntax-rules) + ((top)) + (((hygiene guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene guile)))))) (hygiene guile)) '(#(syntax-object x @@ -22391,12 +18071,21 @@ #(ribcage #(k keyword pattern template) #((top) (top) (top) (top)) - #("l-*-29929" - "l-*-29930" - "l-*-29931" - "l-*-29932")) + #("l-*-37293" + "l-*-37294" + "l-*-37295" + "l-*-37296")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-29926"))) + #(ribcage #(x) #((top)) #("l-*-37290")) + #(ribcage + (syntax-rules) + ((top)) + (((hygiene guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene guile)))))) (hygiene guile))) (vector '(#(syntax-object @@ -22405,12 +18094,21 @@ #(ribcage #(k keyword pattern template) #((top) (top) (top) (top)) - #("l-*-29929" - "l-*-29930" - "l-*-29931" - "l-*-29932")) + #("l-*-37293" + "l-*-37294" + "l-*-37295" + "l-*-37296")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-29926"))) + #(ribcage #(x) #((top)) #("l-*-37290")) + #(ribcage + (syntax-rules) + ((top)) + (((hygiene guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene guile)))))) (hygiene guile)) . #(syntax-object @@ -22419,12 +18117,21 @@ #(ribcage #(k keyword pattern template) #((top) (top) (top) (top)) - #("l-*-29929" - "l-*-29930" - "l-*-29931" - "l-*-29932")) + #("l-*-37293" + "l-*-37294" + "l-*-37295" + "l-*-37296")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-29926"))) + #(ribcage #(x) #((top)) #("l-*-37290")) + #(ribcage + (syntax-rules) + ((top)) + (((hygiene guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene guile)))))) (hygiene guile))) (cons '#(syntax-object patterns @@ -22432,26 +18139,44 @@ #(ribcage #(k keyword pattern template) #((top) (top) (top) (top)) - #("l-*-29929" - "l-*-29930" - "l-*-29931" - "l-*-29932")) + #("l-*-37293" + "l-*-37294" + "l-*-37295" + "l-*-37296")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-29926"))) + #(ribcage #(x) #((top)) #("l-*-37290")) + #(ribcage + (syntax-rules) + ((top)) + (((hygiene guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene guile)))))) (hygiene guile)) - pattern-29974)) + pattern-37338)) (cons '#(syntax-object syntax-case ((top) #(ribcage #(k keyword pattern template) #((top) (top) (top) (top)) - #("l-*-29929" - "l-*-29930" - "l-*-29931" - "l-*-29932")) + #("l-*-37293" + "l-*-37294" + "l-*-37295" + "l-*-37296")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-29926"))) + #(ribcage #(x) #((top)) #("l-*-37290")) + #(ribcage + (syntax-rules) + ((top)) + (((hygiene guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene guile)))))) (hygiene guile)) (cons '#(syntax-object x @@ -22459,18 +18184,27 @@ #(ribcage #(k keyword pattern template) #((top) (top) (top) (top)) - #("l-*-29929" - "l-*-29930" - "l-*-29931" - "l-*-29932")) + #("l-*-37293" + "l-*-37294" + "l-*-37295" + "l-*-37296")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-29926"))) + #(ribcage #(x) #((top)) #("l-*-37290")) + #(ribcage + (syntax-rules) + ((top)) + (((hygiene guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene guile)))))) (hygiene guile)) - (cons k-29972 - (map (lambda (tmp-29940-29976 - tmp-29939-29977) + (cons k-37336 + (map (lambda (tmp-37304-37340 + tmp-37303-37341) (list (cons '#(syntax-object - dummy + _ ((top) #(ribcage #(k @@ -22481,10 +18215,10 @@ (top) (top) (top)) - #("l-*-29929" - "l-*-29930" - "l-*-29931" - "l-*-29932")) + #("l-*-37293" + "l-*-37294" + "l-*-37295" + "l-*-37296")) #(ribcage () () @@ -22492,9 +18226,20 @@ #(ribcage #(x) #((top)) - #("l-*-29926"))) + #("l-*-37290")) + #(ribcage + (syntax-rules) + ((top)) + (((hygiene + guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene + guile)))))) (hygiene guile)) - tmp-29939-29977) + tmp-37303-37341) (list '#(syntax-object syntax ((top) @@ -22507,10 +18252,10 @@ (top) (top) (top)) - #("l-*-29929" - "l-*-29930" - "l-*-29931" - "l-*-29932")) + #("l-*-37293" + "l-*-37294" + "l-*-37295" + "l-*-37296")) #(ribcage () () @@ -22518,45 +18263,65 @@ #(ribcage #(x) #((top)) - #("l-*-29926"))) + #("l-*-37290")) + #(ribcage + (syntax-rules) + ((top)) + (((hygiene + guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene + guile)))))) (hygiene guile)) - tmp-29940-29976))) - template-29975 - pattern-29974)))))) - tmp-29968) - (let ((tmp-29978 + tmp-37304-37340))) + template-37339 + pattern-37338)))))) + tmp-37332) + (let ((tmp-37342 ($sc-dispatch - x-29966 + x-37330 '(_ each-any any . #(each ((any . any) any)))))) - (if (if tmp-29978 + (if (if tmp-37342 (@apply - (lambda (k-29982 - docstring-29983 - keyword-29984 - pattern-29985 - template-29986) - (string? (syntax->datum docstring-29983))) - tmp-29978) + (lambda (k-37346 + docstring-37347 + keyword-37348 + pattern-37349 + template-37350) + (string? (syntax->datum docstring-37347))) + tmp-37342) #f) (@apply - (lambda (k-29987 - docstring-29988 - keyword-29989 - pattern-29990 - template-29991) + (lambda (k-37351 + docstring-37352 + keyword-37353 + pattern-37354 + template-37355) (list '#(syntax-object lambda ((top) #(ribcage #(k docstring keyword pattern template) #((top) (top) (top) (top) (top)) - #("l-*-29952" - "l-*-29953" - "l-*-29954" - "l-*-29955" - "l-*-29956")) + #("l-*-37316" + "l-*-37317" + "l-*-37318" + "l-*-37319" + "l-*-37320")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-29926"))) + #(ribcage #(x) #((top)) #("l-*-37290")) + #(ribcage + (syntax-rules) + ((top)) + (((hygiene guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene guile)))))) (hygiene guile)) '(#(syntax-object x @@ -22564,15 +18329,24 @@ #(ribcage #(k docstring keyword pattern template) #((top) (top) (top) (top) (top)) - #("l-*-29952" - "l-*-29953" - "l-*-29954" - "l-*-29955" - "l-*-29956")) + #("l-*-37316" + "l-*-37317" + "l-*-37318" + "l-*-37319" + "l-*-37320")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-29926"))) + #(ribcage #(x) #((top)) #("l-*-37290")) + #(ribcage + (syntax-rules) + ((top)) + (((hygiene guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene guile)))))) (hygiene guile))) - docstring-29988 + docstring-37352 (vector '(#(syntax-object macro-type @@ -22580,13 +18354,22 @@ #(ribcage #(k docstring keyword pattern template) #((top) (top) (top) (top) (top)) - #("l-*-29952" - "l-*-29953" - "l-*-29954" - "l-*-29955" - "l-*-29956")) + #("l-*-37316" + "l-*-37317" + "l-*-37318" + "l-*-37319" + "l-*-37320")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-29926"))) + #(ribcage #(x) #((top)) #("l-*-37290")) + #(ribcage + (syntax-rules) + ((top)) + (((hygiene guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene guile)))))) (hygiene guile)) . #(syntax-object @@ -22595,13 +18378,22 @@ #(ribcage #(k docstring keyword pattern template) #((top) (top) (top) (top) (top)) - #("l-*-29952" - "l-*-29953" - "l-*-29954" - "l-*-29955" - "l-*-29956")) + #("l-*-37316" + "l-*-37317" + "l-*-37318" + "l-*-37319" + "l-*-37320")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-29926"))) + #(ribcage #(x) #((top)) #("l-*-37290")) + #(ribcage + (syntax-rules) + ((top)) + (((hygiene guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene guile)))))) (hygiene guile))) (cons '#(syntax-object patterns @@ -22609,28 +18401,46 @@ #(ribcage #(k docstring keyword pattern template) #((top) (top) (top) (top) (top)) - #("l-*-29952" - "l-*-29953" - "l-*-29954" - "l-*-29955" - "l-*-29956")) + #("l-*-37316" + "l-*-37317" + "l-*-37318" + "l-*-37319" + "l-*-37320")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-29926"))) + #(ribcage #(x) #((top)) #("l-*-37290")) + #(ribcage + (syntax-rules) + ((top)) + (((hygiene guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene guile)))))) (hygiene guile)) - pattern-29990)) + pattern-37354)) (cons '#(syntax-object syntax-case ((top) #(ribcage #(k docstring keyword pattern template) #((top) (top) (top) (top) (top)) - #("l-*-29952" - "l-*-29953" - "l-*-29954" - "l-*-29955" - "l-*-29956")) + #("l-*-37316" + "l-*-37317" + "l-*-37318" + "l-*-37319" + "l-*-37320")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-29926"))) + #(ribcage #(x) #((top)) #("l-*-37290")) + #(ribcage + (syntax-rules) + ((top)) + (((hygiene guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene guile)))))) (hygiene guile)) (cons '#(syntax-object x @@ -22642,22 +18452,28 @@ pattern template) #((top) (top) (top) (top) (top)) - #("l-*-29952" - "l-*-29953" - "l-*-29954" - "l-*-29955" - "l-*-29956")) + #("l-*-37316" + "l-*-37317" + "l-*-37318" + "l-*-37319" + "l-*-37320")) #(ribcage () () ()) + #(ribcage #(x) #((top)) #("l-*-37290")) #(ribcage - #(x) - #((top)) - #("l-*-29926"))) + (syntax-rules) + ((top)) + (((hygiene guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene guile)))))) (hygiene guile)) - (cons k-29987 - (map (lambda (tmp-29965-29992 - tmp-29964-29993) + (cons k-37351 + (map (lambda (tmp-37329-37356 + tmp-37328-37357) (list (cons '#(syntax-object - dummy + _ ((top) #(ribcage #(k @@ -22670,11 +18486,11 @@ (top) (top) (top)) - #("l-*-29952" - "l-*-29953" - "l-*-29954" - "l-*-29955" - "l-*-29956")) + #("l-*-37316" + "l-*-37317" + "l-*-37318" + "l-*-37319" + "l-*-37320")) #(ribcage () () @@ -22682,10 +18498,21 @@ #(ribcage #(x) #((top)) - #("l-*-29926"))) + #("l-*-37290")) + #(ribcage + (syntax-rules) + ((top)) + (((hygiene + guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene + guile)))))) (hygiene guile)) - tmp-29964-29993) + tmp-37328-37357) (list '#(syntax-object syntax ((top) @@ -22700,11 +18527,11 @@ (top) (top) (top)) - #("l-*-29952" - "l-*-29953" - "l-*-29954" - "l-*-29955" - "l-*-29956")) + #("l-*-37316" + "l-*-37317" + "l-*-37318" + "l-*-37319" + "l-*-37320")) #(ribcage () () @@ -22712,48 +18539,77 @@ #(ribcage #(x) #((top)) - #("l-*-29926"))) + #("l-*-37290")) + #(ribcage + (syntax-rules) + ((top)) + (((hygiene + guile) + . + #(syntax-object + syntax-rules + ((top)) + (hygiene + guile)))))) (hygiene guile)) - tmp-29965-29992))) - template-29991 - pattern-29990)))))) - tmp-29978) + tmp-37329-37356))) + template-37355 + pattern-37354)))))) + tmp-37342) (syntax-violation #f "source expression failed to match any pattern" - x-29966)))))))) + x-37330)))))))) (define define-syntax-rule (make-syntax-transformer 'define-syntax-rule 'macro - (lambda (x-30030) - (let ((tmp-30032 - ($sc-dispatch x-30030 '(_ (any . any) any)))) - (if tmp-30032 + (lambda (x-37395) + (let ((tmp-37397 + ($sc-dispatch x-37395 '(_ (any . any) any)))) + (if tmp-37397 (@apply - (lambda (name-30036 pattern-30037 template-30038) + (lambda (name-37401 pattern-37402 template-37403) (list '#(syntax-object define-syntax ((top) #(ribcage #(name pattern template) #((top) (top) (top)) - #("l-*-30007" "l-*-30008" "l-*-30009")) + #("l-*-37372" "l-*-37373" "l-*-37374")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-30004"))) + #(ribcage #(x) #((top)) #("l-*-37369")) + #(ribcage + (define-syntax-rule) + ((top)) + (((hygiene guile) + . + #(syntax-object + define-syntax-rule + ((top)) + (hygiene guile)))))) (hygiene guile)) - name-30036 + name-37401 (list '#(syntax-object syntax-rules ((top) #(ribcage #(name pattern template) #((top) (top) (top)) - #("l-*-30007" "l-*-30008" "l-*-30009")) + #("l-*-37372" "l-*-37373" "l-*-37374")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-30004"))) + #(ribcage #(x) #((top)) #("l-*-37369")) + #(ribcage + (define-syntax-rule) + ((top)) + (((hygiene guile) + . + #(syntax-object + define-syntax-rule + ((top)) + (hygiene guile)))))) (hygiene guile)) '() (list (cons '#(syntax-object @@ -22762,63 +18618,90 @@ #(ribcage #(name pattern template) #((top) (top) (top)) - #("l-*-30007" - "l-*-30008" - "l-*-30009")) + #("l-*-37372" + "l-*-37373" + "l-*-37374")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("l-*-30004"))) + #("l-*-37369")) + #(ribcage + (define-syntax-rule) + ((top)) + (((hygiene guile) + . + #(syntax-object + define-syntax-rule + ((top)) + (hygiene guile)))))) (hygiene guile)) - pattern-30037) - template-30038)))) - tmp-30032) - (let ((tmp-30039 - ($sc-dispatch x-30030 '(_ (any . any) any any)))) - (if (if tmp-30039 + pattern-37402) + template-37403)))) + tmp-37397) + (let ((tmp-37404 + ($sc-dispatch x-37395 '(_ (any . any) any any)))) + (if (if tmp-37404 (@apply - (lambda (name-30043 - pattern-30044 - docstring-30045 - template-30046) - (string? (syntax->datum docstring-30045))) - tmp-30039) + (lambda (name-37408 + pattern-37409 + docstring-37410 + template-37411) + (string? (syntax->datum docstring-37410))) + tmp-37404) #f) (@apply - (lambda (name-30047 - pattern-30048 - docstring-30049 - template-30050) + (lambda (name-37412 + pattern-37413 + docstring-37414 + template-37415) (list '#(syntax-object define-syntax ((top) #(ribcage #(name pattern docstring template) #((top) (top) (top) (top)) - #("l-*-30022" - "l-*-30023" - "l-*-30024" - "l-*-30025")) + #("l-*-37387" + "l-*-37388" + "l-*-37389" + "l-*-37390")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-30004"))) + #(ribcage #(x) #((top)) #("l-*-37369")) + #(ribcage + (define-syntax-rule) + ((top)) + (((hygiene guile) + . + #(syntax-object + define-syntax-rule + ((top)) + (hygiene guile)))))) (hygiene guile)) - name-30047 + name-37412 (list '#(syntax-object syntax-rules ((top) #(ribcage #(name pattern docstring template) #((top) (top) (top) (top)) - #("l-*-30022" - "l-*-30023" - "l-*-30024" - "l-*-30025")) + #("l-*-37387" + "l-*-37388" + "l-*-37389" + "l-*-37390")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-30004"))) + #(ribcage #(x) #((top)) #("l-*-37369")) + #(ribcage + (define-syntax-rule) + ((top)) + (((hygiene guile) + . + #(syntax-object + define-syntax-rule + ((top)) + (hygiene guile)))))) (hygiene guile)) '() - docstring-30049 + docstring-37414 (list (cons '#(syntax-object _ ((top) @@ -22828,45 +18711,54 @@ docstring template) #((top) (top) (top) (top)) - #("l-*-30022" - "l-*-30023" - "l-*-30024" - "l-*-30025")) + #("l-*-37387" + "l-*-37388" + "l-*-37389" + "l-*-37390")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("l-*-30004"))) + #("l-*-37369")) + #(ribcage + (define-syntax-rule) + ((top)) + (((hygiene guile) + . + #(syntax-object + define-syntax-rule + ((top)) + (hygiene guile)))))) (hygiene guile)) - pattern-30048) - template-30050)))) - tmp-30039) + pattern-37413) + template-37415)))) + tmp-37404) (syntax-violation #f "source expression failed to match any pattern" - x-30030)))))))) + x-37395)))))))) (define let* (make-syntax-transformer 'let* 'macro - (lambda (x-30099) - (let ((tmp-30101 + (lambda (x-37465) + (let ((tmp-37467 ($sc-dispatch - x-30099 + x-37465 '(any #(each (any any)) any . each-any)))) - (if (if tmp-30101 + (if (if tmp-37467 (@apply - (lambda (let*-30105 x-30106 v-30107 e1-30108 e2-30109) - (and-map identifier? x-30106)) - tmp-30101) + (lambda (let*-37471 x-37472 v-37473 e1-37474 e2-37475) + (and-map identifier? x-37472)) + tmp-37467) #f) (@apply - (lambda (let*-30110 x-30111 v-30112 e1-30113 e2-30114) + (lambda (let*-37476 x-37477 v-37478 e1-37479 e2-37480) (letrec* - ((f-30115 - (lambda (bindings-30118) - (if (null? bindings-30118) + ((f-37481 + (lambda (bindings-37484) + (if (null? bindings-37484) (cons '#(syntax-object let ((top) @@ -22874,26 +18766,35 @@ #(ribcage #(f bindings) #((top) (top)) - #("l-*-30085" "l-*-30086")) + #("l-*-37451" "l-*-37452")) #(ribcage #(let* x v e1 e2) #((top) (top) (top) (top) (top)) - #("l-*-30075" - "l-*-30076" - "l-*-30077" - "l-*-30078" - "l-*-30079")) + #("l-*-37441" + "l-*-37442" + "l-*-37443" + "l-*-37444" + "l-*-37445")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-30061"))) + #(ribcage #(x) #((top)) #("l-*-37427")) + #(ribcage + (let*) + ((top)) + (((hygiene guile) + . + #(syntax-object + let* + ((top)) + (hygiene guile)))))) (hygiene guile)) - (cons '() (cons e1-30113 e2-30114))) - (let ((tmp-30119 - (list (f-30115 (cdr bindings-30118)) - (car bindings-30118)))) - (let ((tmp-30120 ($sc-dispatch tmp-30119 '(any any)))) - (if tmp-30120 + (cons '() (cons e1-37479 e2-37480))) + (let ((tmp-37485 + (list (f-37481 (cdr bindings-37484)) + (car bindings-37484)))) + (let ((tmp-37486 ($sc-dispatch tmp-37485 '(any any)))) + (if tmp-37486 (@apply - (lambda (body-30122 binding-30123) + (lambda (body-37488 binding-37489) (list '#(syntax-object let ((top) @@ -22901,84 +18802,93 @@ #(ribcage #(body binding) #((top) (top)) - #("l-*-30095" "l-*-30096")) + #("l-*-37461" "l-*-37462")) #(ribcage () () ()) #(ribcage #(f bindings) #((top) (top)) - #("l-*-30085" "l-*-30086")) + #("l-*-37451" "l-*-37452")) #(ribcage #(let* x v e1 e2) #((top) (top) (top) (top) (top)) - #("l-*-30075" - "l-*-30076" - "l-*-30077" - "l-*-30078" - "l-*-30079")) + #("l-*-37441" + "l-*-37442" + "l-*-37443" + "l-*-37444" + "l-*-37445")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("l-*-30061"))) + #("l-*-37427")) + #(ribcage + (let*) + ((top)) + (((hygiene guile) + . + #(syntax-object + let* + ((top)) + (hygiene guile)))))) (hygiene guile)) - (list binding-30123) - body-30122)) - tmp-30120) + (list binding-37489) + body-37488)) + tmp-37486) (syntax-violation #f "source expression failed to match any pattern" - tmp-30119)))))))) - (f-30115 (map list x-30111 v-30112)))) - tmp-30101) + tmp-37485)))))))) + (f-37481 (map list x-37477 v-37478)))) + tmp-37467) (syntax-violation #f "source expression failed to match any pattern" - x-30099)))))) + x-37465)))))) (define do (make-syntax-transformer 'do 'macro - (lambda (orig-x-30181) - (let ((tmp-30183 + (lambda (orig-x-37548) + (let ((tmp-37550 ($sc-dispatch - orig-x-30181 + orig-x-37548 '(_ #(each (any any . any)) (any . each-any) . each-any)))) - (if tmp-30183 + (if tmp-37550 (@apply - (lambda (var-30187 - init-30188 - step-30189 - e0-30190 - e1-30191 - c-30192) - (let ((tmp-30193 - (map (lambda (v-30196 s-30197) - (let ((tmp-30199 ($sc-dispatch s-30197 '()))) - (if tmp-30199 - (@apply (lambda () v-30196) tmp-30199) - (let ((tmp-30202 - ($sc-dispatch s-30197 '(any)))) - (if tmp-30202 + (lambda (var-37554 + init-37555 + step-37556 + e0-37557 + e1-37558 + c-37559) + (let ((tmp-37560 + (map (lambda (v-37563 s-37564) + (let ((tmp-37566 ($sc-dispatch s-37564 '()))) + (if tmp-37566 + (@apply (lambda () v-37563) tmp-37566) + (let ((tmp-37569 + ($sc-dispatch s-37564 '(any)))) + (if tmp-37569 (@apply - (lambda (e-30205) e-30205) - tmp-30202) + (lambda (e-37572) e-37572) + tmp-37569) (syntax-violation 'do "bad step expression" - orig-x-30181 - s-30197)))))) - var-30187 - step-30189))) - (let ((tmp-30194 ($sc-dispatch tmp-30193 'each-any))) - (if tmp-30194 + orig-x-37548 + s-37564)))))) + var-37554 + step-37556))) + (let ((tmp-37561 ($sc-dispatch tmp-37560 'each-any))) + (if tmp-37561 (@apply - (lambda (step-30211) - (let ((tmp-30213 ($sc-dispatch e1-30191 '()))) - (if tmp-30213 + (lambda (step-37578) + (let ((tmp-37580 ($sc-dispatch e1-37558 '()))) + (if tmp-37580 (@apply (lambda () (list '#(syntax-object @@ -22988,7 +18898,7 @@ #(ribcage #(step) #((top)) - #("l-*-30149")) + #("l-*-37516")) #(ribcage #(var init step e0 e1 c) #((top) @@ -22997,17 +18907,26 @@ (top) (top) (top)) - #("l-*-30134" - "l-*-30135" - "l-*-30136" - "l-*-30137" - "l-*-30138" - "l-*-30139")) + #("l-*-37501" + "l-*-37502" + "l-*-37503" + "l-*-37504" + "l-*-37505" + "l-*-37506")) #(ribcage () () ()) #(ribcage #(orig-x) #((top)) - #("l-*-30131"))) + #("l-*-37498")) + #(ribcage + (do) + ((top)) + (((hygiene guile) + . + #(syntax-object + do + ((top)) + (hygiene guile)))))) (hygiene guile)) '#(syntax-object doloop @@ -23016,7 +18935,7 @@ #(ribcage #(step) #((top)) - #("l-*-30149")) + #("l-*-37516")) #(ribcage #(var init step e0 e1 c) #((top) @@ -23025,19 +18944,28 @@ (top) (top) (top)) - #("l-*-30134" - "l-*-30135" - "l-*-30136" - "l-*-30137" - "l-*-30138" - "l-*-30139")) + #("l-*-37501" + "l-*-37502" + "l-*-37503" + "l-*-37504" + "l-*-37505" + "l-*-37506")) #(ribcage () () ()) #(ribcage #(orig-x) #((top)) - #("l-*-30131"))) + #("l-*-37498")) + #(ribcage + (do) + ((top)) + (((hygiene guile) + . + #(syntax-object + do + ((top)) + (hygiene guile)))))) (hygiene guile)) - (map list var-30187 init-30188) + (map list var-37554 init-37555) (list '#(syntax-object if ((top) @@ -23045,7 +18973,7 @@ #(ribcage #(step) #((top)) - #("l-*-30149")) + #("l-*-37516")) #(ribcage #(var init step e0 e1 c) #((top) @@ -23054,17 +18982,26 @@ (top) (top) (top)) - #("l-*-30134" - "l-*-30135" - "l-*-30136" - "l-*-30137" - "l-*-30138" - "l-*-30139")) + #("l-*-37501" + "l-*-37502" + "l-*-37503" + "l-*-37504" + "l-*-37505" + "l-*-37506")) #(ribcage () () ()) #(ribcage #(orig-x) #((top)) - #("l-*-30131"))) + #("l-*-37498")) + #(ribcage + (do) + ((top)) + (((hygiene guile) + . + #(syntax-object + do + ((top)) + (hygiene guile)))))) (hygiene guile)) (list '#(syntax-object not @@ -23073,7 +19010,7 @@ #(ribcage #(step) #((top)) - #("l-*-30149")) + #("l-*-37516")) #(ribcage #(var init @@ -23087,19 +19024,29 @@ (top) (top) (top)) - #("l-*-30134" - "l-*-30135" - "l-*-30136" - "l-*-30137" - "l-*-30138" - "l-*-30139")) + #("l-*-37501" + "l-*-37502" + "l-*-37503" + "l-*-37504" + "l-*-37505" + "l-*-37506")) #(ribcage () () ()) #(ribcage #(orig-x) #((top)) - #("l-*-30131"))) + #("l-*-37498")) + #(ribcage + (do) + ((top)) + (((hygiene guile) + . + #(syntax-object + do + ((top)) + (hygiene + guile)))))) (hygiene guile)) - e0-30190) + e0-37557) (cons '#(syntax-object begin ((top) @@ -23107,7 +19054,7 @@ #(ribcage #(step) #((top)) - #("l-*-30149")) + #("l-*-37516")) #(ribcage #(var init @@ -23121,20 +19068,30 @@ (top) (top) (top)) - #("l-*-30134" - "l-*-30135" - "l-*-30136" - "l-*-30137" - "l-*-30138" - "l-*-30139")) + #("l-*-37501" + "l-*-37502" + "l-*-37503" + "l-*-37504" + "l-*-37505" + "l-*-37506")) #(ribcage () () ()) #(ribcage #(orig-x) #((top)) - #("l-*-30131"))) + #("l-*-37498")) + #(ribcage + (do) + ((top)) + (((hygiene guile) + . + #(syntax-object + do + ((top)) + (hygiene + guile)))))) (hygiene guile)) (append - c-30192 + c-37559 (list (cons '#(syntax-object doloop ((top) @@ -23145,7 +19102,7 @@ #(ribcage #(step) #((top)) - #("l-*-30149")) + #("l-*-37516")) #(ribcage #(var init @@ -23159,12 +19116,12 @@ (top) (top) (top)) - #("l-*-30134" - "l-*-30135" - "l-*-30136" - "l-*-30137" - "l-*-30138" - "l-*-30139")) + #("l-*-37501" + "l-*-37502" + "l-*-37503" + "l-*-37504" + "l-*-37505" + "l-*-37506")) #(ribcage () () @@ -23172,28 +19129,39 @@ #(ribcage #(orig-x) #((top)) - #("l-*-30131"))) + #("l-*-37498")) + #(ribcage + (do) + ((top)) + (((hygiene + guile) + . + #(syntax-object + do + ((top)) + (hygiene + guile)))))) (hygiene guile)) - step-30211))))))) - tmp-30213) - (let ((tmp-30217 - ($sc-dispatch e1-30191 '(any . each-any)))) - (if tmp-30217 + step-37578))))))) + tmp-37580) + (let ((tmp-37584 + ($sc-dispatch e1-37558 '(any . each-any)))) + (if tmp-37584 (@apply - (lambda (e1-30221 e2-30222) + (lambda (e1-37588 e2-37589) (list '#(syntax-object let ((top) #(ribcage #(e1 e2) #((top) (top)) - #("l-*-30158" "l-*-30159")) + #("l-*-37525" "l-*-37526")) #(ribcage () () ()) #(ribcage #(step) #((top)) - #("l-*-30149")) + #("l-*-37516")) #(ribcage #(var init step e0 e1 c) #((top) @@ -23202,17 +19170,26 @@ (top) (top) (top)) - #("l-*-30134" - "l-*-30135" - "l-*-30136" - "l-*-30137" - "l-*-30138" - "l-*-30139")) + #("l-*-37501" + "l-*-37502" + "l-*-37503" + "l-*-37504" + "l-*-37505" + "l-*-37506")) #(ribcage () () ()) #(ribcage #(orig-x) #((top)) - #("l-*-30131"))) + #("l-*-37498")) + #(ribcage + (do) + ((top)) + (((hygiene guile) + . + #(syntax-object + do + ((top)) + (hygiene guile)))))) (hygiene guile)) '#(syntax-object doloop @@ -23220,12 +19197,12 @@ #(ribcage #(e1 e2) #((top) (top)) - #("l-*-30158" "l-*-30159")) + #("l-*-37525" "l-*-37526")) #(ribcage () () ()) #(ribcage #(step) #((top)) - #("l-*-30149")) + #("l-*-37516")) #(ribcage #(var init step e0 e1 c) #((top) @@ -23234,32 +19211,41 @@ (top) (top) (top)) - #("l-*-30134" - "l-*-30135" - "l-*-30136" - "l-*-30137" - "l-*-30138" - "l-*-30139")) + #("l-*-37501" + "l-*-37502" + "l-*-37503" + "l-*-37504" + "l-*-37505" + "l-*-37506")) #(ribcage () () ()) #(ribcage #(orig-x) #((top)) - #("l-*-30131"))) + #("l-*-37498")) + #(ribcage + (do) + ((top)) + (((hygiene guile) + . + #(syntax-object + do + ((top)) + (hygiene guile)))))) (hygiene guile)) - (map list var-30187 init-30188) + (map list var-37554 init-37555) (list '#(syntax-object if ((top) #(ribcage #(e1 e2) #((top) (top)) - #("l-*-30158" - "l-*-30159")) + #("l-*-37525" + "l-*-37526")) #(ribcage () () ()) #(ribcage #(step) #((top)) - #("l-*-30149")) + #("l-*-37516")) #(ribcage #(var init step e0 e1 c) #((top) @@ -23268,32 +19254,41 @@ (top) (top) (top)) - #("l-*-30134" - "l-*-30135" - "l-*-30136" - "l-*-30137" - "l-*-30138" - "l-*-30139")) + #("l-*-37501" + "l-*-37502" + "l-*-37503" + "l-*-37504" + "l-*-37505" + "l-*-37506")) #(ribcage () () ()) #(ribcage #(orig-x) #((top)) - #("l-*-30131"))) + #("l-*-37498")) + #(ribcage + (do) + ((top)) + (((hygiene guile) + . + #(syntax-object + do + ((top)) + (hygiene guile)))))) (hygiene guile)) - e0-30190 + e0-37557 (cons '#(syntax-object begin ((top) #(ribcage #(e1 e2) #((top) (top)) - #("l-*-30158" - "l-*-30159")) + #("l-*-37525" + "l-*-37526")) #(ribcage () () ()) #(ribcage #(step) #((top)) - #("l-*-30149")) + #("l-*-37516")) #(ribcage #(var init @@ -23307,32 +19302,42 @@ (top) (top) (top)) - #("l-*-30134" - "l-*-30135" - "l-*-30136" - "l-*-30137" - "l-*-30138" - "l-*-30139")) + #("l-*-37501" + "l-*-37502" + "l-*-37503" + "l-*-37504" + "l-*-37505" + "l-*-37506")) #(ribcage () () ()) #(ribcage #(orig-x) #((top)) - #("l-*-30131"))) + #("l-*-37498")) + #(ribcage + (do) + ((top)) + (((hygiene guile) + . + #(syntax-object + do + ((top)) + (hygiene + guile)))))) (hygiene guile)) - (cons e1-30221 e2-30222)) + (cons e1-37588 e2-37589)) (cons '#(syntax-object begin ((top) #(ribcage #(e1 e2) #((top) (top)) - #("l-*-30158" - "l-*-30159")) + #("l-*-37525" + "l-*-37526")) #(ribcage () () ()) #(ribcage #(step) #((top)) - #("l-*-30149")) + #("l-*-37516")) #(ribcage #(var init @@ -23346,20 +19351,30 @@ (top) (top) (top)) - #("l-*-30134" - "l-*-30135" - "l-*-30136" - "l-*-30137" - "l-*-30138" - "l-*-30139")) + #("l-*-37501" + "l-*-37502" + "l-*-37503" + "l-*-37504" + "l-*-37505" + "l-*-37506")) #(ribcage () () ()) #(ribcage #(orig-x) #((top)) - #("l-*-30131"))) + #("l-*-37498")) + #(ribcage + (do) + ((top)) + (((hygiene guile) + . + #(syntax-object + do + ((top)) + (hygiene + guile)))))) (hygiene guile)) (append - c-30192 + c-37559 (list (cons '#(syntax-object doloop ((top) @@ -23368,8 +19383,8 @@ e2) #((top) (top)) - #("l-*-30158" - "l-*-30159")) + #("l-*-37525" + "l-*-37526")) #(ribcage () () @@ -23377,7 +19392,7 @@ #(ribcage #(step) #((top)) - #("l-*-30149")) + #("l-*-37516")) #(ribcage #(var init @@ -23391,12 +19406,12 @@ (top) (top) (top)) - #("l-*-30134" - "l-*-30135" - "l-*-30136" - "l-*-30137" - "l-*-30138" - "l-*-30139")) + #("l-*-37501" + "l-*-37502" + "l-*-37503" + "l-*-37504" + "l-*-37505" + "l-*-37506")) #(ribcage () () @@ -23404,36 +19419,47 @@ #(ribcage #(orig-x) #((top)) - #("l-*-30131"))) + #("l-*-37498")) + #(ribcage + (do) + ((top)) + (((hygiene + guile) + . + #(syntax-object + do + ((top)) + (hygiene + guile)))))) (hygiene guile)) - step-30211))))))) - tmp-30217) + step-37578))))))) + tmp-37584) (syntax-violation #f "source expression failed to match any pattern" - e1-30191)))))) - tmp-30194) + e1-37558)))))) + tmp-37561) (syntax-violation #f "source expression failed to match any pattern" - tmp-30193))))) - tmp-30183) + tmp-37560))))) + tmp-37550) (syntax-violation #f "source expression failed to match any pattern" - orig-x-30181)))))) + orig-x-37548)))))) (define quasiquote (make-syntax-transformer 'quasiquote 'macro (letrec* - ((quasi-30508 - (lambda (p-30532 lev-30533) - (let ((tmp-30535 + ((quasi-37876 + (lambda (p-37900 lev-37901) + (let ((tmp-37903 ($sc-dispatch - p-30532 + p-37900 '(#(free-id #(syntax-object unquote @@ -23442,7 +19468,7 @@ #(ribcage #(p lev) #((top) (top)) - #("l-*-30254" "l-*-30255")) + #("l-*-37622" "l-*-37623")) #(ribcage (emit quasivector quasilist* @@ -23451,28 +19477,37 @@ vquasi quasi) ((top) (top) (top) (top) (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile))) any)))) - (if tmp-30535 + (if tmp-37903 (@apply - (lambda (p-30539) - (if (= lev-30533 0) + (lambda (p-37907) + (if (= lev-37901 0) (list '#(syntax-object "value" ((top) - #(ribcage #(p) #((top)) #("l-*-30258")) + #(ribcage #(p) #((top)) #("l-*-37626")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("l-*-30254" "l-*-30255")) + #("l-*-37622" "l-*-37623")) #(ribcage (emit quasivector quasilist* @@ -23481,25 +19516,34 @@ vquasi quasi) ((top) (top) (top) (top) (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) - p-30539) - (quasicons-30510 + p-37907) + (quasicons-37878 '(#(syntax-object "quote" ((top) - #(ribcage #(p) #((top)) #("l-*-30258")) + #(ribcage #(p) #((top)) #("l-*-37626")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("l-*-30254" "l-*-30255")) + #("l-*-37622" "l-*-37623")) #(ribcage (emit quasivector quasilist* @@ -23508,23 +19552,32 @@ vquasi quasi) ((top) (top) (top) (top) (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) #(syntax-object unquote ((top) - #(ribcage #(p) #((top)) #("l-*-30258")) + #(ribcage #(p) #((top)) #("l-*-37626")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("l-*-30254" "l-*-30255")) + #("l-*-37622" "l-*-37623")) #(ribcage (emit quasivector quasilist* @@ -23533,19 +19586,28 @@ vquasi quasi) ((top) (top) (top) (top) (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile))) - (quasi-30508 (list p-30539) (#{1-}# lev-30533))))) - tmp-30535) - (let ((tmp-30542 + (quasi-37876 (list p-37907) (#{1-}# lev-37901))))) + tmp-37903) + (let ((tmp-37910 ($sc-dispatch - p-30532 + p-37900 '(#(free-id #(syntax-object quasiquote @@ -23554,7 +19616,7 @@ #(ribcage #(p lev) #((top) (top)) - #("l-*-30254" "l-*-30255")) + #("l-*-37622" "l-*-37623")) #(ribcage (emit quasivector quasilist* @@ -23563,28 +19625,37 @@ vquasi quasi) ((top) (top) (top) (top) (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile))) any)))) - (if tmp-30542 + (if tmp-37910 (@apply - (lambda (p-30546) - (quasicons-30510 + (lambda (p-37914) + (quasicons-37878 '(#(syntax-object "quote" ((top) - #(ribcage #(p) #((top)) #("l-*-30261")) + #(ribcage #(p) #((top)) #("l-*-37629")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("l-*-30254" "l-*-30255")) + #("l-*-37622" "l-*-37623")) #(ribcage (emit quasivector quasilist* @@ -23593,23 +19664,32 @@ vquasi quasi) ((top) (top) (top) (top) (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) #(syntax-object quasiquote ((top) - #(ribcage #(p) #((top)) #("l-*-30261")) + #(ribcage #(p) #((top)) #("l-*-37629")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("l-*-30254" "l-*-30255")) + #("l-*-37622" "l-*-37623")) #(ribcage (emit quasivector quasilist* @@ -23618,23 +19698,32 @@ vquasi quasi) ((top) (top) (top) (top) (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile))) - (quasi-30508 (list p-30546) (#{1+}# lev-30533)))) - tmp-30542) - (let ((tmp-30549 ($sc-dispatch p-30532 '(any . any)))) - (if tmp-30549 + (quasi-37876 (list p-37914) (#{1+}# lev-37901)))) + tmp-37910) + (let ((tmp-37917 ($sc-dispatch p-37900 '(any . any)))) + (if tmp-37917 (@apply - (lambda (p-30553 q-30554) - (let ((tmp-30556 + (lambda (p-37921 q-37922) + (let ((tmp-37924 ($sc-dispatch - p-30553 + p-37921 '(#(free-id #(syntax-object unquote @@ -23642,12 +19731,12 @@ #(ribcage #(p q) #((top) (top)) - #("l-*-30264" "l-*-30265")) + #("l-*-37632" "l-*-37633")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("l-*-30254" "l-*-30255")) + #("l-*-37622" "l-*-37623")) #(ribcage (emit quasivector quasilist* @@ -23662,40 +19751,49 @@ (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile))) . each-any)))) - (if tmp-30556 + (if tmp-37924 (@apply - (lambda (p-30560) - (if (= lev-30533 0) - (quasilist*-30512 - (map (lambda (tmp-30272-30596) + (lambda (p-37928) + (if (= lev-37901 0) + (quasilist*-37880 + (map (lambda (tmp-37640-37967) (list '#(syntax-object "value" ((top) #(ribcage #(p) #((top)) - #("l-*-30270")) + #("l-*-37638")) #(ribcage #(p q) #((top) (top)) - #("l-*-30264" - "l-*-30265")) + #("l-*-37632" + "l-*-37633")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("l-*-30254" - "l-*-30255")) + #("l-*-37622" + "l-*-37623")) #(ribcage (emit quasivector quasilist* @@ -23710,35 +19808,45 @@ (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene + guile)))))) (hygiene guile)) - tmp-30272-30596)) - p-30560) - (quasi-30508 q-30554 lev-30533)) - (quasicons-30510 - (quasicons-30510 + tmp-37640-37967)) + p-37928) + (quasi-37876 q-37922 lev-37901)) + (quasicons-37878 + (quasicons-37878 '(#(syntax-object "quote" ((top) #(ribcage #(p) #((top)) - #("l-*-30270")) + #("l-*-37638")) #(ribcage #(p q) #((top) (top)) - #("l-*-30264" "l-*-30265")) + #("l-*-37632" "l-*-37633")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("l-*-30254" "l-*-30255")) + #("l-*-37622" "l-*-37623")) #(ribcage (emit quasivector quasilist* @@ -23753,13 +19861,22 @@ (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) #(syntax-object unquote @@ -23767,16 +19884,16 @@ #(ribcage #(p) #((top)) - #("l-*-30270")) + #("l-*-37638")) #(ribcage #(p q) #((top) (top)) - #("l-*-30264" "l-*-30265")) + #("l-*-37632" "l-*-37633")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("l-*-30254" "l-*-30255")) + #("l-*-37622" "l-*-37623")) #(ribcage (emit quasivector quasilist* @@ -23791,22 +19908,31 @@ (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile))) - (quasi-30508 - p-30560 - (#{1-}# lev-30533))) - (quasi-30508 q-30554 lev-30533)))) - tmp-30556) - (let ((tmp-30601 + (quasi-37876 + p-37928 + (#{1-}# lev-37901))) + (quasi-37876 q-37922 lev-37901)))) + tmp-37924) + (let ((tmp-37972 ($sc-dispatch - p-30553 + p-37921 '(#(free-id #(syntax-object unquote-splicing @@ -23814,12 +19940,12 @@ #(ribcage #(p q) #((top) (top)) - #("l-*-30264" "l-*-30265")) + #("l-*-37632" "l-*-37633")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("l-*-30254" "l-*-30255")) + #("l-*-37622" "l-*-37623")) #(ribcage (emit quasivector quasilist* @@ -23834,40 +19960,49 @@ (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile))) . each-any)))) - (if tmp-30601 + (if tmp-37972 (@apply - (lambda (p-30605) - (if (= lev-30533 0) - (quasiappend-30511 - (map (lambda (tmp-30277-30608) + (lambda (p-37976) + (if (= lev-37901 0) + (quasiappend-37879 + (map (lambda (tmp-37645-37979) (list '#(syntax-object "value" ((top) #(ribcage #(p) #((top)) - #("l-*-30275")) + #("l-*-37643")) #(ribcage #(p q) #((top) (top)) - #("l-*-30264" - "l-*-30265")) + #("l-*-37632" + "l-*-37633")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("l-*-30254" - "l-*-30255")) + #("l-*-37622" + "l-*-37623")) #(ribcage (emit quasivector quasilist* @@ -23882,35 +20017,45 @@ (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene + guile)))))) (hygiene guile)) - tmp-30277-30608)) - p-30605) - (quasi-30508 q-30554 lev-30533)) - (quasicons-30510 - (quasicons-30510 + tmp-37645-37979)) + p-37976) + (quasi-37876 q-37922 lev-37901)) + (quasicons-37878 + (quasicons-37878 '(#(syntax-object "quote" ((top) #(ribcage #(p) #((top)) - #("l-*-30275")) + #("l-*-37643")) #(ribcage #(p q) #((top) (top)) - #("l-*-30264" "l-*-30265")) + #("l-*-37632" "l-*-37633")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("l-*-30254" "l-*-30255")) + #("l-*-37622" "l-*-37623")) #(ribcage (emit quasivector quasilist* @@ -23925,13 +20070,22 @@ (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) #(syntax-object unquote-splicing @@ -23939,16 +20093,16 @@ #(ribcage #(p) #((top)) - #("l-*-30275")) + #("l-*-37643")) #(ribcage #(p q) #((top) (top)) - #("l-*-30264" "l-*-30265")) + #("l-*-37632" "l-*-37633")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("l-*-30254" "l-*-30255")) + #("l-*-37622" "l-*-37623")) #(ribcage (emit quasivector quasilist* @@ -23963,49 +20117,58 @@ (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile))) - (quasi-30508 - p-30605 - (#{1-}# lev-30533))) - (quasi-30508 q-30554 lev-30533)))) - tmp-30601) - (quasicons-30510 - (quasi-30508 p-30553 lev-30533) - (quasi-30508 q-30554 lev-30533))))))) - tmp-30549) - (let ((tmp-30622 - ($sc-dispatch p-30532 '#(vector each-any)))) - (if tmp-30622 + (quasi-37876 + p-37976 + (#{1-}# lev-37901))) + (quasi-37876 q-37922 lev-37901)))) + tmp-37972) + (quasicons-37878 + (quasi-37876 p-37921 lev-37901) + (quasi-37876 q-37922 lev-37901))))))) + tmp-37917) + (let ((tmp-37993 + ($sc-dispatch p-37900 '#(vector each-any)))) + (if tmp-37993 (@apply - (lambda (x-30626) - (let ((x-30629 - (vquasi-30509 x-30626 lev-30533))) - (let ((tmp-30631 + (lambda (x-37997) + (let ((x-38000 + (vquasi-37877 x-37997 lev-37901))) + (let ((tmp-38002 ($sc-dispatch - x-30629 + x-38000 '(#(atom "quote") each-any)))) - (if tmp-30631 + (if tmp-38002 (@apply - (lambda (x-30635) + (lambda (x-38006) (list '#(syntax-object "quote" ((top) #(ribcage #(x) #((top)) - #("l-*-30382")) + #("l-*-37750")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("l-*-30379")) + #("l-*-37747")) #(ribcage (emit quasivector quasilist* @@ -24020,36 +20183,45 @@ (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) - (list->vector x-30635))) - tmp-30631) + (list->vector x-38006))) + tmp-38002) (letrec* - ((f-30637 - (lambda (y-30649 k-30650) - (let ((tmp-30652 + ((f-38008 + (lambda (y-38020 k-38021) + (let ((tmp-38023 ($sc-dispatch - y-30649 + y-38020 '(#(atom "quote") each-any)))) - (if tmp-30652 + (if tmp-38023 (@apply - (lambda (y-30655) - (k-30650 - (map (lambda (tmp-30407-30656) + (lambda (y-38026) + (k-38021 + (map (lambda (tmp-37775-38027) (list '#(syntax-object "quote" ((top) #(ribcage #(y) #((top)) - #("l-*-30405")) + #("l-*-37773")) #(ribcage () () @@ -24061,13 +20233,13 @@ #((top) (top) (top)) - #("l-*-30387" - "l-*-30388" - "l-*-30389")) + #("l-*-37755" + "l-*-37756" + "l-*-37757")) #(ribcage #(_) #((top)) - #("l-*-30385")) + #("l-*-37753")) #(ribcage () () @@ -24075,7 +20247,7 @@ #(ribcage #(x) #((top)) - #("l-*-30379")) + #("l-*-37747")) #(ribcage (emit quasivector quasilist* @@ -24090,50 +20262,61 @@ (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene + guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene + guile)))))) (hygiene guile)) - tmp-30407-30656)) - y-30655))) - tmp-30652) - (let ((tmp-30657 + tmp-37775-38027)) + y-38026))) + tmp-38023) + (let ((tmp-38028 ($sc-dispatch - y-30649 + y-38020 '(#(atom "list") . each-any)))) - (if tmp-30657 + (if tmp-38028 (@apply - (lambda (y-30660) - (k-30650 y-30660)) - tmp-30657) - (let ((tmp-30661 + (lambda (y-38031) + (k-38021 y-38031)) + tmp-38028) + (let ((tmp-38032 ($sc-dispatch - y-30649 + y-38020 '(#(atom "list*") . #(each+ any (any) ()))))) - (if tmp-30661 + (if tmp-38032 (@apply - (lambda (y-30664 - z-30665) - (f-30637 - z-30665 - (lambda (ls-30666) - (k-30650 + (lambda (y-38035 + z-38036) + (f-38008 + z-38036 + (lambda (ls-38037) + (k-38021 (append - y-30664 - ls-30666))))) - tmp-30661) + y-38035 + ls-38037))))) + tmp-38032) (list '#(syntax-object "list->vector" ((top) @@ -24142,14 +20325,14 @@ () ()) #(ribcage - #(t-30422) - #((m-*-30423 + #(t-37790) + #((m-*-37791 top)) - #("l-*-30426")) + #("l-*-37794")) #(ribcage #(else) #((top)) - #("l-*-30420")) + #("l-*-37788")) #(ribcage () () @@ -24159,13 +20342,13 @@ #((top) (top) (top)) - #("l-*-30387" - "l-*-30388" - "l-*-30389")) + #("l-*-37755" + "l-*-37756" + "l-*-37757")) #(ribcage #(_) #((top)) - #("l-*-30385")) + #("l-*-37753")) #(ribcage () () @@ -24173,7 +20356,7 @@ #(ribcage #(x) #((top)) - #("l-*-30379")) + #("l-*-37747")) #(ribcage (emit quasivector quasilist* @@ -24188,26 +20371,37 @@ (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene + guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene + guile)))))) (hygiene guile)) - x-30629)))))))))) - (f-30637 - x-30629 - (lambda (ls-30639) - (let ((tmp-30641 + x-38000)))))))))) + (f-38008 + x-38000 + (lambda (ls-38010) + (let ((tmp-38012 ($sc-dispatch - ls-30639 + ls-38010 'each-any))) - (if tmp-30641 + (if tmp-38012 (@apply - (lambda (t-30395-30644) + (lambda (t-37763-38015) (cons '#(syntax-object "vector" ((top) @@ -24216,10 +20410,10 @@ () ()) #(ribcage - #(t-30395) - #((m-*-30396 + #(t-37763) + #((m-*-37764 top)) - #("l-*-30400")) + #("l-*-37768")) #(ribcage () () @@ -24235,11 +20429,11 @@ #(ribcage #(ls) #((top)) - #("l-*-30394")) + #("l-*-37762")) #(ribcage #(_) #((top)) - #("l-*-30385")) + #("l-*-37753")) #(ribcage () () @@ -24247,7 +20441,7 @@ #(ribcage #(x) #((top)) - #("l-*-30379")) + #("l-*-37747")) #(ribcage (emit quasivector quasilist* @@ -24262,30 +20456,41 @@ (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene + guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene + guile)))))) (hygiene guile)) - t-30395-30644)) - tmp-30641) + t-37763-38015)) + tmp-38012) (syntax-violation #f "source expression failed to match any pattern" - ls-30639)))))))))) - tmp-30622) + ls-38010)))))))))) + tmp-37993) (list '#(syntax-object "quote" ((top) - #(ribcage #(p) #((top)) #("l-*-30285")) + #(ribcage #(p) #((top)) #("l-*-37653")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("l-*-30254" "l-*-30255")) + #("l-*-37622" "l-*-37623")) #(ribcage (emit quasivector quasilist* @@ -24300,24 +20505,33 @@ (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) - p-30532))))))))))) - (vquasi-30509 - (lambda (p-30694 lev-30695) - (let ((tmp-30697 ($sc-dispatch p-30694 '(any . any)))) - (if tmp-30697 + p-37900))))))))))) + (vquasi-37877 + (lambda (p-38065 lev-38066) + (let ((tmp-38068 ($sc-dispatch p-38065 '(any . any)))) + (if tmp-38068 (@apply - (lambda (p-30701 q-30702) - (let ((tmp-30704 + (lambda (p-38072 q-38073) + (let ((tmp-38075 ($sc-dispatch - p-30701 + p-38072 '(#(free-id #(syntax-object unquote @@ -24325,12 +20539,12 @@ #(ribcage #(p q) #((top) (top)) - #("l-*-30293" "l-*-30294")) + #("l-*-37661" "l-*-37662")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("l-*-30289" "l-*-30290")) + #("l-*-37657" "l-*-37658")) #(ribcage (emit quasivector quasilist* @@ -24345,38 +20559,47 @@ (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile))) . each-any)))) - (if tmp-30704 + (if tmp-38075 (@apply - (lambda (p-30708) - (if (= lev-30695 0) - (quasilist*-30512 - (map (lambda (tmp-30301-30744) + (lambda (p-38079) + (if (= lev-38066 0) + (quasilist*-37880 + (map (lambda (tmp-37669-38118) (list '#(syntax-object "value" ((top) #(ribcage #(p) #((top)) - #("l-*-30299")) + #("l-*-37667")) #(ribcage #(p q) #((top) (top)) - #("l-*-30293" "l-*-30294")) + #("l-*-37661" "l-*-37662")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("l-*-30289" "l-*-30290")) + #("l-*-37657" "l-*-37658")) #(ribcage (emit quasivector quasilist* @@ -24391,32 +20614,41 @@ (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) - tmp-30301-30744)) - p-30708) - (vquasi-30509 q-30702 lev-30695)) - (quasicons-30510 - (quasicons-30510 + tmp-37669-38118)) + p-38079) + (vquasi-37877 q-38073 lev-38066)) + (quasicons-37878 + (quasicons-37878 '(#(syntax-object "quote" ((top) - #(ribcage #(p) #((top)) #("l-*-30299")) + #(ribcage #(p) #((top)) #("l-*-37667")) #(ribcage #(p q) #((top) (top)) - #("l-*-30293" "l-*-30294")) + #("l-*-37661" "l-*-37662")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("l-*-30289" "l-*-30290")) + #("l-*-37657" "l-*-37658")) #(ribcage (emit quasivector quasilist* @@ -24431,27 +20663,36 @@ (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) #(syntax-object unquote ((top) - #(ribcage #(p) #((top)) #("l-*-30299")) + #(ribcage #(p) #((top)) #("l-*-37667")) #(ribcage #(p q) #((top) (top)) - #("l-*-30293" "l-*-30294")) + #("l-*-37661" "l-*-37662")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("l-*-30289" "l-*-30290")) + #("l-*-37657" "l-*-37658")) #(ribcage (emit quasivector quasilist* @@ -24466,20 +20707,29 @@ (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile))) - (quasi-30508 p-30708 (#{1-}# lev-30695))) - (vquasi-30509 q-30702 lev-30695)))) - tmp-30704) - (let ((tmp-30751 + (quasi-37876 p-38079 (#{1-}# lev-38066))) + (vquasi-37877 q-38073 lev-38066)))) + tmp-38075) + (let ((tmp-38125 ($sc-dispatch - p-30701 + p-38072 '(#(free-id #(syntax-object unquote-splicing @@ -24487,12 +20737,12 @@ #(ribcage #(p q) #((top) (top)) - #("l-*-30293" "l-*-30294")) + #("l-*-37661" "l-*-37662")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("l-*-30289" "l-*-30290")) + #("l-*-37657" "l-*-37658")) #(ribcage (emit quasivector quasilist* @@ -24507,40 +20757,49 @@ (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile))) . each-any)))) - (if tmp-30751 + (if tmp-38125 (@apply - (lambda (p-30755) - (if (= lev-30695 0) - (quasiappend-30511 - (map (lambda (tmp-30306-30758) + (lambda (p-38129) + (if (= lev-38066 0) + (quasiappend-37879 + (map (lambda (tmp-37674-38132) (list '#(syntax-object "value" ((top) #(ribcage #(p) #((top)) - #("l-*-30304")) + #("l-*-37672")) #(ribcage #(p q) #((top) (top)) - #("l-*-30293" - "l-*-30294")) + #("l-*-37661" + "l-*-37662")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("l-*-30289" - "l-*-30290")) + #("l-*-37657" + "l-*-37658")) #(ribcage (emit quasivector quasilist* @@ -24555,35 +20814,44 @@ (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) - tmp-30306-30758)) - p-30755) - (vquasi-30509 q-30702 lev-30695)) - (quasicons-30510 - (quasicons-30510 + tmp-37674-38132)) + p-38129) + (vquasi-37877 q-38073 lev-38066)) + (quasicons-37878 + (quasicons-37878 '(#(syntax-object "quote" ((top) #(ribcage #(p) #((top)) - #("l-*-30304")) + #("l-*-37672")) #(ribcage #(p q) #((top) (top)) - #("l-*-30293" "l-*-30294")) + #("l-*-37661" "l-*-37662")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("l-*-30289" "l-*-30290")) + #("l-*-37657" "l-*-37658")) #(ribcage (emit quasivector quasilist* @@ -24598,13 +20866,22 @@ (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) #(syntax-object unquote-splicing @@ -24612,16 +20889,16 @@ #(ribcage #(p) #((top)) - #("l-*-30304")) + #("l-*-37672")) #(ribcage #(p q) #((top) (top)) - #("l-*-30293" "l-*-30294")) + #("l-*-37661" "l-*-37662")) #(ribcage () () ()) #(ribcage #(p lev) #((top) (top)) - #("l-*-30289" "l-*-30290")) + #("l-*-37657" "l-*-37658")) #(ribcage (emit quasivector quasilist* @@ -24636,23 +20913,32 @@ (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile))) - (quasi-30508 p-30755 (#{1-}# lev-30695))) - (vquasi-30509 q-30702 lev-30695)))) - tmp-30751) - (quasicons-30510 - (quasi-30508 p-30701 lev-30695) - (vquasi-30509 q-30702 lev-30695))))))) - tmp-30697) - (let ((tmp-30776 ($sc-dispatch p-30694 '()))) - (if tmp-30776 + (quasi-37876 p-38129 (#{1-}# lev-38066))) + (vquasi-37877 q-38073 lev-38066)))) + tmp-38125) + (quasicons-37878 + (quasi-37876 p-38072 lev-38066) + (vquasi-37877 q-38073 lev-38066))))))) + tmp-38068) + (let ((tmp-38150 ($sc-dispatch p-38065 '()))) + (if tmp-38150 (@apply (lambda () '(#(syntax-object @@ -24662,7 +20948,7 @@ #(ribcage #(p lev) #((top) (top)) - #("l-*-30289" "l-*-30290")) + #("l-*-37657" "l-*-37658")) #(ribcage (emit quasivector quasilist* @@ -24671,61 +20957,70 @@ vquasi quasi) ((top) (top) (top) (top) (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) ())) - tmp-30776) + tmp-38150) (syntax-violation #f "source expression failed to match any pattern" - p-30694))))))) - (quasicons-30510 - (lambda (x-30789 y-30790) - (let ((tmp-30791 (list x-30789 y-30790))) - (let ((tmp-30792 ($sc-dispatch tmp-30791 '(any any)))) - (if tmp-30792 + p-38065))))))) + (quasicons-37878 + (lambda (x-38163 y-38164) + (let ((tmp-38165 (list x-38163 y-38164))) + (let ((tmp-38166 ($sc-dispatch tmp-38165 '(any any)))) + (if tmp-38166 (@apply - (lambda (x-30794 y-30795) - (let ((tmp-30797 - ($sc-dispatch y-30795 '(#(atom "quote") any)))) - (if tmp-30797 + (lambda (x-38168 y-38169) + (let ((tmp-38171 + ($sc-dispatch y-38169 '(#(atom "quote") any)))) + (if tmp-38171 (@apply - (lambda (dy-30801) - (let ((tmp-30803 + (lambda (dy-38175) + (let ((tmp-38177 ($sc-dispatch - x-30794 + x-38168 '(#(atom "quote") any)))) - (if tmp-30803 + (if tmp-38177 (@apply - (lambda (dx-30807) + (lambda (dx-38181) (list '#(syntax-object "quote" ((top) #(ribcage #(dx) #((top)) - #("l-*-30328")) + #("l-*-37696")) #(ribcage #(dy) #((top)) - #("l-*-30324")) + #("l-*-37692")) #(ribcage () () ()) #(ribcage #(x y) #((top) (top)) - #("l-*-30318" "l-*-30319")) + #("l-*-37686" "l-*-37687")) #(ribcage () () ()) #(ribcage () () ()) #(ribcage #(x y) #((top) (top)) - #("l-*-30313" "l-*-30314")) + #("l-*-37681" "l-*-37682")) #(ribcage (emit quasivector quasilist* @@ -24740,39 +21035,48 @@ (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) - (cons dx-30807 dy-30801))) - tmp-30803) - (if (null? dy-30801) + (cons dx-38181 dy-38175))) + tmp-38177) + (if (null? dy-38175) (list '#(syntax-object "list" ((top) #(ribcage #(_) #((top)) - #("l-*-30330")) + #("l-*-37698")) #(ribcage #(dy) #((top)) - #("l-*-30324")) + #("l-*-37692")) #(ribcage () () ()) #(ribcage #(x y) #((top) (top)) - #("l-*-30318" "l-*-30319")) + #("l-*-37686" "l-*-37687")) #(ribcage () () ()) #(ribcage () () ()) #(ribcage #(x y) #((top) (top)) - #("l-*-30313" "l-*-30314")) + #("l-*-37681" "l-*-37682")) #(ribcage (emit quasivector quasilist* @@ -24787,37 +21091,46 @@ (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) - x-30794) + x-38168) (list '#(syntax-object "list*" ((top) #(ribcage #(_) #((top)) - #("l-*-30330")) + #("l-*-37698")) #(ribcage #(dy) #((top)) - #("l-*-30324")) + #("l-*-37692")) #(ribcage () () ()) #(ribcage #(x y) #((top) (top)) - #("l-*-30318" "l-*-30319")) + #("l-*-37686" "l-*-37687")) #(ribcage () () ()) #(ribcage () () ()) #(ribcage #(x y) #((top) (top)) - #("l-*-30313" "l-*-30314")) + #("l-*-37681" "l-*-37682")) #(ribcage (emit quasivector quasilist* @@ -24832,42 +21145,51 @@ (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) - x-30794 - y-30795))))) - tmp-30797) - (let ((tmp-30812 + x-38168 + y-38169))))) + tmp-38171) + (let ((tmp-38186 ($sc-dispatch - y-30795 + y-38169 '(#(atom "list") . any)))) - (if tmp-30812 + (if tmp-38186 (@apply - (lambda (stuff-30816) + (lambda (stuff-38190) (cons '#(syntax-object "list" ((top) #(ribcage #(stuff) #((top)) - #("l-*-30333")) + #("l-*-37701")) #(ribcage () () ()) #(ribcage #(x y) #((top) (top)) - #("l-*-30318" "l-*-30319")) + #("l-*-37686" "l-*-37687")) #(ribcage () () ()) #(ribcage () () ()) #(ribcage #(x y) #((top) (top)) - #("l-*-30313" "l-*-30314")) + #("l-*-37681" "l-*-37682")) #(ribcage (emit quasivector quasilist* @@ -24882,41 +21204,50 @@ (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) - (cons x-30794 stuff-30816))) - tmp-30812) - (let ((tmp-30817 + (cons x-38168 stuff-38190))) + tmp-38186) + (let ((tmp-38191 ($sc-dispatch - y-30795 + y-38169 '(#(atom "list*") . any)))) - (if tmp-30817 + (if tmp-38191 (@apply - (lambda (stuff-30821) + (lambda (stuff-38195) (cons '#(syntax-object "list*" ((top) #(ribcage #(stuff) #((top)) - #("l-*-30336")) + #("l-*-37704")) #(ribcage () () ()) #(ribcage #(x y) #((top) (top)) - #("l-*-30318" "l-*-30319")) + #("l-*-37686" "l-*-37687")) #(ribcage () () ()) #(ribcage () () ()) #(ribcage #(x y) #((top) (top)) - #("l-*-30313" "l-*-30314")) + #("l-*-37681" "l-*-37682")) #(ribcage (emit quasivector quasilist* @@ -24931,34 +21262,43 @@ (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) - (cons x-30794 stuff-30821))) - tmp-30817) + (cons x-38168 stuff-38195))) + tmp-38191) (list '#(syntax-object "list*" ((top) #(ribcage #(_) #((top)) - #("l-*-30338")) + #("l-*-37706")) #(ribcage () () ()) #(ribcage #(x y) #((top) (top)) - #("l-*-30318" "l-*-30319")) + #("l-*-37686" "l-*-37687")) #(ribcage () () ()) #(ribcage () () ()) #(ribcage #(x y) #((top) (top)) - #("l-*-30313" "l-*-30314")) + #("l-*-37681" "l-*-37682")) #(ribcage (emit quasivector quasilist* @@ -24973,29 +21313,38 @@ (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) - x-30794 - y-30795)))))))) - tmp-30792) + x-38168 + y-38169)))))))) + tmp-38166) (syntax-violation #f "source expression failed to match any pattern" - tmp-30791)))))) - (quasiappend-30511 - (lambda (x-30832 y-30833) - (let ((tmp-30835 - ($sc-dispatch y-30833 '(#(atom "quote") ())))) - (if tmp-30835 + tmp-38165)))))) + (quasiappend-37879 + (lambda (x-38206 y-38207) + (let ((tmp-38209 + ($sc-dispatch y-38207 '(#(atom "quote") ())))) + (if tmp-38209 (@apply (lambda () - (if (null? x-30832) + (if (null? x-38206) '(#(syntax-object "quote" ((top) @@ -25003,7 +21352,7 @@ #(ribcage #(x y) #((top) (top)) - #("l-*-30342" "l-*-30343")) + #("l-*-37710" "l-*-37711")) #(ribcage (emit quasivector quasilist* @@ -25012,21 +21361,30 @@ vquasi quasi) ((top) (top) (top) (top) (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) ()) - (if (null? (cdr x-30832)) - (car x-30832) - (let ((tmp-30840 ($sc-dispatch x-30832 'each-any))) - (if tmp-30840 + (if (null? (cdr x-38206)) + (car x-38206) + (let ((tmp-38214 ($sc-dispatch x-38206 'each-any))) + (if tmp-38214 (@apply - (lambda (p-30844) + (lambda (p-38218) (cons '#(syntax-object "append" ((top) @@ -25034,12 +21392,12 @@ #(ribcage #(p) #((top)) - #("l-*-30354")) + #("l-*-37722")) #(ribcage () () ()) #(ribcage #(x y) #((top) (top)) - #("l-*-30342" "l-*-30343")) + #("l-*-37710" "l-*-37711")) #(ribcage (emit quasivector quasilist* @@ -25054,29 +21412,38 @@ (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) - p-30844)) - tmp-30840) + p-38218)) + tmp-38214) (syntax-violation #f "source expression failed to match any pattern" - x-30832)))))) - tmp-30835) - (if (null? x-30832) - y-30833 - (let ((tmp-30852 (list x-30832 y-30833))) - (let ((tmp-30853 - ($sc-dispatch tmp-30852 '(each-any any)))) - (if tmp-30853 + x-38206)))))) + tmp-38209) + (if (null? x-38206) + y-38207 + (let ((tmp-38226 (list x-38206 y-38207))) + (let ((tmp-38227 + ($sc-dispatch tmp-38226 '(each-any any)))) + (if tmp-38227 (@apply - (lambda (p-30855 y-30856) + (lambda (p-38229 y-38230) (cons '#(syntax-object "append" ((top) @@ -25084,13 +21451,13 @@ #(ribcage #(p y) #((top) (top)) - #("l-*-30365" "l-*-30366")) - #(ribcage #(_) #((top)) #("l-*-30357")) + #("l-*-37733" "l-*-37734")) + #(ribcage #(_) #((top)) #("l-*-37725")) #(ribcage () () ()) #(ribcage #(x y) #((top) (top)) - #("l-*-30342" "l-*-30343")) + #("l-*-37710" "l-*-37711")) #(ribcage (emit quasivector quasilist* @@ -25105,44 +21472,53 @@ (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) - (append p-30855 (list y-30856)))) - tmp-30853) + (append p-38229 (list y-38230)))) + tmp-38227) (syntax-violation #f "source expression failed to match any pattern" - tmp-30852))))))))) - (quasilist*-30512 - (lambda (x-30860 y-30861) + tmp-38226))))))))) + (quasilist*-37880 + (lambda (x-38234 y-38235) (letrec* - ((f-30862 - (lambda (x-30951) - (if (null? x-30951) - y-30861 - (quasicons-30510 - (car x-30951) - (f-30862 (cdr x-30951))))))) - (f-30862 x-30860)))) - (emit-30514 - (lambda (x-30954) - (let ((tmp-30956 - ($sc-dispatch x-30954 '(#(atom "quote") any)))) - (if tmp-30956 + ((f-38236 + (lambda (x-38340) + (if (null? x-38340) + y-38235 + (quasicons-37878 + (car x-38340) + (f-38236 (cdr x-38340))))))) + (f-38236 x-38234)))) + (emit-37882 + (lambda (x-38343) + (let ((tmp-38345 + ($sc-dispatch x-38343 '(#(atom "quote") any)))) + (if tmp-38345 (@apply - (lambda (x-30960) + (lambda (x-38349) (list '#(syntax-object quote ((top) - #(ribcage #(x) #((top)) #("l-*-30432")) + #(ribcage #(x) #((top)) #("l-*-37800")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-30429")) + #(ribcage #(x) #((top)) #("l-*-37797")) #(ribcage (emit quasivector quasilist* @@ -25151,45 +21527,54 @@ vquasi quasi) ((top) (top) (top) (top) (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) - x-30960)) - tmp-30956) - (let ((tmp-30961 + x-38349)) + tmp-38345) + (let ((tmp-38350 ($sc-dispatch - x-30954 + x-38343 '(#(atom "list") . each-any)))) - (if tmp-30961 + (if tmp-38350 (@apply - (lambda (x-30965) - (let ((tmp-30966 (map emit-30514 x-30965))) - (let ((tmp-30967 ($sc-dispatch tmp-30966 'each-any))) - (if tmp-30967 + (lambda (x-38354) + (let ((tmp-38355 (map emit-37882 x-38354))) + (let ((tmp-38356 ($sc-dispatch tmp-38355 'each-any))) + (if tmp-38356 (@apply - (lambda (t-30437-30969) + (lambda (t-37805-38358) (cons '#(syntax-object list ((top) #(ribcage () () ()) #(ribcage - #(t-30437) - #((m-*-30438 top)) - #("l-*-30442")) + #(t-37805) + #((m-*-37806 top)) + #("l-*-37810")) #(ribcage #(x) #((top)) - #("l-*-30435")) + #("l-*-37803")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("l-*-30429")) + #("l-*-37797")) #(ribcage (emit quasivector quasilist* @@ -25204,70 +21589,79 @@ (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) - t-30437-30969)) - tmp-30967) + t-37805-38358)) + tmp-38356) (syntax-violation #f "source expression failed to match any pattern" - tmp-30966))))) - tmp-30961) - (let ((tmp-30970 + tmp-38355))))) + tmp-38350) + (let ((tmp-38359 ($sc-dispatch - x-30954 + x-38343 '(#(atom "list*") . #(each+ any (any) ()))))) - (if tmp-30970 + (if tmp-38359 (@apply - (lambda (x-30974 y-30975) + (lambda (x-38363 y-38364) (letrec* - ((f-30976 - (lambda (x*-30979) - (if (null? x*-30979) - (emit-30514 y-30975) - (let ((tmp-30980 - (list (emit-30514 (car x*-30979)) - (f-30976 (cdr x*-30979))))) - (let ((tmp-30981 + ((f-38365 + (lambda (x*-38368) + (if (null? x*-38368) + (emit-37882 y-38364) + (let ((tmp-38369 + (list (emit-37882 (car x*-38368)) + (f-38365 (cdr x*-38368))))) + (let ((tmp-38370 ($sc-dispatch - tmp-30980 + tmp-38369 '(any any)))) - (if tmp-30981 + (if tmp-38370 (@apply - (lambda (t-30457-30983 - t-30456-30984) + (lambda (t-37825-38372 + t-37824-38373) (list '#(syntax-object cons ((top) #(ribcage () () ()) #(ribcage - #(t-30457 t-30456) - #((m-*-30458 top) - (m-*-30458 top)) - #("l-*-30462" - "l-*-30463")) + #(t-37825 t-37824) + #((m-*-37826 top) + (m-*-37826 top)) + #("l-*-37830" + "l-*-37831")) #(ribcage () () ()) #(ribcage #(f x*) #((top) (top)) - #("l-*-30451" - "l-*-30452")) + #("l-*-37819" + "l-*-37820")) #(ribcage #(x y) #((top) (top)) - #("l-*-30447" - "l-*-30448")) + #("l-*-37815" + "l-*-37816")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("l-*-30429")) + #("l-*-37797")) #(ribcage (emit quasivector quasilist* @@ -25282,53 +21676,63 @@ (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene + guile)))))) (hygiene guile)) - t-30457-30983 - t-30456-30984)) - tmp-30981) + t-37825-38372 + t-37824-38373)) + tmp-38370) (syntax-violation #f "source expression failed to match any pattern" - tmp-30980)))))))) - (f-30976 x-30974))) - tmp-30970) - (let ((tmp-30985 + tmp-38369)))))))) + (f-38365 x-38363))) + tmp-38359) + (let ((tmp-38374 ($sc-dispatch - x-30954 + x-38343 '(#(atom "append") . each-any)))) - (if tmp-30985 + (if tmp-38374 (@apply - (lambda (x-30989) - (let ((tmp-30990 (map emit-30514 x-30989))) - (let ((tmp-30991 - ($sc-dispatch tmp-30990 'each-any))) - (if tmp-30991 + (lambda (x-38378) + (let ((tmp-38379 (map emit-37882 x-38378))) + (let ((tmp-38380 + ($sc-dispatch tmp-38379 'each-any))) + (if tmp-38380 (@apply - (lambda (t-30469-30993) + (lambda (t-37837-38382) (cons '#(syntax-object append ((top) #(ribcage () () ()) #(ribcage - #(t-30469) - #((m-*-30470 top)) - #("l-*-30474")) + #(t-37837) + #((m-*-37838 top)) + #("l-*-37842")) #(ribcage #(x) #((top)) - #("l-*-30467")) + #("l-*-37835")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("l-*-30429")) + #("l-*-37797")) #(ribcage (emit quasivector quasilist* @@ -25343,53 +21747,62 @@ (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) - t-30469-30993)) - tmp-30991) + t-37837-38382)) + tmp-38380) (syntax-violation #f "source expression failed to match any pattern" - tmp-30990))))) - tmp-30985) - (let ((tmp-30994 + tmp-38379))))) + tmp-38374) + (let ((tmp-38383 ($sc-dispatch - x-30954 + x-38343 '(#(atom "vector") . each-any)))) - (if tmp-30994 + (if tmp-38383 (@apply - (lambda (x-30998) - (let ((tmp-30999 (map emit-30514 x-30998))) - (let ((tmp-31000 + (lambda (x-38387) + (let ((tmp-38388 (map emit-37882 x-38387))) + (let ((tmp-38389 ($sc-dispatch - tmp-30999 + tmp-38388 'each-any))) - (if tmp-31000 + (if tmp-38389 (@apply - (lambda (t-30481-31002) + (lambda (t-37849-38391) (cons '#(syntax-object vector ((top) #(ribcage () () ()) #(ribcage - #(t-30481) - #((m-*-30482 top)) - #("l-*-30486")) + #(t-37849) + #((m-*-37850 top)) + #("l-*-37854")) #(ribcage #(x) #((top)) - #("l-*-30479")) + #("l-*-37847")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("l-*-30429")) + #("l-*-37797")) #(ribcage (emit quasivector quasilist* @@ -25404,46 +21817,56 @@ (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene + guile)))))) (hygiene guile)) - t-30481-31002)) - tmp-31000) + t-37849-38391)) + tmp-38389) (syntax-violation #f "source expression failed to match any pattern" - tmp-30999))))) - tmp-30994) - (let ((tmp-31003 + tmp-38388))))) + tmp-38383) + (let ((tmp-38392 ($sc-dispatch - x-30954 + x-38343 '(#(atom "list->vector") any)))) - (if tmp-31003 + (if tmp-38392 (@apply - (lambda (x-31007) - (let ((tmp-31008 (emit-30514 x-31007))) + (lambda (x-38396) + (let ((tmp-38397 (emit-37882 x-38396))) (list '#(syntax-object list->vector ((top) #(ribcage () () ()) #(ribcage - #(t-30493) - #((m-*-30494 top)) - #("l-*-30497")) + #(t-37861) + #((m-*-37862 top)) + #("l-*-37865")) #(ribcage #(x) #((top)) - #("l-*-30491")) + #("l-*-37859")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("l-*-30429")) + #("l-*-37797")) #(ribcage (emit quasivector quasilist* @@ -25458,183 +21881,210 @@ (top) (top) (top)) - ("l-*-30250" - "l-*-30248" - "l-*-30246" - "l-*-30244" - "l-*-30242" - "l-*-30240" - "l-*-30238"))) + ("l-*-37618" + "l-*-37616" + "l-*-37614" + "l-*-37612" + "l-*-37610" + "l-*-37608" + "l-*-37606")) + #(ribcage + (quasiquote) + ((top)) + (((hygiene guile) + . + #(syntax-object + quasiquote + ((top)) + (hygiene guile)))))) (hygiene guile)) - tmp-31008))) - tmp-31003) - (let ((tmp-31011 + tmp-38397))) + tmp-38392) + (let ((tmp-38400 ($sc-dispatch - x-30954 + x-38343 '(#(atom "value") any)))) - (if tmp-31011 + (if tmp-38400 (@apply - (lambda (x-31015) x-31015) - tmp-31011) + (lambda (x-38404) x-38404) + tmp-38400) (syntax-violation #f "source expression failed to match any pattern" - x-30954)))))))))))))))))) - (lambda (x-30515) - (let ((tmp-30517 ($sc-dispatch x-30515 '(_ any)))) - (if tmp-30517 + x-38343)))))))))))))))))) + (lambda (x-37883) + (let ((tmp-37885 ($sc-dispatch x-37883 '(_ any)))) + (if tmp-37885 (@apply - (lambda (e-30521) - (emit-30514 (quasi-30508 e-30521 0))) - tmp-30517) + (lambda (e-37889) + (emit-37882 (quasi-37876 e-37889 0))) + tmp-37885) (syntax-violation #f "source expression failed to match any pattern" - x-30515))))))) + x-37883))))))) (define include (make-syntax-transformer 'include 'macro - (lambda (x-31070) + (lambda (x-38460) (letrec* - ((read-file-31071 - (lambda (fn-31180 k-31181) - (let ((p-31182 (open-input-file fn-31180))) + ((read-file-38461 + (lambda (fn-38570 k-38571) + (let ((p-38572 (open-input-file fn-38570))) (letrec* - ((f-31183 - (lambda (x-31237 result-31238) - (if (eof-object? x-31237) + ((f-38573 + (lambda (x-38627 result-38628) + (if (eof-object? x-38627) (begin - (close-input-port p-31182) - (reverse result-31238)) - (f-31183 - (read p-31182) - (cons (datum->syntax k-31181 x-31237) - result-31238)))))) - (f-31183 (read p-31182) '())))))) - (let ((tmp-31073 ($sc-dispatch x-31070 '(any any)))) - (if tmp-31073 + (close-input-port p-38572) + (reverse result-38628)) + (f-38573 + (read p-38572) + (cons (datum->syntax k-38571 x-38627) + result-38628)))))) + (f-38573 (read p-38572) '())))))) + (let ((tmp-38463 ($sc-dispatch x-38460 '(any any)))) + (if tmp-38463 (@apply - (lambda (k-31077 filename-31078) - (let ((fn-31079 (syntax->datum filename-31078))) - (let ((tmp-31080 - (read-file-31071 fn-31079 filename-31078))) - (let ((tmp-31081 ($sc-dispatch tmp-31080 'each-any))) - (if tmp-31081 + (lambda (k-38467 filename-38468) + (let ((fn-38469 (syntax->datum filename-38468))) + (let ((tmp-38470 + (read-file-38461 fn-38469 filename-38468))) + (let ((tmp-38471 ($sc-dispatch tmp-38470 'each-any))) + (if tmp-38471 (@apply - (lambda (exp-31099) + (lambda (exp-38489) (cons '#(syntax-object begin ((top) #(ribcage () () ()) - #(ribcage #(exp) #((top)) #("l-*-31067")) + #(ribcage #(exp) #((top)) #("l-*-38457")) #(ribcage () () ()) #(ribcage () () ()) - #(ribcage #(fn) #((top)) #("l-*-31062")) + #(ribcage #(fn) #((top)) #("l-*-38452")) #(ribcage #(k filename) #((top) (top)) - #("l-*-31058" "l-*-31059")) + #("l-*-38448" "l-*-38449")) #(ribcage (read-file) ((top)) - ("l-*-31042")) - #(ribcage #(x) #((top)) #("l-*-31041"))) + ("l-*-38432")) + #(ribcage #(x) #((top)) #("l-*-38431")) + #(ribcage + (include) + ((top)) + (((hygiene guile) + . + #(syntax-object + include + ((top)) + (hygiene guile)))))) (hygiene guile)) - exp-31099)) - tmp-31081) + exp-38489)) + tmp-38471) (syntax-violation #f "source expression failed to match any pattern" - tmp-31080)))))) - tmp-31073) + tmp-38470)))))) + tmp-38463) (syntax-violation #f "source expression failed to match any pattern" - x-31070))))))) + x-38460))))))) (define include-from-path (make-syntax-transformer 'include-from-path 'macro - (lambda (x-31257) - (let ((tmp-31259 ($sc-dispatch x-31257 '(any any)))) - (if tmp-31259 + (lambda (x-38648) + (let ((tmp-38650 ($sc-dispatch x-38648 '(any any)))) + (if tmp-38650 (@apply - (lambda (k-31263 filename-31264) - (let ((fn-31265 (syntax->datum filename-31264))) - (let ((tmp-31266 + (lambda (k-38654 filename-38655) + (let ((fn-38656 (syntax->datum filename-38655))) + (let ((tmp-38657 (datum->syntax - filename-31264 - (let ((t-31269 (%search-load-path fn-31265))) - (if t-31269 - t-31269 + filename-38655 + (let ((t-38660 (%search-load-path fn-38656))) + (if t-38660 + t-38660 (syntax-violation 'include-from-path "file not found in path" - x-31257 - filename-31264)))))) + x-38648 + filename-38655)))))) (list '#(syntax-object include ((top) #(ribcage () () ()) - #(ribcage #(fn) #((top)) #("l-*-31251")) + #(ribcage #(fn) #((top)) #("l-*-38642")) #(ribcage () () ()) #(ribcage () () ()) - #(ribcage #(fn) #((top)) #("l-*-31247")) + #(ribcage #(fn) #((top)) #("l-*-38638")) #(ribcage #(k filename) #((top) (top)) - #("l-*-31243" "l-*-31244")) + #("l-*-38634" "l-*-38635")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-31240"))) + #(ribcage #(x) #((top)) #("l-*-38631")) + #(ribcage + (include-from-path) + ((top)) + (((hygiene guile) + . + #(syntax-object + include-from-path + ((top)) + (hygiene guile)))))) (hygiene guile)) - tmp-31266)))) - tmp-31259) + tmp-38657)))) + tmp-38650) (syntax-violation #f "source expression failed to match any pattern" - x-31257)))))) + x-38648)))))) (define unquote (make-syntax-transformer 'unquote 'macro - (lambda (x-31278) + (lambda (x-38670) (syntax-violation 'unquote "expression not valid outside of quasiquote" - x-31278)))) + x-38670)))) (define unquote-splicing (make-syntax-transformer 'unquote-splicing 'macro - (lambda (x-31281) + (lambda (x-38674) (syntax-violation 'unquote-splicing "expression not valid outside of quasiquote" - x-31281)))) + x-38674)))) (define case (make-syntax-transformer 'case 'macro - (lambda (x-31337) - (let ((tmp-31339 - ($sc-dispatch x-31337 '(_ any any . each-any)))) - (if tmp-31339 + (lambda (x-38731) + (let ((tmp-38733 + ($sc-dispatch x-38731 '(_ any any . each-any)))) + (if tmp-38733 (@apply - (lambda (e-31343 m1-31344 m2-31345) - (let ((tmp-31346 + (lambda (e-38737 m1-38738 m2-38739) + (let ((tmp-38740 (letrec* - ((f-31388 - (lambda (clause-31391 clauses-31392) - (if (null? clauses-31392) - (let ((tmp-31394 + ((f-38794 + (lambda (clause-38797 clauses-38798) + (if (null? clauses-38798) + (let ((tmp-38800 ($sc-dispatch - clause-31391 + clause-38797 '(#(free-id #(syntax-object else @@ -25643,89 +22093,116 @@ #(ribcage #(f clause clauses) #((top) (top) (top)) - #("l-*-31296" - "l-*-31297" - "l-*-31298")) + #("l-*-38690" + "l-*-38691" + "l-*-38692")) #(ribcage #(e m1 m2) #((top) (top) (top)) - #("l-*-31286" - "l-*-31287" - "l-*-31288")) + #("l-*-38680" + "l-*-38681" + "l-*-38682")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("l-*-31283"))) + #("l-*-38677")) + #(ribcage + (case) + ((top)) + (((hygiene guile) + . + #(syntax-object + case + ((top)) + (hygiene guile)))))) (hygiene guile))) any . each-any)))) - (if tmp-31394 + (if tmp-38800 (@apply - (lambda (e1-31398 e2-31399) + (lambda (e1-38804 e2-38805) (cons '#(syntax-object begin ((top) #(ribcage #(e1 e2) #((top) (top)) - #("l-*-31305" "l-*-31306")) + #("l-*-38699" "l-*-38700")) #(ribcage () () ()) #(ribcage #(f clause clauses) #((top) (top) (top)) - #("l-*-31296" - "l-*-31297" - "l-*-31298")) + #("l-*-38690" + "l-*-38691" + "l-*-38692")) #(ribcage #(e m1 m2) #((top) (top) (top)) - #("l-*-31286" - "l-*-31287" - "l-*-31288")) + #("l-*-38680" + "l-*-38681" + "l-*-38682")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("l-*-31283"))) + #("l-*-38677")) + #(ribcage + (case) + ((top)) + (((hygiene guile) + . + #(syntax-object + case + ((top)) + (hygiene guile)))))) (hygiene guile)) - (cons e1-31398 e2-31399))) - tmp-31394) - (let ((tmp-31400 + (cons e1-38804 e2-38805))) + tmp-38800) + (let ((tmp-38806 ($sc-dispatch - clause-31391 + clause-38797 '(each-any any . each-any)))) - (if tmp-31400 + (if tmp-38806 (@apply - (lambda (k-31404 e1-31405 e2-31406) + (lambda (k-38810 e1-38811 e2-38812) (list '#(syntax-object if ((top) #(ribcage #(k e1 e2) #((top) (top) (top)) - #("l-*-31311" - "l-*-31312" - "l-*-31313")) + #("l-*-38705" + "l-*-38706" + "l-*-38707")) #(ribcage () () ()) #(ribcage #(f clause clauses) #((top) (top) (top)) - #("l-*-31296" - "l-*-31297" - "l-*-31298")) + #("l-*-38690" + "l-*-38691" + "l-*-38692")) #(ribcage #(e m1 m2) #((top) (top) (top)) - #("l-*-31286" - "l-*-31287" - "l-*-31288")) + #("l-*-38680" + "l-*-38681" + "l-*-38682")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("l-*-31283"))) + #("l-*-38677")) + #(ribcage + (case) + ((top)) + (((hygiene guile) + . + #(syntax-object + case + ((top)) + (hygiene guile)))))) (hygiene guile)) (list '#(syntax-object memv @@ -25735,9 +22212,9 @@ #((top) (top) (top)) - #("l-*-31311" - "l-*-31312" - "l-*-31313")) + #("l-*-38705" + "l-*-38706" + "l-*-38707")) #(ribcage () () ()) #(ribcage #(f @@ -25746,22 +22223,32 @@ #((top) (top) (top)) - #("l-*-31296" - "l-*-31297" - "l-*-31298")) + #("l-*-38690" + "l-*-38691" + "l-*-38692")) #(ribcage #(e m1 m2) #((top) (top) (top)) - #("l-*-31286" - "l-*-31287" - "l-*-31288")) + #("l-*-38680" + "l-*-38681" + "l-*-38682")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("l-*-31283"))) + #("l-*-38677")) + #(ribcage + (case) + ((top)) + (((hygiene guile) + . + #(syntax-object + case + ((top)) + (hygiene + guile)))))) (hygiene guile)) '#(syntax-object t @@ -25771,9 +22258,9 @@ #((top) (top) (top)) - #("l-*-31311" - "l-*-31312" - "l-*-31313")) + #("l-*-38705" + "l-*-38706" + "l-*-38707")) #(ribcage () () ()) #(ribcage #(f @@ -25782,22 +22269,32 @@ #((top) (top) (top)) - #("l-*-31296" - "l-*-31297" - "l-*-31298")) + #("l-*-38690" + "l-*-38691" + "l-*-38692")) #(ribcage #(e m1 m2) #((top) (top) (top)) - #("l-*-31286" - "l-*-31287" - "l-*-31288")) + #("l-*-38680" + "l-*-38681" + "l-*-38682")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("l-*-31283"))) + #("l-*-38677")) + #(ribcage + (case) + ((top)) + (((hygiene guile) + . + #(syntax-object + case + ((top)) + (hygiene + guile)))))) (hygiene guile)) (list '#(syntax-object quote @@ -25807,9 +22304,9 @@ #((top) (top) (top)) - #("l-*-31311" - "l-*-31312" - "l-*-31313")) + #("l-*-38705" + "l-*-38706" + "l-*-38707")) #(ribcage () () @@ -25821,17 +22318,17 @@ #((top) (top) (top)) - #("l-*-31296" - "l-*-31297" - "l-*-31298")) + #("l-*-38690" + "l-*-38691" + "l-*-38692")) #(ribcage #(e m1 m2) #((top) (top) (top)) - #("l-*-31286" - "l-*-31287" - "l-*-31288")) + #("l-*-38680" + "l-*-38681" + "l-*-38682")) #(ribcage () () @@ -25839,10 +22336,21 @@ #(ribcage #(x) #((top)) - #("l-*-31283"))) + #("l-*-38677")) + #(ribcage + (case) + ((top)) + (((hygiene + guile) + . + #(syntax-object + case + ((top)) + (hygiene + guile)))))) (hygiene guile)) - k-31404)) + k-38810)) (cons '#(syntax-object begin ((top) @@ -25851,9 +22359,9 @@ #((top) (top) (top)) - #("l-*-31311" - "l-*-31312" - "l-*-31313")) + #("l-*-38705" + "l-*-38706" + "l-*-38707")) #(ribcage () () ()) #(ribcage #(f @@ -25862,74 +22370,93 @@ #((top) (top) (top)) - #("l-*-31296" - "l-*-31297" - "l-*-31298")) + #("l-*-38690" + "l-*-38691" + "l-*-38692")) #(ribcage #(e m1 m2) #((top) (top) (top)) - #("l-*-31286" - "l-*-31287" - "l-*-31288")) + #("l-*-38680" + "l-*-38681" + "l-*-38682")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("l-*-31283"))) + #("l-*-38677")) + #(ribcage + (case) + ((top)) + (((hygiene guile) + . + #(syntax-object + case + ((top)) + (hygiene + guile)))))) (hygiene guile)) - (cons e1-31405 - e2-31406)))) - tmp-31400) + (cons e1-38811 + e2-38812)))) + tmp-38806) (syntax-violation 'case "bad clause" - x-31337 - clause-31391))))) - (let ((tmp-31414 - (f-31388 - (car clauses-31392) - (cdr clauses-31392)))) - (let ((tmp-31417 + x-38731 + clause-38797))))) + (let ((tmp-38820 + (f-38794 + (car clauses-38798) + (cdr clauses-38798)))) + (let ((tmp-38823 ($sc-dispatch - clause-31391 + clause-38797 '(each-any any . each-any)))) - (if tmp-31417 + (if tmp-38823 (@apply - (lambda (k-31421 e1-31422 e2-31423) + (lambda (k-38827 e1-38828 e2-38829) (list '#(syntax-object if ((top) #(ribcage #(k e1 e2) #((top) (top) (top)) - #("l-*-31327" - "l-*-31328" - "l-*-31329")) + #("l-*-38721" + "l-*-38722" + "l-*-38723")) #(ribcage () () ()) #(ribcage #(rest) #((top)) - #("l-*-31323")) + #("l-*-38717")) #(ribcage () () ()) #(ribcage #(f clause clauses) #((top) (top) (top)) - #("l-*-31296" - "l-*-31297" - "l-*-31298")) + #("l-*-38690" + "l-*-38691" + "l-*-38692")) #(ribcage #(e m1 m2) #((top) (top) (top)) - #("l-*-31286" - "l-*-31287" - "l-*-31288")) + #("l-*-38680" + "l-*-38681" + "l-*-38682")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("l-*-31283"))) + #("l-*-38677")) + #(ribcage + (case) + ((top)) + (((hygiene guile) + . + #(syntax-object + case + ((top)) + (hygiene guile)))))) (hygiene guile)) (list '#(syntax-object memv @@ -25937,32 +22464,42 @@ #(ribcage #(k e1 e2) #((top) (top) (top)) - #("l-*-31327" - "l-*-31328" - "l-*-31329")) + #("l-*-38721" + "l-*-38722" + "l-*-38723")) #(ribcage () () ()) #(ribcage #(rest) #((top)) - #("l-*-31323")) + #("l-*-38717")) #(ribcage () () ()) #(ribcage #(f clause clauses) #((top) (top) (top)) - #("l-*-31296" - "l-*-31297" - "l-*-31298")) + #("l-*-38690" + "l-*-38691" + "l-*-38692")) #(ribcage #(e m1 m2) #((top) (top) (top)) - #("l-*-31286" - "l-*-31287" - "l-*-31288")) + #("l-*-38680" + "l-*-38681" + "l-*-38682")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("l-*-31283"))) + #("l-*-38677")) + #(ribcage + (case) + ((top)) + (((hygiene guile) + . + #(syntax-object + case + ((top)) + (hygiene + guile)))))) (hygiene guile)) '#(syntax-object t @@ -25970,32 +22507,42 @@ #(ribcage #(k e1 e2) #((top) (top) (top)) - #("l-*-31327" - "l-*-31328" - "l-*-31329")) + #("l-*-38721" + "l-*-38722" + "l-*-38723")) #(ribcage () () ()) #(ribcage #(rest) #((top)) - #("l-*-31323")) + #("l-*-38717")) #(ribcage () () ()) #(ribcage #(f clause clauses) #((top) (top) (top)) - #("l-*-31296" - "l-*-31297" - "l-*-31298")) + #("l-*-38690" + "l-*-38691" + "l-*-38692")) #(ribcage #(e m1 m2) #((top) (top) (top)) - #("l-*-31286" - "l-*-31287" - "l-*-31288")) + #("l-*-38680" + "l-*-38681" + "l-*-38682")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("l-*-31283"))) + #("l-*-38677")) + #(ribcage + (case) + ((top)) + (((hygiene guile) + . + #(syntax-object + case + ((top)) + (hygiene + guile)))))) (hygiene guile)) (list '#(syntax-object quote @@ -26005,9 +22552,9 @@ #((top) (top) (top)) - #("l-*-31327" - "l-*-31328" - "l-*-31329")) + #("l-*-38721" + "l-*-38722" + "l-*-38723")) #(ribcage () () @@ -26015,7 +22562,7 @@ #(ribcage #(rest) #((top)) - #("l-*-31323")) + #("l-*-38717")) #(ribcage () () @@ -26027,17 +22574,17 @@ #((top) (top) (top)) - #("l-*-31296" - "l-*-31297" - "l-*-31298")) + #("l-*-38690" + "l-*-38691" + "l-*-38692")) #(ribcage #(e m1 m2) #((top) (top) (top)) - #("l-*-31286" - "l-*-31287" - "l-*-31288")) + #("l-*-38680" + "l-*-38681" + "l-*-38682")) #(ribcage () () @@ -26045,63 +22592,93 @@ #(ribcage #(x) #((top)) - #("l-*-31283"))) + #("l-*-38677")) + #(ribcage + (case) + ((top)) + (((hygiene + guile) + . + #(syntax-object + case + ((top)) + (hygiene + guile)))))) (hygiene guile)) - k-31421)) + k-38827)) (cons '#(syntax-object begin ((top) #(ribcage #(k e1 e2) #((top) (top) (top)) - #("l-*-31327" - "l-*-31328" - "l-*-31329")) + #("l-*-38721" + "l-*-38722" + "l-*-38723")) #(ribcage () () ()) #(ribcage #(rest) #((top)) - #("l-*-31323")) + #("l-*-38717")) #(ribcage () () ()) #(ribcage #(f clause clauses) #((top) (top) (top)) - #("l-*-31296" - "l-*-31297" - "l-*-31298")) + #("l-*-38690" + "l-*-38691" + "l-*-38692")) #(ribcage #(e m1 m2) #((top) (top) (top)) - #("l-*-31286" - "l-*-31287" - "l-*-31288")) + #("l-*-38680" + "l-*-38681" + "l-*-38682")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("l-*-31283"))) + #("l-*-38677")) + #(ribcage + (case) + ((top)) + (((hygiene guile) + . + #(syntax-object + case + ((top)) + (hygiene + guile)))))) (hygiene guile)) - (cons e1-31422 e2-31423)) - tmp-31414)) - tmp-31417) + (cons e1-38828 e2-38829)) + tmp-38820)) + tmp-38823) (syntax-violation 'case "bad clause" - x-31337 - clause-31391)))))))) - (f-31388 m1-31344 m2-31345)))) - (let ((body-31347 tmp-31346)) + x-38731 + clause-38797)))))))) + (f-38794 m1-38738 m2-38739)))) + (let ((body-38741 tmp-38740)) (list '#(syntax-object let ((top) #(ribcage () () ()) - #(ribcage #(body) #((top)) #("l-*-31294")) + #(ribcage #(body) #((top)) #("l-*-38688")) #(ribcage #(e m1 m2) #((top) (top) (top)) - #("l-*-31286" "l-*-31287" "l-*-31288")) + #("l-*-38680" "l-*-38681" "l-*-38682")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-31283"))) + #(ribcage #(x) #((top)) #("l-*-38677")) + #(ribcage + (case) + ((top)) + (((hygiene guile) + . + #(syntax-object + case + ((top)) + (hygiene guile)))))) (hygiene guile)) (list (list '#(syntax-object t @@ -26110,122 +22687,218 @@ #(ribcage #(body) #((top)) - #("l-*-31294")) + #("l-*-38688")) #(ribcage #(e m1 m2) #((top) (top) (top)) - #("l-*-31286" - "l-*-31287" - "l-*-31288")) + #("l-*-38680" + "l-*-38681" + "l-*-38682")) #(ribcage () () ()) + #(ribcage #(x) #((top)) #("l-*-38677")) #(ribcage - #(x) - #((top)) - #("l-*-31283"))) + (case) + ((top)) + (((hygiene guile) + . + #(syntax-object + case + ((top)) + (hygiene guile)))))) (hygiene guile)) - e-31343)) - body-31347)))) - tmp-31339) + e-38737)) + body-38741)))) + tmp-38733) (syntax-violation #f "source expression failed to match any pattern" - x-31337)))))) + x-38731)))))) (define make-variable-transformer - (lambda (proc-31441) - (if (procedure? proc-31441) + (lambda (proc-38848) + (if (procedure? proc-38848) (letrec* - ((trans-31442 - (lambda (x-31448) (proc-31441 x-31448)))) + ((trans-38849 + (lambda (x-38851) (proc-38848 x-38851)))) (begin (set-procedure-property! - trans-31442 + trans-38849 'variable-transformer #t) - trans-31442)) + trans-38849)) (error "variable transformer not a procedure" - proc-31441)))) + proc-38848)))) (define identifier-syntax (make-syntax-transformer 'identifier-syntax 'macro - (lambda (x-31480) - (let ((tmp-31482 ($sc-dispatch x-31480 '(_ any)))) - (if tmp-31482 + (lambda (x-38888) + (let ((tmp-38890 ($sc-dispatch x-38888 '(_ any)))) + (if tmp-38890 (@apply - (lambda (e-31486) + (lambda (e-38894) (list '#(syntax-object lambda ((top) - #(ribcage #(e) #((top)) #("l-*-31455")) + #(ribcage #(e) #((top)) #("l-*-38863")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-31452"))) + #(ribcage #(x) #((top)) #("l-*-38860")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) '(#(syntax-object x ((top) - #(ribcage #(e) #((top)) #("l-*-31455")) + #(ribcage #(e) #((top)) #("l-*-38863")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-31452"))) + #(ribcage #(x) #((top)) #("l-*-38860")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile))) '#((#(syntax-object macro-type ((top) - #(ribcage #(e) #((top)) #("l-*-31455")) + #(ribcage #(e) #((top)) #("l-*-38863")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-31452"))) + #(ribcage #(x) #((top)) #("l-*-38860")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) . #(syntax-object identifier-syntax ((top) - #(ribcage #(e) #((top)) #("l-*-31455")) + #(ribcage #(e) #((top)) #("l-*-38863")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-31452"))) + #(ribcage #(x) #((top)) #("l-*-38860")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)))) (list '#(syntax-object syntax-case ((top) - #(ribcage #(e) #((top)) #("l-*-31455")) + #(ribcage #(e) #((top)) #("l-*-38863")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-31452"))) + #(ribcage #(x) #((top)) #("l-*-38860")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) '#(syntax-object x ((top) - #(ribcage #(e) #((top)) #("l-*-31455")) + #(ribcage #(e) #((top)) #("l-*-38863")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-31452"))) + #(ribcage #(x) #((top)) #("l-*-38860")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) '() (list '#(syntax-object id ((top) - #(ribcage #(e) #((top)) #("l-*-31455")) + #(ribcage #(e) #((top)) #("l-*-38863")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-31452"))) + #(ribcage #(x) #((top)) #("l-*-38860")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) '(#(syntax-object identifier? ((top) - #(ribcage #(e) #((top)) #("l-*-31455")) + #(ribcage #(e) #((top)) #("l-*-38863")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-31452"))) + #(ribcage #(x) #((top)) #("l-*-38860")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) (#(syntax-object syntax ((top) - #(ribcage #(e) #((top)) #("l-*-31455")) + #(ribcage #(e) #((top)) #("l-*-38863")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-31452"))) + #(ribcage #(x) #((top)) #("l-*-38860")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) #(syntax-object id ((top) - #(ribcage #(e) #((top)) #("l-*-31455")) + #(ribcage #(e) #((top)) #("l-*-38863")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-31452"))) + #(ribcage #(x) #((top)) #("l-*-38860")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)))) (list '#(syntax-object syntax @@ -26233,34 +22906,70 @@ #(ribcage #(e) #((top)) - #("l-*-31455")) + #("l-*-38863")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("l-*-31452"))) + #("l-*-38860")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) - e-31486)) + e-38894)) (list '(#(syntax-object _ ((top) - #(ribcage #(e) #((top)) #("l-*-31455")) + #(ribcage #(e) #((top)) #("l-*-38863")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-31452"))) + #(ribcage #(x) #((top)) #("l-*-38860")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) #(syntax-object x ((top) - #(ribcage #(e) #((top)) #("l-*-31455")) + #(ribcage #(e) #((top)) #("l-*-38863")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-31452"))) + #(ribcage #(x) #((top)) #("l-*-38860")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) #(syntax-object ... ((top) - #(ribcage #(e) #((top)) #("l-*-31455")) + #(ribcage #(e) #((top)) #("l-*-38863")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-31452"))) + #(ribcage #(x) #((top)) #("l-*-38860")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile))) (list '#(syntax-object syntax @@ -26268,26 +22977,44 @@ #(ribcage #(e) #((top)) - #("l-*-31455")) + #("l-*-38863")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("l-*-31452"))) + #("l-*-38860")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) - (cons e-31486 + (cons e-38894 '(#(syntax-object x ((top) #(ribcage #(e) #((top)) - #("l-*-31455")) + #("l-*-38863")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("l-*-31452"))) + #("l-*-38860")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) #(syntax-object ... @@ -26295,59 +23022,86 @@ #(ribcage #(e) #((top)) - #("l-*-31455")) + #("l-*-38863")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("l-*-31452"))) + #("l-*-38860")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile))))))))) - tmp-31482) - (let ((tmp-31487 + tmp-38890) + (let ((tmp-38895 ($sc-dispatch - x-31480 + x-38888 '(_ (any any) ((#(free-id #(syntax-object set! ((top) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-31452"))) + #(ribcage #(x) #((top)) #("l-*-38860")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile))) any any) any))))) - (if (if tmp-31487 + (if (if tmp-38895 (@apply - (lambda (id-31491 - exp1-31492 - var-31493 - val-31494 - exp2-31495) - (if (identifier? id-31491) - (identifier? var-31493) + (lambda (id-38899 + exp1-38900 + var-38901 + val-38902 + exp2-38903) + (if (identifier? id-38899) + (identifier? var-38901) #f)) - tmp-31487) + tmp-38895) #f) (@apply - (lambda (id-31496 - exp1-31497 - var-31498 - val-31499 - exp2-31500) + (lambda (id-38904 + exp1-38905 + var-38906 + val-38907 + exp2-38908) (list '#(syntax-object make-variable-transformer ((top) #(ribcage #(id exp1 var val exp2) #((top) (top) (top) (top) (top)) - #("l-*-31470" - "l-*-31471" - "l-*-31472" - "l-*-31473" - "l-*-31474")) + #("l-*-38878" + "l-*-38879" + "l-*-38880" + "l-*-38881" + "l-*-38882")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-31452"))) + #(ribcage #(x) #((top)) #("l-*-38860")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) (list '#(syntax-object lambda @@ -26355,13 +23109,22 @@ #(ribcage #(id exp1 var val exp2) #((top) (top) (top) (top) (top)) - #("l-*-31470" - "l-*-31471" - "l-*-31472" - "l-*-31473" - "l-*-31474")) + #("l-*-38878" + "l-*-38879" + "l-*-38880" + "l-*-38881" + "l-*-38882")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-31452"))) + #(ribcage #(x) #((top)) #("l-*-38860")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) '(#(syntax-object x @@ -26369,13 +23132,22 @@ #(ribcage #(id exp1 var val exp2) #((top) (top) (top) (top) (top)) - #("l-*-31470" - "l-*-31471" - "l-*-31472" - "l-*-31473" - "l-*-31474")) + #("l-*-38878" + "l-*-38879" + "l-*-38880" + "l-*-38881" + "l-*-38882")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-31452"))) + #(ribcage #(x) #((top)) #("l-*-38860")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile))) '#((#(syntax-object macro-type @@ -26383,13 +23155,22 @@ #(ribcage #(id exp1 var val exp2) #((top) (top) (top) (top) (top)) - #("l-*-31470" - "l-*-31471" - "l-*-31472" - "l-*-31473" - "l-*-31474")) + #("l-*-38878" + "l-*-38879" + "l-*-38880" + "l-*-38881" + "l-*-38882")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-31452"))) + #(ribcage #(x) #((top)) #("l-*-38860")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) . #(syntax-object @@ -26398,13 +23179,22 @@ #(ribcage #(id exp1 var val exp2) #((top) (top) (top) (top) (top)) - #("l-*-31470" - "l-*-31471" - "l-*-31472" - "l-*-31473" - "l-*-31474")) + #("l-*-38878" + "l-*-38879" + "l-*-38880" + "l-*-38881" + "l-*-38882")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-31452"))) + #(ribcage #(x) #((top)) #("l-*-38860")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)))) (list '#(syntax-object syntax-case @@ -26412,16 +23202,22 @@ #(ribcage #(id exp1 var val exp2) #((top) (top) (top) (top) (top)) - #("l-*-31470" - "l-*-31471" - "l-*-31472" - "l-*-31473" - "l-*-31474")) + #("l-*-38878" + "l-*-38879" + "l-*-38880" + "l-*-38881" + "l-*-38882")) #(ribcage () () ()) + #(ribcage #(x) #((top)) #("l-*-38860")) #(ribcage - #(x) - #((top)) - #("l-*-31452"))) + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) '#(syntax-object x @@ -26429,16 +23225,22 @@ #(ribcage #(id exp1 var val exp2) #((top) (top) (top) (top) (top)) - #("l-*-31470" - "l-*-31471" - "l-*-31472" - "l-*-31473" - "l-*-31474")) + #("l-*-38878" + "l-*-38879" + "l-*-38880" + "l-*-38881" + "l-*-38882")) #(ribcage () () ()) + #(ribcage #(x) #((top)) #("l-*-38860")) #(ribcage - #(x) - #((top)) - #("l-*-31452"))) + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) '(#(syntax-object set! @@ -26446,16 +23248,25 @@ #(ribcage #(id exp1 var val exp2) #((top) (top) (top) (top) (top)) - #("l-*-31470" - "l-*-31471" - "l-*-31472" - "l-*-31473" - "l-*-31474")) + #("l-*-38878" + "l-*-38879" + "l-*-38880" + "l-*-38881" + "l-*-38882")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("l-*-31452"))) + #("l-*-38860")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile))) (list (list '#(syntax-object set! @@ -26467,19 +23278,28 @@ (top) (top) (top)) - #("l-*-31470" - "l-*-31471" - "l-*-31472" - "l-*-31473" - "l-*-31474")) + #("l-*-38878" + "l-*-38879" + "l-*-38880" + "l-*-38881" + "l-*-38882")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("l-*-31452"))) + #("l-*-38860")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) - var-31498 - val-31499) + var-38906 + val-38907) (list '#(syntax-object syntax ((top) @@ -26490,19 +23310,28 @@ (top) (top) (top)) - #("l-*-31470" - "l-*-31471" - "l-*-31472" - "l-*-31473" - "l-*-31474")) + #("l-*-38878" + "l-*-38879" + "l-*-38880" + "l-*-38881" + "l-*-38882")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("l-*-31452"))) + #("l-*-38860")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) - exp2-31500)) - (list (cons id-31496 + exp2-38908)) + (list (cons id-38904 '(#(syntax-object x ((top) @@ -26513,16 +23342,25 @@ (top) (top) (top)) - #("l-*-31470" - "l-*-31471" - "l-*-31472" - "l-*-31473" - "l-*-31474")) + #("l-*-38878" + "l-*-38879" + "l-*-38880" + "l-*-38881" + "l-*-38882")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("l-*-31452"))) + #("l-*-38860")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) #(syntax-object ... @@ -26534,16 +23372,25 @@ (top) (top) (top)) - #("l-*-31470" - "l-*-31471" - "l-*-31472" - "l-*-31473" - "l-*-31474")) + #("l-*-38878" + "l-*-38879" + "l-*-38880" + "l-*-38881" + "l-*-38882")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("l-*-31452"))) + #("l-*-38860")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)))) (list '#(syntax-object syntax @@ -26555,18 +23402,27 @@ (top) (top) (top)) - #("l-*-31470" - "l-*-31471" - "l-*-31472" - "l-*-31473" - "l-*-31474")) + #("l-*-38878" + "l-*-38879" + "l-*-38880" + "l-*-38881" + "l-*-38882")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("l-*-31452"))) + #("l-*-38860")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) - (cons exp1-31497 + (cons exp1-38905 '(#(syntax-object x ((top) @@ -26581,16 +23437,26 @@ (top) (top) (top)) - #("l-*-31470" - "l-*-31471" - "l-*-31472" - "l-*-31473" - "l-*-31474")) + #("l-*-38878" + "l-*-38879" + "l-*-38880" + "l-*-38881" + "l-*-38882")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("l-*-31452"))) + #("l-*-38860")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene + guile)))))) (hygiene guile)) #(syntax-object ... @@ -26606,18 +23472,28 @@ (top) (top) (top)) - #("l-*-31470" - "l-*-31471" - "l-*-31472" - "l-*-31473" - "l-*-31474")) + #("l-*-38878" + "l-*-38879" + "l-*-38880" + "l-*-38881" + "l-*-38882")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("l-*-31452"))) + #("l-*-38860")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene + guile)))))) (hygiene guile)))))) - (list id-31496 + (list id-38904 (list '#(syntax-object identifier? ((top) @@ -26628,16 +23504,25 @@ (top) (top) (top)) - #("l-*-31470" - "l-*-31471" - "l-*-31472" - "l-*-31473" - "l-*-31474")) + #("l-*-38878" + "l-*-38879" + "l-*-38880" + "l-*-38881" + "l-*-38882")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("l-*-31452"))) + #("l-*-38860")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) (list '#(syntax-object syntax @@ -26653,18 +23538,28 @@ (top) (top) (top)) - #("l-*-31470" - "l-*-31471" - "l-*-31472" - "l-*-31473" - "l-*-31474")) + #("l-*-38878" + "l-*-38879" + "l-*-38880" + "l-*-38881" + "l-*-38882")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("l-*-31452"))) + #("l-*-38860")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene + guile)))))) (hygiene guile)) - id-31496)) + id-38904)) (list '#(syntax-object syntax ((top) @@ -26675,69 +23570,96 @@ (top) (top) (top)) - #("l-*-31470" - "l-*-31471" - "l-*-31472" - "l-*-31473" - "l-*-31474")) + #("l-*-38878" + "l-*-38879" + "l-*-38880" + "l-*-38881" + "l-*-38882")) #(ribcage () () ()) #(ribcage #(x) #((top)) - #("l-*-31452"))) + #("l-*-38860")) + #(ribcage + (identifier-syntax) + ((top)) + (((hygiene guile) + . + #(syntax-object + identifier-syntax + ((top)) + (hygiene guile)))))) (hygiene guile)) - exp1-31497)))))) - tmp-31487) + exp1-38905)))))) + tmp-38895) (syntax-violation #f "source expression failed to match any pattern" - x-31480)))))))) + x-38888)))))))) (define define* (make-syntax-transformer 'define* 'macro - (lambda (x-31532) - (let ((tmp-31534 + (lambda (x-38941) + (let ((tmp-38943 ($sc-dispatch - x-31532 + x-38941 '(_ (any . any) any . each-any)))) - (if tmp-31534 + (if tmp-38943 (@apply - (lambda (id-31538 args-31539 b0-31540 b1-31541) + (lambda (id-38947 args-38948 b0-38949 b1-38950) (list '#(syntax-object define ((top) #(ribcage #(id args b0 b1) #((top) (top) (top) (top)) - #("l-*-31514" - "l-*-31515" - "l-*-31516" - "l-*-31517")) + #("l-*-38923" + "l-*-38924" + "l-*-38925" + "l-*-38926")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-31511"))) + #(ribcage #(x) #((top)) #("l-*-38920")) + #(ribcage + (define*) + ((top)) + (((hygiene guile) + . + #(syntax-object + define* + ((top)) + (hygiene guile)))))) (hygiene guile)) - id-31538 + id-38947 (cons '#(syntax-object lambda* ((top) #(ribcage #(id args b0 b1) #((top) (top) (top) (top)) - #("l-*-31514" - "l-*-31515" - "l-*-31516" - "l-*-31517")) + #("l-*-38923" + "l-*-38924" + "l-*-38925" + "l-*-38926")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-31511"))) + #(ribcage #(x) #((top)) #("l-*-38920")) + #(ribcage + (define*) + ((top)) + (((hygiene guile) + . + #(syntax-object + define* + ((top)) + (hygiene guile)))))) (hygiene guile)) - (cons args-31539 (cons b0-31540 b1-31541))))) - tmp-31534) - (let ((tmp-31542 ($sc-dispatch x-31532 '(_ any any)))) - (if (if tmp-31542 + (cons args-38948 (cons b0-38949 b1-38950))))) + tmp-38943) + (let ((tmp-38951 ($sc-dispatch x-38941 '(_ any any)))) + (if (if tmp-38951 (@apply - (lambda (id-31546 val-31547) + (lambda (id-38955 val-38956) (identifier? '#(syntax-object x @@ -26745,29 +23667,47 @@ #(ribcage #(id val) #((top) (top)) - #("l-*-31524" "l-*-31525")) + #("l-*-38933" "l-*-38934")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-31511"))) + #(ribcage #(x) #((top)) #("l-*-38920")) + #(ribcage + (define*) + ((top)) + (((hygiene guile) + . + #(syntax-object + define* + ((top)) + (hygiene guile)))))) (hygiene guile)))) - tmp-31542) + tmp-38951) #f) (@apply - (lambda (id-31548 val-31549) + (lambda (id-38957 val-38958) (list '#(syntax-object define ((top) #(ribcage #(id val) #((top) (top)) - #("l-*-31528" "l-*-31529")) + #("l-*-38937" "l-*-38938")) #(ribcage () () ()) - #(ribcage #(x) #((top)) #("l-*-31511"))) + #(ribcage #(x) #((top)) #("l-*-38920")) + #(ribcage + (define*) + ((top)) + (((hygiene guile) + . + #(syntax-object + define* + ((top)) + (hygiene guile)))))) (hygiene guile)) - id-31548 - val-31549)) - tmp-31542) + id-38957 + val-38958)) + tmp-38951) (syntax-violation #f "source expression failed to match any pattern" - x-31532)))))))) + x-38941)))))))) diff --git a/module/ice-9/psyntax.scm b/module/ice-9/psyntax.scm index 728ab1254..428b583ae 100644 --- a/module/ice-9/psyntax.scm +++ b/module/ice-9/psyntax.scm @@ -316,9 +316,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) @@ -405,12 +405,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)) @@ -418,7 +420,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) @@ -439,8 +441,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) @@ -488,13 +490,14 @@ ;; 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 @@ -566,22 +569,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))) @@ -741,51 +732,86 @@ (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))))) @@ -840,19 +866,31 @@ ;; Returns three values: binding type, binding value, the module (for ;; resolving toplevel vars). - (define (resolve-identifier id w r mod) + (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 (or (get-global-definition-hook var mod) - (make-binding 'global)))) + (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 (or (assq-ref r label) - (make-binding 'displaced-lexical)))) + (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))) + (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) @@ -877,9 +915,39 @@ (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)) @@ -970,161 +1038,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 form 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 define-syntax-parameter-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" - (source-wrap form w s mod) - (wrap value w mod))) - (else - (syntax-violation #f "cannot define keyword at top level" - (source-wrap form w s mod) - (wrap value w mod)))))) - (else - (values (cons - (if (eq? m 'c&e) - (let ((x (expand-expr type value form e r w s mod))) - (top-level-eval-hook x mod) - x) - (lambda () - (expand-expr type value form 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 form 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 form e r w s mod))) + (top-level-eval-hook x mod) + (lambda () x)) + (lambda () + (expand-expr type value form 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) @@ -1178,18 +1256,19 @@ (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 e w s mod)) - ((global) (values type n e e w s mod)) - ((macro) - (if for-car? - (values type (binding-value b) e 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 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 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 e value w s mod*)) + (else (values type value e e w s mod)))))) ((pair? e) (let ((first (car e))) (call-with-values @@ -1281,7 +1360,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) @@ -1290,7 +1369,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) @@ -1301,18 +1380,13 @@ 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)) ((_) - (if (include-deprecated-features) - (begin - (issue-deprecation-warning - "Sequences of zero expressions are deprecated. Use *unspecified*.") - (expand-void)) - (syntax-violation #f "sequence of zero expressions" - (source-wrap e w s mod)))))) + (syntax-violation #f "sequence of zero expressions" + (source-wrap e w s mod))))) ((local-syntax-form) (expand-local-syntax value e r w s mod expand-sequence)) ((eval-when-form) @@ -1334,12 +1408,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) ;; @@ -1364,7 +1438,7 @@ ;; ;; The only wrinkle is when we want a macro to expand to code in another ;; module, as is the case for the r6rs `library' form -- the body expressions - ;; should be scoped relative the new module, the one defined by the macro. + ;; should be scoped relative the the new module, the one defined by the macro. ;; For that, use `(@@ mod-name body)'. ;; ;; Part of the macro output will be from the site of the macro use and part @@ -1485,7 +1559,11 @@ (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 () @@ -1520,7 +1598,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) @@ -1530,6 +1608,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))) @@ -1856,38 +1936,45 @@ (global-extend 'local-syntax 'letrec-syntax #t) (global-extend 'local-syntax 'let-syntax #f) - (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) (id-var-name x w)) #'(var ...)))) - (for-each - (lambda (id n) - (case (binding-type (lookup n r mod)) - ((displaced-lexical) - (syntax-violation 'syntax-parameterize - "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 'syntax-parameterize "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) @@ -1896,167 +1983,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) @@ -2191,58 +2277,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 formform 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* 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) @@ -2391,20 +2472,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) @@ -2419,36 +2501,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) @@ -2458,18 +2536,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) @@ -2486,14 +2564,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 @@ -2577,7 +2655,10 @@ (syntax-object-expression id) (strip-anti-mark (syntax-object-wrap id)) r - (syntax-object-module id))) + (syntax-object-module id) + ;; FIXME: come up with a better policy for + ;; resolve-syntax-parameters + #t)) (lambda (type value mod) (case type ((lexical) (values 'lexical value)) @@ -2785,7 +2866,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)) @@ -2795,7 +2876,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 777507c76..04687a8c9 100644 --- a/module/language/tree-il/analyze.scm +++ b/module/language/tree-il/analyze.scm @@ -180,10 +180,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))) @@ -222,13 +225,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 @@ -339,8 +337,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)))) @@ -367,9 +367,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))) @@ -385,8 +388,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 @@ -509,8 +513,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)))) @@ -866,7 +872,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) @@ -927,7 +933,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 @@ -965,12 +971,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) @@ -1030,8 +1036,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? @@ -1118,7 +1124,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) @@ -1178,9 +1184,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) @@ -1195,7 +1201,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))) @@ -1346,7 +1352,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")'. @@ -1433,17 +1439,17 @@ 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))) (if (or (and (eq? proc (@ (guile) simple-format)) (check-simple-format-args args (or src (find pair? locs)))) (eq? proc (@ (ice-9 format) format))) (check-format-args args (or src (find pair? locs)))))) - (($ <application> src ($ <module-ref> _ '(ice-9 format) 'format) args) + (($ <call> src ($ <module-ref> _ '(ice-9 format) 'format) args) (check-format-args args (or src (find pair? locs)))) - (($ <application> src ($ <module-ref> _ '(guile) - (or 'format 'simple-format)) + (($ <call> src ($ <module-ref> _ '(guile) + (or 'format 'simple-format)) args) (and (check-simple-format-args args (or src (find pair? locs))) 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 a9f6df938..81defa167 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,199 +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)) - (else - ;; Taking advantage of unspecified order of evaluation of - ;; arguments. - (for-each comp-drop (cdr args)) - (comp-push (car args)) - (maybe-emit-return)))) - ((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) @@ -542,6 +358,157 @@ (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) + '()))) + (else + ;; Taking advantage of unspecified order of evaluation of + ;; arguments. + (for-each comp-drop (cdr args)) + (comp-push (car args)) + (maybe-emit-return)))) + ((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) @@ -550,54 +517,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)))) @@ -974,10 +920,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 @@ -986,14 +932,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)))) @@ -1002,7 +948,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))) @@ -1013,7 +959,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))) @@ -1021,7 +967,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 f387df193..f83d77e76 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 7aad3997a..9aac24cc1 100644 --- a/module/language/tree-il/peval.scm +++ b/module/language/tree-il/peval.scm @@ -108,9 +108,8 @@ (($ <primitive-ref>) #t) (($ <module-ref>) #t) (($ <toplevel-ref>) #t) - (($ <application> _ - ($ <primitive-ref> _ (? singly-valued-primitive?))) #t) - (($ <application> _ ($ <primitive-ref> _ 'values) (val)) #t) + (($ <primcall> _ (? singly-valued-primitive?)) #t) + (($ <primcall> _ 'values (val)) #t) (($ <lambda>) #t) (else #f))) @@ -118,9 +117,7 @@ "Discard all but the first value of X." (if (singly-valued-expression? x) x - (make-application (tree-il-src x) - (make-primitive-ref #f 'values) - (list x)))) + (make-primcall (tree-il-src x) 'values (list x)))) ;; Peval will do a one-pass analysis on the source program to determine ;; the set of assigned lexicals, and to identify unreferenced and @@ -318,7 +315,7 @@ (%set-operand-residual-value! op (match val - (($ <application> src ($ <primitive-ref> _ 'values) (first)) + (($ <primcall> src 'values (first)) ;; The continuation of a residualized binding does not need the ;; introduced `values' node, so undo the effects of truncation. first) @@ -386,18 +383,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)) @@ -445,7 +439,7 @@ top-level bindings from ENV and return the resulting expression." (define* (residualize-lexical op #:optional ctx val) (log 'residualize op) (set-operand-residualize?! op #t) - (if (memq ctx '(value values)) + (if (eq? ctx 'value) (set-operand-residual-value! op val)) (make-lexical-ref #f (var-name (operand-var op)) (operand-sym op))) @@ -461,15 +455,13 @@ top-level bindings from ENV and return the resulting expression." (values #t results)))) (lambda _ (values #f '())))) - (define (make-values src values) (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 (residualize-call) - (make-application src (make-primitive-ref #f name) args)) + (make-primcall src name args)) (cond ((every const? args) (let-values (((success? values) @@ -511,13 +503,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))) @@ -525,7 +516,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) @@ -551,20 +543,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 @@ -585,19 +574,20 @@ 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> _ 'values) exps) + (($ <primcall> _ 'values exps) (and (not (null? exps)) (every loop exps))) - (($ <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))) @@ -646,7 +636,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))) @@ -833,7 +823,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)))))) @@ -847,14 +837,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))))))) @@ -911,40 +901,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))) @@ -953,12 +913,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) @@ -993,17 +948,59 @@ 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 ($ <primitive-ref> _ 'values) exps) + (($ <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 'values exps) (cond ((null? exps) (if (eq? ctx 'effect) @@ -1015,113 +1012,109 @@ top-level bindings from ENV and return the resulting expression." ((value test effect) #t) (else (null? (cdr vals)))) (every singly-valued-expression? vals)) - (for-tail (make-sequence src (append (cdr vals) (list (car vals))))) - (make-application src (make-primitive-ref #f 'values) vals)))))) - (($ <application> src orig-proc orig-args) + (for-tail (list->seq src (append (cdr vals) (list (car vals))))) + (make-primcall src 'values vals)))))) + + (($ <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> _ (? (cut eq? <> '())))) + (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 (? (cut eq? <> '()))) - (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. @@ -1133,8 +1126,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 @@ -1171,8 +1163,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 @@ -1208,8 +1200,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)) @@ -1234,24 +1225,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 @@ -1263,8 +1247,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 23f5df5f4..f192c4fc3 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 0246a3303..c8dc3a7e4 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, +/* Copyright (C) 1999, 2000, 2001, 2003, 2004, 2006, 2008, 2010, 2011 * 2012 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or @@ -25,6 +25,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); @@ -56,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)); @@ -71,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)); @@ -80,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)); @@ -108,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 */ @@ -123,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/tests/asm-to-bytecode.test b/test-suite/tests/asm-to-bytecode.test index d36b33d2a..9a8178c70 100644 --- a/test-suite/tests/asm-to-bytecode.test +++ b/test-suite/tests/asm-to-bytecode.test @@ -136,7 +136,7 @@ ((@ (system foreign) sizeof) '*)) (define %objcode-cookie-size - (string-length "GOOF----LE-8-2.0")) + (string-length "GOOF----LE-8")) (define (test-target triplet endian word-size) (pass-if (format #f "target `~a' honored" triplet) @@ -169,7 +169,7 @@ #f))) (write-objcode (bytecode->objcode b) p) (let ((cookie (make-bytevector %objcode-cookie-size)) - (expected (format #f "GOOF----~a-~a-~a" + (expected (format #f "GOOF----~a-~a" (cond ((eq? endian (endianness little)) "LE") ((eq? endian (endianness big)) @@ -177,8 +177,7 @@ (else (error "unknown endianness" endian))) - word-size - (effective-version)))) + word-size))) (bytevector-copy! (get-objcode) 0 cookie 0 %objcode-cookie-size) (string=? (utf8->string cookie) expected))))))))) 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 8217a4156..c2b65a64c 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) + ;; Since `regexp-quote' uses string ports, and since it is used below ;; with non-ASCII characters, these ports must be Unicode-capable. (define-syntax with-unicode diff --git a/test-suite/tests/syntax.test b/test-suite/tests/syntax.test index fcc0349ba..5163bac00 100644 --- a/test-suite/tests/syntax.test +++ b/test-suite/tests/syntax.test @@ -799,7 +799,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 37cd386fe..0ab58c98a 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,38 +524,38 @@ (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))) ;; Testing `(values foo)' in push context with RA. (assert-tree-il->glil without-partial-evaluation - (apply (primitive cdr) - (letrec (lp) (#{lp ~V9KrhVD4PFEL6oCTrLg3A}#) - ((lambda ((name . lp)) - (lambda-case ((() #f #f #f () ()) - (apply (toplevel values) (const (one two))))))) - (apply (lexical lp #{lp ~V9KrhVD4PFEL6oCTrLg3A}#)))) + (primcall cdr + (letrec (lp) (#{lp ~V9KrhVD4PFEL6oCTrLg3A}#) + ((lambda ((name . lp)) + (lambda-case ((() #f #f #f () ()) + (primcall values (const (one two))))))) + (call (lexical lp #{lp ~V9KrhVD4PFEL6oCTrLg3A}#)))) (program () (std-prelude 0 0 #f) (label _) (branch br _) ;; entering the fix, jump to :2 ;; :1 body of lp, jump to :3 @@ -606,10 +603,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) @@ -617,7 +614,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) @@ -625,10 +622,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) @@ -636,8 +633,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) @@ -671,7 +668,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)) @@ -681,19 +678,19 @@ (+ a b)))) (const 3)) - (pass-if-peval resolve-primitives + (pass-if-peval ;; First order, multiple values. (let ((x 1) (y 2)) (values x y)) - (apply (primitive values) (const 1) (const 2))) + (primcall values (const 1) (const 2))) - (pass-if-peval resolve-primitives + (pass-if-peval ;; First order, multiple values truncated. (let ((x (values 1 'a)) (y 2)) (values x y)) - (apply (primitive values) (const 1) (const 2))) + (primcall values (const 1) (const 2))) - (pass-if-peval resolve-primitives + (pass-if-peval ;; First order, multiple values truncated. (or (values 1 2) 3) (const 1)) @@ -701,23 +698,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 @@ -742,10 +739,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. #; @@ -766,15 +763,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 @@ -784,21 +781,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 @@ -808,7 +805,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) @@ -821,7 +818,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' @@ -832,14 +829,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 @@ -848,10 +844,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 @@ -860,9 +856,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 @@ -872,8 +868,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. @@ -885,28 +881,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. @@ -917,7 +913,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. @@ -927,22 +923,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. @@ -952,15 +948,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. @@ -972,7 +975,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. @@ -991,8 +994,8 @@ (foo) x) (let (x) (_) ((toplevel top)) - (begin - (apply (toplevel foo)) + (seq + (call (toplevel foo)) (lexical x _)))) (pass-if-peval @@ -1031,8 +1034,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). @@ -1054,7 +1057,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. @@ -1065,7 +1068,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) @@ -1077,7 +1080,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, @@ -1088,24 +1091,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)))) @@ -1125,8 +1131,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. @@ -1147,9 +1153,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 @@ -1157,11 +1163,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))) @@ -1171,7 +1177,7 @@ (case foo (() 'a) (else 'b)) - (if (begin (toplevel foo) (const #f)) + (if (seq (toplevel foo) (const #f)) (const a) (const b))) @@ -1185,12 +1191,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. @@ -1198,7 +1204,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 () ()) @@ -1209,12 +1215,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. @@ -1226,16 +1233,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)) @@ -1243,9 +1250,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 @@ -1254,8 +1261,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. @@ -1263,7 +1270,7 @@ (set! x 3) x) (let (x) (_) ((const 2)) - (begin + (seq (set! (lexical x _) (const 3)) (lexical x _)))) @@ -1276,8 +1283,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 @@ -1293,9 +1300,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 @@ -1306,10 +1313,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. @@ -1318,8 +1325,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. @@ -1334,10 +1341,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. @@ -1354,7 +1361,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. @@ -1364,10 +1371,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? @@ -1404,7 +1411,7 @@ ((lambda _ (lambda-case ((() #f #f #f () ()) - (apply (lexical a _))))) + (call (lexical a _))))) (lambda _ (lambda-case (((x) #f #f #f () (_)) @@ -1412,12 +1419,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 @@ -1426,20 +1432,20 @@ (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 of #nil does not make list (cons 1 #nil) - (apply (primitive cons) (const 1) (const '#nil))) + (primcall cons (const 1) (const '#nil))) (pass-if-peval ;; Constant folding: cons @@ -1449,7 +1455,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 @@ -1469,12 +1475,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 @@ -1484,40 +1490,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 @@ -1526,7 +1535,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 @@ -1535,7 +1543,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. @@ -1548,9 +1555,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 _))))) @@ -1584,9 +1591,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 |