非空方案列表是否至少包含一个原子



The Little Schemer(第4版(中,有人声称null?为假的列表至少包含一个原子,或者我从阅读文本中了解到这一点。

这对我来说没有意义,因为(atom '())是false,我们可以将它们粘贴到一个列表中以使其不为空:

> (null? '(()))
#f

所以我的问题是,这是我阅读中的错误,还是定义问题?既然它不在勘误表中,我想这样一本研究得很好的书不会有这样的错误。

如果我们认为(())(() . ())甚至(cons '() '())相同,然后认为cons是一个原子,那么我可以看到你是如何到达那里的,但我不认为这是怎么回事

(这在Racket 7.0中进行了测试,书中给出了atom?的定义,即

(define atom?
(lambda (x)
(and (not (pair? x)) (not (null? x)))))

我知道这并没有涵盖Racket有趣的功能,但在这里应该足够了。(

lat假设为书中此时的原子列表。

如果它不是空的,根据定义它包含一些原子。

这不是关于Lisp,而是关于这本书的介绍。

我认为lat表示原子列表。因此,如果lat不是null?,那么它需要包含至少一个原子。

有一个称为lat?的过程被定义为:

(define lat?
(lambda (l)
(cond
((null? l) #t)
((atom? (car l)) 
(lat? (cdr l)))
(else #f))))

CCD_ 13,因此根据定义CCD_ 14不是CCD_。

列表可以包含任何类型的元素,包括空列表和其他列表,它们都不是原子。CCD_ 16是一个仅限于具有原子元素的平面列表。

作为一个概念,"原子"是不能分解成更小部分的东西。数字42是原子,列表(42 43(不是原子,因为它包含两个较小的部分(即数字42和43(。由于空列表不包含任何较小的部分,因此根据此逻辑,它就是一个原子。

现在,让我们尝试实现一个atom?谓词,该谓词确定其输入是否为原子。

(define (atom? x)
(cond
[(number? x) #t]
[(symbol? x) #t]
[(char? x)   #t]
...
[else #f]))

这是。。。需要替换为对实现所支持的每个原子数据类型的测试。这可能是一个很长的列表。为了避免这种情况,我们可以试着聪明一点:

(define (atom? x)
(not (list? x)))

对于非空列表,这将正确地返回false,对于数字、字符等,这将返回true。但是对于空列表,它将返回false。

由于"原子"一词的定义取决于该书的作者(该词没有出现在语言标准中(,他们可能会选择上述简单的定义。

请注意,当语言包含其他复合数据结构(如向量和结构(时,非列表的定义会产生误导。如果我没有记错的话,书中讨论的唯一复合数据结构就是列表。

最新更新