LINUX.ORG.RU

История изменений

Исправление monk, (текущая версия) :

Ну значит это зацикленные списки а не бесконечные, на них твоя функция вылетает

Проверки не делалось.

Тогда так

(defun my-length (list)
  (labels ((recurse (list result seen)
             (cond
               ((null list) result)
               ((gethash list seen) (error "It is not a proper list"))
               (t 
                 (setf (gethash list seen) t)
                 (recurse (cdr list) (1+ result) seen)))))
    (recurse list 0 (make-hash-table :test 'eq))))

Исходная версия monk, :

Ну значит это зацикленные списки а не бесконечные, на них твоя функция вылетает

Проверки не делалось.

Тогда так

(defun my-length (list)
  (if (listp list)
    (labels ((recurse (list result seen)
               (cond
                 ((null list) result)
                 ((gethash list seen) (error "It is not a proper list"))
                 (t 
                   (setf (gethash list seen) t)
                   (recurse (cdr list) (1+ result) seen)))))
      (recurse list 0 (make-hash-table :test 'eq)))
    (error "It is not a list")))