Я смущен о различии между' (()) и (минус null null) в схеме.Разница между '(()) и (минус null null)
Код, показанный ниже, показывает, что b
и c
- это совершенно одно и то же.
(define (dup2 x)
(let ((d '(())))
(set-car! d (car x))
(set-cdr! d (cdr x))
d))
(define a '(1 2))
(define b (dup2 a))
(define c (dup2 a))
(set-car! b 2)
> c ;; --> (2 2)
Однако, когда я использовал dup
вместо dup2
:
(define (dup x)
(let ((d (cons null null)))
(set-car! d (car x))
(set-cdr! d (cdr x))
d))
(define a '(1 2))
(define b (dup a))
(define c (dup a))
(set-car! b 2)
> c ;; --> (1 2)
Переменная b
и c
различны. Я сделал несколько экспериментов, но пока не понял.
Возможный дубликат [Неожиданное сохранение данных] (http: // stackoverflow.ком/вопросы/18790192/неожиданная-живучесть-в-данных). Проблема связана с цитируемыми данными не из-за разницы в значениях '' (()) 'и' (cons null null) '. Попробуйте заменить '' (()) 'на' (list '()) ', и вы больше не будете наблюдать эту проблему. (Этот дубликат - это не схема, а Common Lisp, но проблема одна и та же.) Для еще большей забавы, а не для процедуры 'dup', попробуйте написать одну, которая _pushes_ данных в список' d', Посмотрите, как список становится длиннее и длиннее для нескольких вызовов. –