LINUX.ORG.RU

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

Исправление 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