[英]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 現在取消了所有這些雙關語:
#f
/ #false
,它不是空列表;(not x)
僅當x
為#f
時為真;()
,它不是#f
,因此它是正確的;null?
,所以(null? '())
為真,但(null? #f)
為假;()
的car
和cdr
是錯誤的;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 值, false
和nil
- 除了false
和nil
之外的所有值也是 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.