gpt4 book ai didi

clojure - 为什么 Clojure 习惯用法更喜欢返回 nil 而不是像Scheme 那样返回空列表?

转载 作者:行者123 更新时间:2023-12-02 07:10:55 30 4
gpt4 key购买 nike

来自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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com