作为一个概念,原子是不能分解成更小部分的东西。数字42是原子,列表(42 43)不是原子,因为它包含两个较小的部分(即数字42和43)。由于空列表不包含任何较小的部分,因此通过该逻辑是原子。
现在让我们尝试实现一个 atom? 谓词,决定它的输入是否是一个原子。
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。
由于本书的作者需要定义术语“这个词没有出现在语言标准中”,因此他们可能选择了上述简单的定义。
请注意,当语言包含其他复合数据结构(如向量和结构)时,定义为非列表会产生误导。如果我没记错的话,书中讨论的唯一复合数据结构是列表。
我认为 lat 表示原子列表。因此如果 lat 不是 null? ,那么它需要包含至少一个原子。
lat
null?
有一个叫做的程序 lat? 定义如下:
lat?
(define lat? (lambda (l) (cond ((null? l) #t) ((atom? (car l)) (lat? (cdr l))) (else #f))))
(lat? '(()) ; ==> #f 所以根据定义 '(()) 不是一个 lat 因此该声明不适用于该清单。
(lat? '(()) ; ==> #f
'(())
列表可以包含 的 任何类型的元素 强> ,包括空和其他列表,两者都不是原子。 lat 仅限于仅包含原子元素的平面列表。
lat 是 的 假定 强> 成为 原子列表 在书中的那一点。
如果它不是空的, 根据定义 它包含一些原子。
这不是关于Lisp,而是关于这本书的介绍。