I see that a patch has been committed. It is conflicting with another patch of mine and it does not follow from the srfi-1 specification. To wit: Most procedures are defined only on proper lists -- that is, finite, nil-terminated lists. The procedures that will also handle circular or dotted lists are specifically marked. While this design decision restricts the domain of possible arguments one can pass to these procedures, it has the benefit of allowing the procedures to catch the error cases where programmers inadvertently pass scalar values to a list procedure by accident, e.g., by switching the arguments to a procedure call. Note "allowing to catch". Then we have Errors Note that statements of the form "it is an error" merely mean "don't do that." They are not a guarantee that a conforming implementation will "catch" such improper use by, for example, raising some kind of exception. Regrettably, R5RS Scheme requires no firmer guarantee even for basic operators such as car and cdr, so there's little point in requiring these procedures to do more. Here is the relevant section of the R5RS: When speaking of an error situation, this report uses the phrase "an error is signalled" to indicate that implementations must detect and report the error. If such wording does not appear in the discussion of an error, then implementations are not required to detect or report the error, though they are encouraged to do so. An error situation that implementations are not required to detect is usually referred to simply as "an error." For example, it is an error for a procedure to be passed an argument that the procedure is not explicitly specified to handle, even though such domain errors are seldom mentioned in this report. Implementations may extend a procedure's domain of definition to include such arguments. So let's see how we have defined stuff here: list A proper (finite, nil-terminated) list clist A proper or circular list flist A finite (proper or dotted) list For length+, we have length list -> integer length+ clist -> integer or #f Both length and length+ return the length of the argument. It is an error to pass a value to length which is not a proper list (finite and nil-terminated). In particular, this means an implementation may diverge or signal an error when length is applied to a circular list. length+, on the other hand, returns #F when applied to a circular list. The length of a proper list is a non-negative integer n such that cdr applied n times to the list produces the empty list. So the behavior for length+ on a dotted list is strictly unspecified. It is not even stated "it is an error". Functions like fold state: fold kons knil clist1 clist2 ... -> value The fold operation terminates when the shortest list runs out of values: (fold cons* '() '(a b c) '(1 2 3 4 5)) => (c 3 b 2 a 1) At least one of the list arguments must be finite. Note the wording: "at least one of the list arguments must be finite", not "at least one of the list arguments must be proper". The definition of the recursion for the single-list case again leaves the case of a dotted list unspecified. If we take a look at the reference implementation at , we get (define (length+ x) ; Returns #f if X is circular. (let lp ((x x) (lag x) (len 0)) (if (pair? x) (let ((x (cdr x)) (len (+ len 1))) (if (pair? x) (let ((x (cdr x)) (lag (cdr lag)) (len (+ len 1))) (and (not (eq? x lag)) (lp x lag len))) len)) len))) which _clearly_ treats dotted lists like regular lists with regard to giving the length of the spine. Incidentally, the reference implementation also contains ;;; R4RS, so commented out. ;(define (length x) ; LENGTH may diverge or ; (let lp ((x x) (len 0)) ; raise an error if X is ; (if (pair? x) ; a circular list. This version ; (lp (cdr x) (+ len 1)) ; diverges. ; len))) which again would work on dotted lists just fine. But I am not all that interested in meddling with that. At any rate, what I am getting at is that I was going to submit the following patch as a part of a series fixing other bugs, bugs that I need a working "get the length of a dotted list" operator for. We don't have any such operator in GUILE, and that's awkward.