gpt4 book ai didi

lisp - 定车!并输入方案语言

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

这个例子的结果让我有点困惑:

(define mk-q
(lambda ()
(let ([l '(x)])
(cons l l))))


(define q (mk-q))

q
=> ((x) x)

(set-car! (cdr q) 'y)
=> ((y) y)

我想知道为什么 x 原子都被 set-car! 程序取代了(我对结果的第一个猜测是 ((x ) y))?

例如:

(define mk-q2
(lambda ()
(let ([l '(x)])
(cons l (cons l l)))))

(define q2 (mk-q2))
(set-car! (cdr q2) 'y)
=> ((x) y x) which fits my understanding of set-car!

为什么第一个示例中的两个 x 都被替换了?

最佳答案

在第一个示例中,您有与此等效的内容:

(define cell (cons 'x null))
(define q (cons cell cell))

如您所见,在 car 位置只有 一个 cons 单元格带有 x,即在结果列表结构的两个不同部分中共享。当您执行 (set-car! (cdr q) 'y) 时,单个单元格中的 x 将被所有部分中的 y 替换在哪里共享。记住这两个 (cons 'x null) 单元格实际上是相同的,我们从这里开始:

(cons (cons 'x null) (cons 'x null))
; '((x) x)

为此:

(cons (cons 'y null) (cons 'y null))
; '((y) y)

对于第二个示例,同样的考虑适用(所有三个 (cons 'x null) 单元格实际上是共享的同一个单元格),但是您要替换整个 cons 单元格,所以基本上我们从这里开始:

(cons (cons 'x null) (cons (cons 'x null) (cons 'x null)))
; '((x) (x) x)

为此:

(cons (cons 'x null) (cons 'y (cons 'x null)))
; '((x) y x)

为了证明我的观点,即问题中的两个示例都展示了相同的情况,请执行以下表达式:

(define q2 (mk-q2))
(set-car! (cadr q2) 'y) ; notice the extra `a`
q2
=> '((y) (y) y)

关于lisp - 定车!并输入方案语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11013514/

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