我刚刚开始学习 Common Lisp,我正在阅读的文本使用了一个带有 member
函数的示例。
我不确定这两个代码块之间的区别:
(if (member nil '(1 nil 2 3))
'contains-nil
'does-not-contain-nil)
返回 CONTAINS_NIL
(if (member nil '(1 2 3))
'contains-nil
'does-not-contain-nil)
返回 DOES-NOT-CONTAIN-NIL
据我所知,列表相当于嵌套的 cons
单元格,所以我认为 (member nil (cons 1 (cons 2 (cons 3 nil)))
会返回 (nil)
,但它只返回 nil
。我不确定编译器或解释器如何区分,如果有人可以给我一些见解如何实现 member
函数,我将不胜感激。
最佳答案
cons 单元有两个值,通常称为 car
和 cdr
。表达式 (cons x y)
返回一个 cons 单元格,其 car
是 x
,cdr
是 y
。在 Lisp 中,list 要么是空列表(通常是符号 nil
),要么是一个 cons 单元格。当列表是一个 cons 单元时,列表的 first 元素是 cons 单元的 car
,列表的 rest 是 cons细胞的cdr
。考虑列表 (1 2 3)
。它是一个 cons 单元格,列表的第一个元素是 1
。列表的其余部分不为空,因此它必须是第一个元素为 2
的另一个列表。该列表的其余部分不为空,因此它必须是第一个元素为 3
的另一个列表。该列表的其余部分 为空,即 nil
。基于该分析,我们可以看出为什么列表是由
(cons 1 (cons 2 (cons 3 nil)))
== (1 2 3)
在构成列表的一系列 cons 单元中,列表的元素是链中每个 cons 单元的 car 值。列表可以是列表的元素,如
(cons 1 (cons nil (cons 2 (cons 3 nil))))
== (1 nil 2 3)
或
(cons 1 (cons (cons 2 (cons 3 nil)) nil))
== (1 (2 3))
但仅仅因为我们在较长的表达式中看到 nil
并不意味着 nil
是列表的一个元素。
关于lisp - Common Lisp 中的列表和成员实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16681813/