簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM