История изменений
Исправление 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")))