Переполнение стека от рекурсивного вызова функции в Лиспе
Я учу Лисп из книги Конрада Барского "Земля Лисп". Теперь я столкнулся с моим первым камнем преткновения, где автор говорит:
Вызывать себя таким образом не только разрешено в Лиспе, но часто настоятельно рекомендуется
после показа следующего примера функции для подсчета элементов в списке:
(defun my-length (list)
(if list
(1+ (my-l,ength (cdr list)))
0))
Когда я вызываю эту функциюmy-length
со списком, содержащим миллион элементов, я получаю ошибку переполнения стека. Так что либо вы никогда не ожидаете иметь длинный список в Лиспе (так что, возможно, мой вариант использования бесполезен), либо есть другой способ подсчета элементов в таком длинном списке. Можете ли вы пролить свет на это? (Я использую GNU CLISP на Windows, кстати).