diff options
Diffstat (limited to 'srfi/srfi-1.c')
-rw-r--r-- | srfi/srfi-1.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/srfi/srfi-1.c b/srfi/srfi-1.c index 8e27ab4e6..35815b32f 100644 --- a/srfi/srfi-1.c +++ b/srfi/srfi-1.c @@ -1,6 +1,6 @@ /* srfi-1.c --- SRFI-1 procedures for Guile * - * Copyright (C) 1995, 1996, 1997, 2000, 2001, 2002, 2003, 2005, 2006 + * Copyright (C) 1995, 1996, 1997, 2000, 2001, 2002, 2003, 2005, 2006, 2008 * Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or @@ -18,6 +18,10 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#if HAVE_CONFIG_H +# include <config.h> +#endif + #include <libguile.h> #include <libguile/lang.h> @@ -1663,6 +1667,7 @@ SCM_DEFINE (scm_srfi1_partition, "partition", 2, 0, 0, /* In this implementation, the output lists don't share memory with list, because it's probably not worth the effort. */ scm_t_trampoline_1 call = scm_trampoline_1(pred); + SCM orig_list = list; SCM kept = scm_cons(SCM_EOL, SCM_EOL); SCM kept_tail = kept; SCM dropped = scm_cons(SCM_EOL, SCM_EOL); @@ -1671,8 +1676,14 @@ SCM_DEFINE (scm_srfi1_partition, "partition", 2, 0, 0, SCM_ASSERT(call, pred, 2, FUNC_NAME); for (; !SCM_NULL_OR_NIL_P (list); list = SCM_CDR(list)) { - SCM elt = SCM_CAR(list); - SCM new_tail = scm_cons(SCM_CAR(list), SCM_EOL); + SCM elt, new_tail; + + /* Make sure LIST is not a dotted list. */ + SCM_ASSERT (scm_is_pair (list), orig_list, SCM_ARG2, FUNC_NAME); + + elt = SCM_CAR (list); + new_tail = scm_cons (SCM_CAR (list), SCM_EOL); + if (scm_is_true (call (pred, elt))) { SCM_SETCDR(kept_tail, new_tail); kept_tail = new_tail; |