Skip to main content

list-length

list-length Function

Syntax:

list-length list → length

Arguments and Values:

list—a proper list or a circular list.

length—a non-negative integer , or nil.

Description:

Returns the length of list if list is a proper list. Returns nil if list is a circular list.

Examples:

(list-length(a b c d))4 
(list-length(a (b c) d))3
(list-length())0
(list-length nil)0
(defun circular-list (&rest elements)
(let ((cycle (copy-list elements)))
(nconc cycle cycle)))
(list-length (circular-list ’a ’b)) → NIL
(list-length (circular-list ’a)) → NIL
(list-length (circular-list))0

Exceptional Situations:

Should signal an error of type type-error if list is not a proper list or a circular list.

See Also:

length

Notes:

list-length could be implemented as follows:

(defun list-length (x)

(do ((n 0 (+ n 2)) ;Counter.

(fast x (cddr fast)) ;Fast pointer: leaps by 2.

(slow x (cdr slow))) ;Slow pointer: leaps by 1.

(nil)

;; If fast pointer hits the end, return the count.

(when (endp fast) (return n))

(when (endp (cdr fast)) (return (+ n 1)))

;; If fast pointer eventually equals slow pointer,

;; then we must be stuck in a circular list.

;; (A deeper property is the converse: if we are

;; stuck in a circular list, then eventually the

;; fast pointer will equal the slow pointer.

;; That fact justifies this implementation.)

(when (and (eq fast slow) (> n 0)) (return nil))))

Expanded Reference: list-length

tip

TODO: Please contribute to this page by adding explanations and examples

(list-length )