Похоже, вы установили динамическую глобальную переменную *print-circle*
в нечто истинное. Если вы оцените *print-circle*
, вы увидите это.
; make a list (1 1 1 1 1 ...)
(defparameter *test* (list 1))
(setf (cdr *test*) *test*)
(setf *print-circle* t)
(substitute-if '(0) #'evenp '((1) (2) (3) (4)) :start 1 :key #'car)
; ==> ((1) #1=(0) (3) #1#)
*test*
; ==> #1=(1 . #1#)
(setf *print-circle* nil)
(substitute-if '(0) #'evenp '((1) (2) (3) (4)) :start 1 :key #'car)
; ==> ((1) (0) (3) (0))
*test* ; never finishes
Последний будет зависать, пока не закончится память. спешите отменить его, иначе ваша система наверняка будет работать медленно, когда она использует всю доступную память и буферы и начнет заставлять систему заменять другие вещи.
Вот почему у нас *print-circle*
. Возможность видеть списки, которые являются круглыми. Структура напечатанных данных всегда одинакова, поэтому отличается только то, как она отображается.
Когда вы используете substitute-if
и заменяете на '(0)
, он имеет один адрес в памяти и, таким образом, когда *print-circle*
верен, он напечатает его только один раз, а другие ссылки будут показаны как ссылки, так как система ищет тот же объект, а не если он действительно круговой или нет.