lisp - Common Lisp 中的列表和成员实现

标签 lisp common-lisp

我刚刚开始学习 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 单元有两个值,通常称为 carcdr。表达式 (cons x y) 返回一个 cons 单元格,其 carxcdr 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/

相关文章:

common-lisp - 如何使用 Caveman2 设置响应状态代码?

lisp - 如何访问函数返回的多个值(例如,cl :parse-integer)?

clojure - 如何以纯函数的方式实现观察者设计模式?

recursion - Lisp Stack溢出递归函数

lisp - 打印带有中缀符号的列表

algorithm - 就地插入排序 LISP

common-lisp - 如何在 Common-Lisp CLOS 中在运行时可移植地创建一个类

lisp - 如何在 common lisp 的定义之前声明一个函数?

functional-programming - 读SICP的前置条件是什么?

common-lisp - 我可以在他们的扩展站点中获取宏的边界吗?