簡體   English   中英

在 Scheme 中,`nil` 和 `null` 有什么區別?

[英]In Scheme, what is the difference between `nil` and `null`?

在《The Little Schemer》中, null用於指代空列表() 但我還在 Scheme 的錯誤消息中看到了被稱為nil的空列表,例如:

(car ())

原因:

Error: Attempt to apply car on nil [car]

這聽起來像是將()稱為nil

我認為您所看到的是錯誤消息中的歷史產物。

在傳統的 Lisps 中, nil既是空列表,又是 boolean 為 false,並且在其他各種方面都相當特殊(例如,它也是一個符號,這很奇怪)。

所以特別是()nil在這樣的 Lisp 中是相同的 object ,並且(not nil)為真,並且(not '())也為真(實際上(not ())既合法也為真) . 空列表 object 的謂詞是null (也許應該是nullp但歷史表明它就是這樣)和(null nil)是正確的(null '())(null ())

還有關於(car nil) aka (car '()) aka (car ())應該做什么的問題。 傳統上的答案是這很好, (car nil)nil 如果你很聰明,這會給你一個非常簡潔的nil實現。

Scheme 現在取消了所有這些雙關語:

  • 有一個唯一的 false object 是#f / #false ,它不是空列表;
  • 所有其他對象都為真,因此(not x)僅當x#f時為真;
  • 有一個唯一的空列表 object,它是() ,它不是#f ,因此它是正確的;
  • 這個 object 的謂詞是null? ,所以(null? '())為真,但(null? #f)為假;
  • ()carcdr是錯誤的;
  • nil只是一個符號,在語言中根本沒有特殊地位。

我不認為()的名稱是標准的,但顯然給它一個名稱可能很有用,並且null很好:例如,Racket 就是這樣做的。

所以在 Scheme 中, nil就消失了,空列表和 boolean false 之間的雙關語隨之而來。

但是很多實現 Schemes 的人都知道nil就是人們所說的空列表。 所以當他們寫錯誤信息的時候,當他們的意思是()時他們寫nil ,因為這是每個人都叫()很長一段時間。

我認為,這就是你在這里看到的。

不同 Lisps 之間的區別在於它們如何處理 true、false 和 nil。

在 Common Lisp 中,我們有t表示真, nil表示假,盡管除了nil之外的所有內容實際上都是真的。 如果列表為空,或者find什么也沒找到,我們有nil ,我們可以直接測試。 技術術語是nil punning

'() ; => NIL
(= 1 2) ; => NIL
(if '() "full" "empty") ; => "empty"

(find 5 '(1 2 3 4)) ; => NIL
(if (find 5 '(1 2 3 4)) "found" "not found" ; => "not found"

Clojure 的做法不同。 有一個官方的真值true ,並且有兩個 false 值, falsenil - 除了falsenil之外的所有值也是 true。 空列表不再是nil ,您需要對空列表使用單獨的測試,用empty? . nil更像是 C 中的void 更好或更差? - 你決定。

'() ; => ()
(= 1 1) ; => true
(= 1 2) ; => false
(if '() "full" "empty") ; => "full"
(if (empty? '()) "empty" "full") ; => "empty"
(if nil "full" "empty") ; => "empty"
(if (println "Hello world") "full" "empty") ; => empty

Scheme 在意圖上更接近 Clojure。 這里有一個錯誤值#f 空列表不再是nil ,需要對空列表使用單獨的測試,用null? .

(= 1 1) ; => #t
(= 1 2) ; => #f
(null? '()) ; => #t
(null? 'nil) ; => #f

因此, null是空列表的另一個名稱,但nil'nil不是。

null ; => ()
nil  ; =>  cannot reference an identifier before its definition
'nil ; => nil

(car ())怎么樣? 您的 Scheme 從評估()中返回nil ,這就是car所抱怨的。 我的計划,Racket 博士,根本拒絕演奏,說空列表中缺少表達式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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