Scheme 像(set!c(cons 3 c))这样的表达式是向列表中添加项的方法吗?

Scheme 像(set!c(cons 3 c))这样的表达式是向列表中添加项的方法吗?,scheme,cons,Scheme,Cons,这个计划已经成功了!并设置cdr!,但是没有定案 是这样的表达吗 (集合!c(cons 3 c)) 将元素3放在列表c上,这是修改列表的正确/唯一/最佳/常用方法?这是修改列表c的正确方法。但这种用法很少见。也许你可以告诉我们更多你想做什么 (set!c(cons 3 c)) 好吧,让我们弄清楚这个表达式的作用: set将变量作为第一个参数,将表达式作为第二个参数。它计算第二个参数,并将值赋给变量 cons获取一个值和一个列表,并生成一个以给定值作为其头部、以给定列表作为其尾部的列表 因此,

这个计划已经成功了!并设置cdr!,但是没有定案

是这样的表达吗

(集合!c(cons 3 c))


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

这是修改列表c的正确方法。但这种用法很少见。也许你可以告诉我们更多你想做什么

(set!c(cons 3 c))

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

  • set
    将变量作为第一个参数,将表达式作为第二个参数。它计算第二个参数,并将值赋给变量
  • cons
    获取一个值和一个列表,并生成一个以给定值作为其头部、以给定列表作为其尾部的列表
因此,
(set!c(cons 3 c))
构造一个列表,其中
3
作为头,
c
作为尾,并将该列表指定为
c
的值。此更改仅对访问
c
的相同绑定的代码可见-如果有其他变量或对象字段引用原始列表,它们仍然引用该原始列表

在某些上下文中,这可以松散地描述为“向列表中添加项目”,但这是一种松散的描述,因为您没有获取现有列表并将其修改为具有新项目;相反,您正在创建一个以新的初始项和原始列表作为尾部的列表,并更改对旧列表的一些(但可能不是全部)引用以指向新列表

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

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

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

您需要了解类型构造函数、修饰符和访问器

对由cons构成,这是一个由2个参数组成的过程,第一个参数(car)是对的第一个元素,第二个参数(cdr)是对的第二个元素。正确的列表要求它的cdr是以null结尾的列表。否则,它只是一对

成对选择器(car和cdr)接受一个参数,一个构造的列表,并提取is对参数的第一个参数(使用car)或其余参数(使用cdr)

(set-car! (cons 'a (cons 'b '())) 'c) ;; is the same as
(set! (car (cons 'a (cons 'b '()))) 'c)
修饰符(setter)接受两个参数:一个现有的构造(一对、一对中的一辆车,以及基本上任何已构造的东西),并用其第二个参数的值替换所选的构造

(set-car! (cons 'a (cons 'b '())) 'c) ;; is the same as
(set! (car (cons 'a (cons 'b '()))) 'c)

明白了吗?

我正在学习这门语言。我花了几分钟的时间才理解我编写的一个小程序不起作用,因为(cons item list)没有修改列表(正如我不假思索地假设的那样),而是返回将项放在列表上的结果。很少有Scheme程序通过修改来进行。如果你想使用Scheme,你需要改变你对编程的想法。Friedman和Felleisen的《小阴谋家》一书很好地介绍了阴谋思维方式。谢谢你的详尽回答。通常情况下,表达式的不精确性实际上表明了思想或概念的不精确性,正如我在上面所做的。“cons是成对构造函数过程”:Scheme编程语言,第3版,第133页。