Przepełnienie stosu z rekurencyjnego wywołania funkcji w Lisp

Uczę się Lispa z książki „Kraina Lispa” Conrada Barskiego. Teraz uderzyłem w moją pierwszą przeszkodę, w której autor mówi:

Wywoływanie siebie w ten sposób jest nie tylko dozwolone w Lisp, ale często jest bardzo zalecane

po wyświetleniu następującej funkcji przykładowej, aby policzyć elementy na liście:

(defun my-length (list)
  (if list
    (1+ (my-length (cdr list)))
    0))

Kiedy dzwonię do tej funkcjimy-length z listą zawierającą milion elementów otrzymuję błąd przepełnienia stosu. Więc albo nigdy nie spodziewasz się, że lista będzie długa w Lisp (więc może mój przypadek użycia jest bezużyteczny), albo istnieje inny sposób zliczania przedmiotów na tak długiej liście. Czy możesz rzucić na to trochę światła? (Nawiasem mówiąc, używam GNU CLISP w systemie Windows).

questionAnswers(4)

yourAnswerToTheQuestion