为什么`(count nil)`返回0?

Tim*_*ver 4 null clojure

在Clojure中,我发现这令人惊讶:

> (count nil)
0
Run Code Online (Sandbox Code Playgroud)

我希望有一个类型错误,就像在这种情况下:

> (count 77)
java.lang.UnsupportedOperationException: count not supported on this type: Long
Run Code Online (Sandbox Code Playgroud)

既然nil不是清单:

> (list? nil)
false
Run Code Online (Sandbox Code Playgroud)

是否nil具有空序列的特殊状态?

Mik*_*378 5

从官方文档:

count:

返回集合中的项目数.(count nil)返回0.还适用于字符串,数组和Java集合和映射

所以这是规范;)

我想这可以确保任何具有"可数"类型的变异值都可以在运行时处理.
实际上,引用允许类型(字符串,数组和Java集合和映射)的任何引用都可能nil在某些时候成为目标.


fre*_*ill 5

有一个旧的lisp传统来混淆nil和空列表.

现在Clojure并不遵守那个,而是在LISP差异页面中

http://clojure.org/lisps

你可以阅读

Clojure的一大不同之处在于序列.序列不是特定的集合,尤其是.它们不一定是具体的清单.当你向一个空集合询问其元素序列时(通过调用seq),它返回nil,说"我不能生成一个".当你在其最后一个元素上询问一个序列时,它返回另一个逻辑序列.您只能通过依次调用seq来判断该序列是否为空.这使序列和序列协议变得懒惰.

因此,为了能够与许多其他传统处理函数(首先,休息等)链接"seq"调用,你必须处理nil作为某种空列表(这只是我对整个事件的理解).