[英]Does a non-null Scheme list contain at least one atom?
在《小計划者》 (第四版)中 ,聲稱存在一個為null?
的列表null?
為false至少包含一個atom ,所以從閱讀本文中我了解到。
這對我來說沒有意義,因為(atom '())
是假的,我們可以將它們粘貼到列表中以使其不為空:
> (null? '(()))
#f
所以我的問題是,這是我閱讀中的錯誤還是有關定義的問題? 由於它不在勘誤中,所以我認為這樣一本研究透徹的書不會有這樣的錯誤。
如果我們認為(())
與(() . ())
或什至(cons '() '())
,然后認為cons
是一個原子,那么我可以看到您如何到達那里,但是我不知道認為這就是正在發生的事情。
(這在Racket 7.0中進行了測試,書中給出了atom?
的定義,即
(define atom?
(lambda (x)
(and (not (pair? x)) (not (null? x)))))
我知道這並不涵蓋有趣的球拍功能,但在這里應該足夠了。)
lat
被假定為書中該點的原子列表 。
如果不為空,則根據定義 ,其中包含一些原子。
這與Lisp無關,而與書中的介紹有關。
我認為lat
表示原子列表。 因此,如果lat
不為null?
,則它必須包含至少一個原子。
有一個叫lat?
的程序lat?
定義如下:
(define lat?
(lambda (l)
(cond
((null? l) #t)
((atom? (car l))
(lat? (cdr l)))
(else #f))))
(lat? '(()) ; ==> #f
因此根據定義'(())
不是lat
,因此該語句不適用於該列表。
列表可以包含任何類型的元素 ,包括空列表和其他列表,它們都不是原子。 lat
僅限於僅包含原子元素的平面列表。
作為一個概念,“原子”是不能分解成更小的部分的東西。 數字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。
由於由書的作者來定義術語“原子”(該詞未出現在語言標准中),因此他們可能選擇了上述簡單定義。
請注意,當語言包含其他復合數據結構(例如向量和結構)時,非列表的定義會產生誤導。 如果我沒記錯的話,本書中討論的唯一復合數據結構就是列表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.