From fc8a90043bb8dc876cf638d9959348883c748fe3 Mon Sep 17 00:00:00 2001 From: Mark H Weaver Date: Wed, 4 Jun 2014 20:42:21 -0400 Subject: [PATCH] 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. --- libguile/list.c | 31 ++++++++++++++++--------------- libguile/srfi-1.c | 22 +++++++++++++++------- 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)); -- 2.20.1