guile-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] Avoid `SCM_VALIDATE_LIST ()'


From: Han-Wen Nienhuys
Subject: Re: [PATCH] Avoid `SCM_VALIDATE_LIST ()'
Date: Sun, 31 Aug 2008 21:12:10 -0300
User-agent: Thunderbird 2.0.0.16 (X11/20080723)

Ludovic Courtès escreveu:
> Hello,
> 
> This is a followup to this discussion:
> 
>   http://thread.gmane.org/gmane.lisp.guile.devel/7194
> 
> The attached patch changes several list-related functions so that they
> don't validate their input with `SCM_VALIDATE_LIST ()' since it's O(n).
> 
> A side-effect (besides performance improvements) is that all these
> functions will now happily traverse circular lists, and will silently
> deal with dotted lists.  This is acceptable behavior IMO.
> 
> Nevertheless, the second patch below implements the "tortoise and the
> hare" in `list-copy' so that it detects circular list; it seems
> worthwhile to check that here since `list-copy' would otherwise exhaust
> memory.
> 
> (Note that SRFI-1's `list-copy' *does* accept improper lists, including
> circular lists, although SRFI-1 does not explicitly mention that it
> should handle improper list.)
> 
> Also, in some cases, the `wrong-type-arg' message is different (but the
> exception key is the same).
> 
> OK to apply to both branches?

-  return scm_c_memq (x, lst);
+  for (; !SCM_NULL_OR_NIL_P (lst); lst = SCM_CDR (lst))
+    {
+      SCM_VALIDATE_CONS (2, lst);

Looks cleaner to use SCM_CONS_P (or whatever it is called) as loop guard,
so it is obviously correct, and crash if the lst is not properly terminated 
after the loop (- perhaps only if we're not compiling in optimizing mode).

On a tangent, is anyone still seriously considering to run Emacs atop GUILE?
(It looks a bit like a travesty if we're trying to accomodate elisp while
also trying to follow standards like SRFI-x and RxRS)  

-  SCM from_here;
+  SCM from_here, hare;

you could do the init to lst right here.  IMO it's neater not to have 
uninitialized
memory locations during program execution.

 ;;;; list.test --- tests guile's lists     -*- scheme -*-
-;;;; Copyright (C) 2000, 2001, 2006 Free Software Foundation, Inc.
+;;;; Copyright (C) 2000, 2001, 2006, 2008 Free Software Foundation, Inc.

Can we do this in one fell swoop, adding 2008 to all files?  After all 
publishing 
a commit is a release in some sense.  Then, we don't have to worry about the 
file
headers anymore.


-- 
 Han-Wen Nienhuys - address@hidden - http://www.xs4all.nl/~hanwen





reply via email to

[Prev in Thread] Current Thread [Next in Thread]