方案对构建
Scheme pair construction
我正在尝试了解对的构造和表示。
让我们来看看以下结果:
(length (cons '(a b) '(d e f)))
=> 4
现在让我们调换顺序:
(length (cons '(d e f) '(a b)))
=> 3
但是
(length (car (cons '(d e f) '(a b))))
=> 3
能否解释一下上面的结果?
car和cdr有什么区别?
请记住,cons
只是将两个东西粘在一起,由于历史原因,第一个被称为 car
,第二个被称为 cdr
。
如果第二个恰好是一个适当的列表,那么结果也是一个列表。因此,列表被定义为 cons
ing 一个元素的结果与 cons
ing 一个元素的结果......等等,直到我们到达空列表 '()
。例如:
(cons 1 (cons 2 (cons 3 '())))
=> '(1 2 3)
处理列表时,将car
视为列表的第一个元素,将cdr
视为其余元素,cons
在头部再添加一个元素列表的 - 该元素可以是任何东西,包括另一个列表。它只是添加在头部,列表不是 "merged"(我们为此使用 append
)。看一看:
(car '(1 2 3))
=> 1
(cdr '(1 2 3))
=> '(2 3)
现在,关于您的示例 - 第一个添加 '(a b)
作为列表的第一个元素,其余的是 '(d e f)
,因此我们现在有一个 4 元素列表,如下所示:
(cons '(a b) '(d e f))
=> '((a b) d e f)
与第二个示例类似:我们将第一个元素 '(d e f)
添加到其余元素 '(a b)
,我们得到一个 3 元素列表:
(cons '(d e f) '(a b))
=> '((d e f) a b)
最后,如果我们在上面的列表中调用 car
,我们会得到它的第一个元素——恰好是 '(d e f)
,显然它有 3 个元素:
(car (cons '(d e f) '(a b)))
=> '(d e f)
我正在尝试了解对的构造和表示。 让我们来看看以下结果:
(length (cons '(a b) '(d e f)))
=> 4
现在让我们调换顺序:
(length (cons '(d e f) '(a b)))
=> 3
但是
(length (car (cons '(d e f) '(a b))))
=> 3
能否解释一下上面的结果? car和cdr有什么区别?
请记住,cons
只是将两个东西粘在一起,由于历史原因,第一个被称为 car
,第二个被称为 cdr
。
如果第二个恰好是一个适当的列表,那么结果也是一个列表。因此,列表被定义为 cons
ing 一个元素的结果与 cons
ing 一个元素的结果......等等,直到我们到达空列表 '()
。例如:
(cons 1 (cons 2 (cons 3 '())))
=> '(1 2 3)
处理列表时,将car
视为列表的第一个元素,将cdr
视为其余元素,cons
在头部再添加一个元素列表的 - 该元素可以是任何东西,包括另一个列表。它只是添加在头部,列表不是 "merged"(我们为此使用 append
)。看一看:
(car '(1 2 3))
=> 1
(cdr '(1 2 3))
=> '(2 3)
现在,关于您的示例 - 第一个添加 '(a b)
作为列表的第一个元素,其余的是 '(d e f)
,因此我们现在有一个 4 元素列表,如下所示:
(cons '(a b) '(d e f))
=> '((a b) d e f)
与第二个示例类似:我们将第一个元素 '(d e f)
添加到其余元素 '(a b)
,我们得到一个 3 元素列表:
(cons '(d e f) '(a b))
=> '((d e f) a b)
最后,如果我们在上面的列表中调用 car
,我们会得到它的第一个元素——恰好是 '(d e f)
,显然它有 3 个元素:
(car (cons '(d e f) '(a b)))
=> '(d e f)