gpt4 book ai didi

scheme - 汽车返还值(value)?还是 Scheme 很奇怪?

转载 作者:行者123 更新时间:2023-12-02 05:21:56 25 4
gpt4 key购买 nike

我在我的一个使用 Scheme 和列表的项目中注意到了这种半奇怪的行为。我设法将行为隔离到一个部分中。代码是:

(define x (list 1 2 3))
(define y (list 4 5))
(define z (cons (car x) (cdr y)))
(define w (append y z))
(define v (cons (cdr x) (cdr y)))
(set-car! x 6)
(set-car! y 7)
(set-cdr! (cdr x) (list 8))

x
y
z
w
v

给我们输出:

(6 2 8)
(7 5)
(1 5)
(4 5 1 5)
((2 8) 5)

谁能给我解释一下:

  1. 为什么 (set-car! x 6)不更新Z ?因为据我了解car/cdr返回指向相应值的指针或引用。这真的很奇怪,我有点困惑。
  2. 如果car/cdr不返回引用/指针,那么最终的 set-cdr! 又如何呢?操纵列表 v

有什么想法吗?这是一个简单的修复,但我更好奇为什么会出现变量的怪异现象。

最佳答案

好的,让我们逐行执行您的程序。我还为每个新创建的对象分配了唯一的编号(如果您习惯使用类 C 语言,可以将它们视为对象地址),这样您就可以看到什么是什么。 :-)

(define x (list 1 2 3))             ; => #1 = (1 . #2), #2 = (2 . #3), #3 = (3 . ())
(define y (list 4 5)) ; => #4 = (4 . #5), #5 = (5 . ())
(define z (cons (car x) (cdr y))) ; => #6 = (1 . #5)
(define w (append y z)) ; => #7 = (4 . #8), #8 = (5 . #6)
(define v (cons (cdr x) (cdr y))) ; => #9 = (#2 . #5)
(set-car! x 6) ; => #1 = (6 . #2)
(set-car! y 7) ; => #4 = (7 . #5)
(set-cdr! (cdr x) (list 8)) ; => #2 = (2 . #10), #10 = (8 . ())

现在,让我们看看您的值(对于每个引用,使用最后分配的值):

x   ; #1 => (6 . #2) => (6 . (2 . #10)) => (6 2 8)
y ; #4 => (7 . #5) => (7 5)
z ; #6 => (1 . #5) => (1 5)
w ; #7 => (4 . #8) => (4 . (5 . #6)) => (4 . (5 . (1 . #5))) => (4 5 1 5)
v ; #9 => (#2 . #5) => ((2 . #10) 5) => ((2 8) 5)

编辑:我正在添加图表来解释我的答案,因为您不能在评论中包含图表。我没有时间制作显示上述值的图表,但这有望解释一些事情。

Expression tree

每一对都有两个“插槽”,carcdr,表示为上图中的左右框。如您所见,这些槽中的每一个都具有三种可能的情况:

  1. 一个原子(示例中的数字,或图中的符号,例如 lets5sqrt)<
  2. 引用(在图中用箭头表示)
  3. Null(在图中用黑框表示)

您可以将其中任何一个放入任何插槽中。所以,在我上面的解释中,每个 # 项都是一个箭头,每个非 # 数字都是一个原子,每个 () 是一个黑盒子。所以,在行中

(define v (cons (cdr x) (cdr y)))

你正在创建一对,其中左侧槽与 x 右侧槽具有相同的内容(即指向对 2 的箭头),右侧插槽与 y 的右侧插槽具有相同的内容(指向对 5 的箭头)。换句话说,v 中的两个框都包含箭头,每个箭头都离开不同的一对。

希望这更有意义。 :-)

关于scheme - 汽车返还值(value)?还是 Scheme 很奇怪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/770772/

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