Проблема с вашими примерами - они не работают. Никто из них. Понятия не имею, как первый вернулся (1 2 3)
. Но когда вы исправляете одну и ту же проблему в обоих примерах, они работают как положено и создают круговой список.
Проблема?
'(1 2 3)
и (quote 1 2 3)
очень сильно отличаются от (list 1 2 3)
. Они оба «выглядят» одинаково, но сначала это статический список, и вы не можете его изменить. Только список, созданный с помощью функции list
(ну и cons
) - это список, который вы можете изменить.
Fix
(define xxx
(let ((x (list 1 2 3)))
(set-cdr! (cddr x) x)
x))
xxx ;; => (1 2 3 . #-2#)
То же самое относится и ко второму примеру:
(define x (list 1 2 3))
(set-cdr! (cddr x) x)
Пожалуйста, проверьте ваш код перед публикацией.