gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:45:50 25 4
gpt4 key购买 nike

我刚刚开始学习 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com