История изменений
Исправление MOPKOBKA, (текущая версия) :
Ну значит это зацикленные списки а не бесконечные, на них твоя функция вылетает. Ошибку бы какую нибудь... Без сторонних функций типа fold.
(defun my-length (list)
(labels ((recurse (list result)
(if list (recurse (cdr list) (1+ result)) result)))
(recurse list 0)))
(defvar lst '(1 2 3 nil))
(setf (cdr (cdr (cdr lst))) lst)
(my-length lst) ;; stack overflow
Хотя я уже придумал как это можно было бы функционально красиво выразить.
Исправление MOPKOBKA, :
Ну значит это зацикленные списки а не бесконечные, на них твоя функция вылетает. Ошибку бы какую нибудь... Без сторонних функций типа fold.
(defun my-length (list)
(labels ((recurse (list result)
(if list (recurse (cdr list) (1+ result)) result)))
(recurse list 0)))
(defvar lst '(1 2 3 nil))
(setf (cdr (cdr (cdr lst))) lst)
(my-length lst) ;; stack overflow
Исходная версия MOPKOBKA, :
Ну значит это зацикленные списки а не бесконечные, на них твоя функция вылетает
(defun my-length (list)
(labels ((recurse (list result)
(if list (recurse (cdr list) (1+ result)) result)))
(recurse list 0)))
(defvar lst '(1 2 3 nil))
(setf (cdr (cdr (cdr lst))) lst)
(my-length lst) ;; stack overflow