方案:当我使用两个原子时,我在中间得到一个点。为什么?

Scheme: When I cons two atoms I am getting a dot in the middle. Why?

当我在两个原子上执行 cons 时,我在两者之间得到 .

1]=>(cons 'one 'two)
;Value 1: (one . two)

为什么我得到 . 运算符。它有什么意义吗? 我正在使用 mit-scheme.

看过this Whosebug link但不清楚

更新: Little Schemercons的定义指出, cons 接受两个参数,第一个是任何 S 表达式,第二个是任何列表。

cdr 部分 而不是 本身是 cons 单元格或空列表。在这种情况下,点不是运算符,例如:

(cons 1 2)
=> '(1 . 2) ; a cons pair, a.k.a. a cons cell

(cons 1 (cons 2 3))
=> '(1 2 . 3) ; not a proper list, it doesn't end in '()

如果 cdr 部分 一个 cons 单元格或空列表 '(),那么我们有一个列表:

(cons 1 '())
=> '(1) ; a proper list, ends in '()

(cons 1 (cons 2 '()))
=> '(1 2) ; a proper list, ends in '()

The Little Schemer 中的定义是一种简化,实际上 cons 可以为其每个参数取任何类型的值。按照惯例,如果第二个参数是一个列表,它将被视为一个列表并按此显示,否则它就是一个普通的旧 cons 单元格,并且那里的点是为了提醒您这一点。

过程 cons 创建一个指向所提供的两个参数的“cons cell”。

cons cell 是一对指针,list 是单个cons cell 或一系列cons cell,其第二个指针指向另一个cons cell,最后一个cell 的第二个指针指向另一个对象。

注意:我使用“对象”这个词是为了简单而不是编程意义上的。

正确列表中,最后一个 cons 单元格的第二个指针指向一个空列表。

在一个不正确的列表中,最后一个 cons 单元格的第二个指针指向一个非空列表的对象。

注2:一个“空列表”()是scheme中的唯一值,不同于列表,在普通的lisp中是 equal to nil,Nil不存在于scheme中。

+-----+-----+
|     |     |
|     |     |
+--+--+--+--+
   |     |
   |     |
   v     v
  obj   obj

一个缺点细胞

+-----+-----+     +-----+-----+     +-----+-----+
|     |     +---->+     |     +---->+     |     |
|     |     |     |     |     |     |     |     |
+--+--+-----+     +--+--+-----+     +--+--+--+--+
   |                 |                 |     |
   |                 |                 |     |
   v                 v                 v     v
   0                 1                 2     3

(0 1 2 . 3) -> (0 . (1 . (2 . 3)))    

列表不正确

+-----+-----+     +-----+-----+     +-----+-----+
|     |     +---->+     |     +---->+     |     +----> ()/nil
|     |     |     |     |     |     |     |     |
+--+--+-----+     +--+--+-----+     +--+--+-----+
   |                 |                 |
   |                 |                 |
   v                 v                 v
   0                 1                 2


(0 1 2) -> (0 . (1 . (2 . () )    

一个合适的列表

点(当在 repl 中出现时)用于表示列表的最终指针指向一个非空列表的对象,因此它是一个不正确的列表。

这是我的理解,至少来自普通的 lisp,尽管我确信它可以转化为大多数其他 lisp(我认为 Clojure 是不同的(如果你认为它是 lisp))。

Wikipedia page on cons.

~

小阴谋家在撒谎。 cons 可以将任何类型作为其第一个和第二个参数。您始终可以创建一对带有引用结构的对,例如 '(1 . 8).

没有专门用于制作列表的数据结构,所以 Scheme 有一个窍门。他们将列表定义为空列表或具有列表作为其 cdrcons。因此 '(1 . (2 . (3 . ()))) 是一个列表,如果你评估它,Scheme repl 将打印 (1 2 3) 回来。如果你计算 '(1 2 3),reader 会在 Scheme 解释器开始计算它之前将输入代码变成 '(1 . (2 . (3 . ())))。以 '() 结尾的列表称为真列表,因为它在最后两个元素之间没有点。例如。 '(1 . (2 . (3 . 4))) ; ==> (1 2 3 . 4)

如果你给第二个参数一个正确的列表,结果总是一个正确的列表,你不会看到任何点。