gpt4 book ai didi

scheme - 诸如 (set! c (cons 3 c)) 之类的表达式是将项目添加到列表的方式吗?

转载 作者:行者123 更新时间:2023-12-02 08:50:16 24 4
gpt4 key购买 nike

方案已定车!和 set-cdr!,但没有 set-cons! .

是像

这样的表达

(设置!c(缺点 3 c))

哪个将元素 3 放在列表 c 上,修改列表的正确/唯一/最佳/常用方法?

最佳答案

(set! c (cons 3 c))

好吧,让我们弄清楚这个表达式的作用:

  • set! 将变量作为第一个参数,将表达式作为第二个参数。它计算第二个参数,并将值赋给变量。
  • cons 获取一个值和一个列表,并生成一个列表,其中给定值作为其头部,给定列表作为其尾部。

所以,(set!c (cons 3 c))构造了一个以3为头,c为尾的列表,并将该列表分配为 c 的值。此更改仅对访问 c 相同绑定(bind)的代码可见——如果有其他变量或对象字段引用原始列表,它们仍引用该原始列表。

在某些情况下,这可以粗略地描述为“将项目添加到列表”,但这是一个粗略的描述,因为您没有采用现有列表并将其修改为具有新元素;相反,您正在创建一个列表,其中包含一个新的初始项,并将原始列表作为其尾部,并更改一些(但可能不是全部)对旧列表的引用以指向新列表。

我可以马上想到的两个主要事情也可以算作“向列表添加项目”:

  • 修改现有列表的结构以在中间或末尾的某处添加一对新的。如果您对术语非常严格,那么这就是“将项目添加到列表”的唯一真实情况。
  • 将一个项目置于列表的前面并将其返回给调用者或将其作为参数传递给另一个函数(没有设置!)。这比你的例子更宽松——但它也是最常见的情况!

第一个例子:

(define (insert-at-second-position! item list)
(set-cdr! list (cons item (cdr list))))

第二个例子:

(define (list-copy xs)
(if (null? xs)
'()
;; We call list-copy recursively on the tail, and "add an item"
;; at the front:
(cons (car xs)
(list-copy (cdr xs)))))

关于scheme - 诸如 (set! c (cons 3 c)) 之类的表达式是将项目添加到列表的方式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8974924/

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