方案:当我使用两个原子时,我在中间得到一个点。为什么?
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 Schemer中cons
的定义指出,
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))。
~
小阴谋家在撒谎。 cons
可以将任何类型作为其第一个和第二个参数。您始终可以创建一对带有引用结构的对,例如 '(1 . 8)
.
没有专门用于制作列表的数据结构,所以 Scheme 有一个窍门。他们将列表定义为空列表或具有列表作为其 cdr
的 cons
。因此 '(1 . (2 . (3 . ())))
是一个列表,如果你评估它,Scheme repl 将打印 (1 2 3)
回来。如果你计算 '(1 2 3)
,reader 会在 Scheme 解释器开始计算它之前将输入代码变成 '(1 . (2 . (3 . ())))
。以 '()
结尾的列表称为真列表,因为它在最后两个元素之间没有点。例如。 '(1 . (2 . (3 . 4))) ; ==> (1 2 3 . 4)
如果你给第二个参数一个正确的列表,结果总是一个正确的列表,你不会看到任何点。
当我在两个原子上执行 cons
时,我在两者之间得到 .
。
1]=>(cons 'one 'two)
;Value 1: (one . two)
为什么我得到 .
运算符。它有什么意义吗?
我正在使用 mit-scheme
.
看过this Whosebug link但不清楚
更新:
Little Schemer中cons
的定义指出,
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))。
~
小阴谋家在撒谎。 cons
可以将任何类型作为其第一个和第二个参数。您始终可以创建一对带有引用结构的对,例如 '(1 . 8)
.
没有专门用于制作列表的数据结构,所以 Scheme 有一个窍门。他们将列表定义为空列表或具有列表作为其 cdr
的 cons
。因此 '(1 . (2 . (3 . ())))
是一个列表,如果你评估它,Scheme repl 将打印 (1 2 3)
回来。如果你计算 '(1 2 3)
,reader 会在 Scheme 解释器开始计算它之前将输入代码变成 '(1 . (2 . (3 . ())))
。以 '()
结尾的列表称为真列表,因为它在最后两个元素之间没有点。例如。 '(1 . (2 . (3 . 4))) ; ==> (1 2 3 . 4)
如果你给第二个参数一个正确的列表,结果总是一个正确的列表,你不会看到任何点。