在The Little Schemer (4th Ed.) 中,据称a list for which null?
is false contains at least one atom,或者从阅读文本中我了解到。
这对我来说没有意义,因为(atom '())
是错误的,我们可以将其粘贴到列表中以使其不为空:
> (null? '(()))
#f
所以我的问题是,这是我阅读中的错误还是有关定义的问题?由于它不在勘误中,所以我认为这样一本研究透彻的书不会有这样的错误。
如果我们认为(())
与(() . ())
甚至甚至是(cons '() '())
是相同的,然后我们认为cons
是一个原子,那么我可以看到如何到达那里,但是我不要以为那是怎么回事。
(这在Racket 7.0中进行了测试,书中给出了atom?
的定义,即
(define atom?
(lambda (x)
(and (not (pair? x)) (not (null? x)))))
我知道这并不涵盖有趣的球拍功能,但在这里应该足够了。)
答案 0 :(得分:2)
lat
被 假设 认为是本书中此时的原子列表。
如果不为空,则按定义 包含一些原子。
这与Lisp无关,与本书的演示文稿有关。
答案 1 :(得分:1)
我认为public static <K, V> void print(Map<K, Collection<V>> map) {
map.entrySet().stream()
.flatMap(entry -> entry.getValue().stream().map(value -> new AbstractMap.SimpleEntry<>(entry.getKey(), value)))
.forEach(entry -> print(entry.getKey(), entry.getValue()));
}
表示原子列表。因此,如果lat
不是lat
,则它必须至少包含一个原子。
有一个名为null?
的过程,其定义如下:
lat?
(define lat?
(lambda (l)
(cond
((null? l) #t)
((atom? (car l))
(lat? (cdr l)))
(else #f))))
,因此根据定义(lat? '(()) ; ==> #f
不是'(())
,因此该语句不适用于该列表。
列表可以包含任何类型的元素,包括空列表和其他列表,它们都不是原子。 lat
仅限于仅包含原子元素的平面列表。
答案 2 :(得分:1)
作为一个概念,“原子”是不能分解成较小部分的东西。数字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。
由于要由书的作者来定义术语“原子”(该词在语言标准中没有出现),因此他们可能选择了上述简单定义。
请注意,当语言包含其他复合数据结构(例如向量和结构)时,非列表的定义会产生误导。如果我没记错的话,本书中讨论的唯一复合数据结构就是列表。