summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark H Weaver <mhw@netris.org>2014-06-04 20:42:21 -0400
committerMark H Weaver <mhw@netris.org>2014-06-04 20:42:21 -0400
commitfc8a90043bb8dc876cf638d9959348883c748fe3 (patch)
treeae260c73ec2a2b63ec5ae80cbea65648da1c44e0
parent4afca1a0662323ed8760c75d84c3aadc64b72908 (diff)
downloadguile-fc8a90043bb8dc876cf638d9959348883c748fe3.tar.gz
Optimize scm_ilength and 'length+'.
* libguile/list.c (scm_ilength): Test for SCM_NULL_OR_NIL_P only after testing scm_is_pair. Conform to GNU coding standards. * libguile/srfi-1.c (scm_srfi1_length_plus): Ditto.
-rw-r--r--libguile/list.c31
-rw-r--r--libguile/srfi-1.c22
2 files changed, 31 insertions, 22 deletions
diff --git a/libguile/list.c b/libguile/list.c
index 01f23c0f0..669f566d6 100644
--- a/libguile/list.c
+++ b/libguile/list.c
@@ -1,5 +1,5 @@
-/* Copyright (C) 1995,1996,1997,2000,2001,2003,2004,2008,2009,2010,2011
- * Free Software Foundation, Inc.
+/* Copyright (C) 1995-1997, 2000, 2001, 2003, 2004, 2008-2011,
+ * 2014 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
@@ -179,24 +179,25 @@ SCM_DEFINE (scm_list_p, "list?", 1, 0, 0,
long" lists (i.e. lists with cycles in their cdrs), and returns -1
if it does find one. */
long
-scm_ilength(SCM sx)
+scm_ilength (SCM sx)
{
long i = 0;
SCM tortoise = sx;
SCM hare = sx;
- do {
- if (SCM_NULL_OR_NIL_P(hare)) return i;
- if (!scm_is_pair (hare)) return -1;
- hare = SCM_CDR(hare);
- i++;
- if (SCM_NULL_OR_NIL_P(hare)) return i;
- if (!scm_is_pair (hare)) return -1;
- hare = SCM_CDR(hare);
- i++;
- /* For every two steps the hare takes, the tortoise takes one. */
- tortoise = SCM_CDR(tortoise);
- }
+ do
+ {
+ if (!scm_is_pair (hare))
+ return SCM_NULL_OR_NIL_P (hare) ? i : -1;
+ hare = SCM_CDR (hare);
+ i++;
+ if (!scm_is_pair (hare))
+ return SCM_NULL_OR_NIL_P (hare) ? i : -1;
+ hare = SCM_CDR (hare);
+ i++;
+ /* For every two steps the hare takes, the tortoise takes one. */
+ tortoise = SCM_CDR (tortoise);
+ }
while (!scm_is_eq (hare, tortoise));
/* If the tortoise ever catches the hare, then the list must contain
diff --git a/libguile/srfi-1.c b/libguile/srfi-1.c
index fcbf80694..c0b7035fc 100644
--- a/libguile/srfi-1.c
+++ b/libguile/srfi-1.c
@@ -620,20 +620,28 @@ SCM_DEFINE (scm_srfi1_length_plus, "length+", 1, 0, 0,
do
{
- if (SCM_NULL_OR_NIL_P (hare))
- return scm_from_size_t (i);
if (!scm_is_pair (hare))
- scm_wrong_type_arg_msg (FUNC_NAME, 1, lst, "proper or circular list");
+ {
+ if (SCM_NULL_OR_NIL_P (hare))
+ return scm_from_size_t (i);
+ else
+ scm_wrong_type_arg_msg (FUNC_NAME, 1, lst,
+ "proper or circular list");
+ }
hare = SCM_CDR (hare);
i++;
- if (SCM_NULL_OR_NIL_P (hare))
- return scm_from_size_t (i);
if (!scm_is_pair (hare))
- scm_wrong_type_arg_msg (FUNC_NAME, 1, lst, "proper or circular list");
+ {
+ if (SCM_NULL_OR_NIL_P (hare))
+ return scm_from_size_t (i);
+ else
+ scm_wrong_type_arg_msg (FUNC_NAME, 1, lst,
+ "proper or circular list");
+ }
hare = SCM_CDR (hare);
i++;
/* For every two steps the hare takes, the tortoise takes one. */
- tortoise = SCM_CDR(tortoise);
+ tortoise = SCM_CDR (tortoise);
}
while (!scm_is_eq (hare, tortoise));