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

时间:2018-12-13 12:13:41

标签: scheme lisp racket the-little-schemer

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)))))

我知道这并不涵盖有趣的球拍功能,但在这里应该足够了。)

3 个答案:

答案 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。

由于要由书的作者来定义术语“原子”(该词在语言标准中没有出现),因此他们可能选择了上述简单定义。

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