来自a comment on another question ,有人说 Clojure 习惯用法更喜欢返回 nil 而不是像 Scheme 中那样返回空列表。这是为什么?
喜欢,
(when (seq lat) ...)
而不是
(if (empty? lat)
'() ...)
最佳答案
我可以想到几个原因:
逻辑区别。在 Clojure 中,nil 意味着什么都没有/没有值(value)。而 '() "空列表是一个值 - 它恰好是一个空列表值。在概念和逻辑上区分这两者通常很有用。
里>适合 JVM - JVM 对象模型支持空引用。并且相当多的 Java API 返回 null 表示“无”或“未找到值”。因此,为了确保轻松的 JVM 互操作性,Clojure 以类似的方式使用 nil 是有意义的。
懒惰 - 这里的逻辑相当复杂,但我的理解是,使用 nil 表示“无列表”与 Clojure 的 lazy sequences 配合使用效果更好。由于 Clojure 默认是一种惰性函数式编程语言,因此这种用法成为标准是有意义的。请参阅 http://clojure.org/lazy 了解一些额外的说明。
“虚假” - 在编写检查集合的条件代码时,使用 nil 表示“无”也表示“假”,这很方便 - 因此您可以编写像
(if (some-map :some-key) ....)
这样的代码测试 HashMap 是否包含给定键的值。性能 - 测试 nil 比检查列表是否为空更有效......因此采用这种习惯用法作为标准可以带来更高性能的惯用代码
请注意,Clojure 中仍有一些函数确实返回空列表。一个例子是休息:
(rest [1])
=> ()
这个 question on rest vs. next 详细说明了为什么会这样......
关于clojure - 为什么 Clojure 习惯用法更喜欢返回 nil 而不是像Scheme 那样返回空列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6045404/