Common Lisp: Почему это создает круговой список: (setf (car) (append))?
Я пытаюсь понять, почему это приводит к тому, что кажется круговым списком.
* (progn
(setf (car *x*) (append '(3) *x*))
2)
2 ;; No "apparent issue setting the value. Hence it is related to printing `*x*`
*x* ;; infinite loop, perhaps due to the structure of *x*??
Почему это круговой список? Я ожидаю, что это не должен быть круговой список
Чем отличается этот вопрос от вопроса "дубликата":
В этом вопросе я верю *x*
не должно быть кругового списка. В цепочке повторяющихся ответов показано, как создать круговой список, и ни один из примеров не использует результат append
в setf
,
Хорошо, я нашел ответ: моя путаница возникает из-за неправильного понимания спецификации, где говорят, что append возвращает новый список.
Очевидно, новый список не означает, что каждый его член является новым (не означает, что копия возвращается). Последний аргумент дополнения на самом деле является общим...
1 ответ
Это не читатель, а принтер, который находится в бесконечном цикле.
В большинстве реализаций есть переменная для ограничения принтера верхнего уровня, см. *PRINT-LEVEL*
,*PRINT-LENGTH*