Круговые списки в хитрости - PullRequest
0 голосов
/ 23 апреля 2019

Я тестировал этот код в guile:

> (define xxx  (let ((x '(1 2 3))) (set-cdr! (cddr x) x) x))
> xxx

это дисплей (1 2 3)

но это:

(define x '(1 2 3))
(set-cdr! (cddr x) x)
x
=> (1 2 3 . #-2#)

создает круговой список

Почему первый код не работает в guile? Если вы не знаете о лукавстве, я просто хочу знать, должно ли оно работать в соответствии со спецификацией схемы, не знаю, где искать такие вещи.

1 Ответ

2 голосов
/ 23 апреля 2019

Проблема с вашими примерами - они не работают. Никто из них. Понятия не имею, как первый вернулся (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)

Пожалуйста, проверьте ваш код перед публикацией.

...