gpt4 book ai didi

lisp - '(()) 和 (cons null null) 之间的区别

转载 作者:太空宇宙 更新时间:2023-11-03 18:54:46 24 4
gpt4 key购买 nike

我对方案中 '(()) 和 (cons null null) 之间的区别感到困惑。

下面的代码表明bc 是完全一样的东西。

(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)

变量bc是不同的。我做了一些实验,但我还没有理解。

最佳答案

第一个实现中 d 的值是文字数据,修改后会产生未定义的后果。要突出显示正在发生的事情,请考虑以下代码:

(define (incorrect-list-null-and-x x)
(let ((l '(()))) ; a list of the form (() . ())
(set-cdr! l (cons x (cdr l))) ; (cdr l) is (), so (cons x (cdr l)) should be (x . ()) == (x), right?
; and now l should be (() . (x . ())) == (() x), right?
l))

预期的结果是 (incorrect-list-null-and-x n) 应该返回 (() n) 形式的列表,它确实第一次,但后续调用仍在访问相同数据:

(incorrect-list-null-and-x 1) ;=> (() 1)
(incorrect-list-null-and-x 2) ;=> (() 2 1)
(incorrect-list-null-and-x 3) ;=> (() 3 2 1)
(incorrect-list-null-and-x 4) ;=> (() 4 3 2 1)

同样的问题在您的 dup2 中表现得有点不同。从 dup2 返回的每个值实际上都是相同对:

(let* ((x (dup2 (cons 1 2)))
(y (dup2 (cons 3 4))))
(display x)
(display y))

输出:

(3 . 4)(3 . 4)

因为调用 (dup2 (cons 3 4)) 修改了之前由 (dup2 (cons 1 2)) 返回的相同结构。

关于lisp - '(()) 和 (cons null null) 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19160931/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com