【问题标题】:idiomatic way to replace (null x) function from common lisp in clojure从clojure中的普通lisp替换(null x)函数的惯用方法
【发布时间】:2011-03-15 07:46:13
【问题描述】:

在 Common Lisp 中,您使用 (null x) 函数来检查空列表和 nil 值。

从逻辑上讲,这映射到

(or (nil?  x) (= '() x))

在clojure中。有人可以建议在 Clojure 中使用更惯用的方法吗?

【问题讨论】:

  • 在 Lisp 中,NIL()(空列表)是一回事。您的代码 sn-p 是一个 pleonasm。
  • 不在 Clojure 中:(= '() nil) => false。在其他 Lisp 中,这是真的。
  • Svante:你的说法在 Clojure 中可能不是真的,但我有一个新的喜欢的词。
  • 没有空?在 CL 中,只有 null(和 endp)。

标签: clojure lisp common-lisp idioms


【解决方案1】:

在 Clojure 中获得与在 Common Lisp 中相同的结果,请使用 empty? 函数。此函数在核心库中:不需要导入。

它也是一个谓词,并以 ? 为后缀,让您在代码中的具体操作更加清晰。

=> (empty? '())
true
=> (empty? '(1 2))
false
=> (empty? nil)
true

正如 j-g faustus 已经指出的那样,seq 可以用于类似的效果。

【讨论】:

  • 您的答案更好,因为它也适用于向量、地图、字符串等,而无需将它们转换为 seq。我想如果你有一个未知类型的参数并且想要对 seq 进行操作,seq 方法是合适的。
  • j-g-faustus:我希望。定义为(defn empty? [coll] (not (seq coll)))
  • 哈,哇,真不敢相信我们错过了。两年后,但绝对值得在这里了解和拥有。
  • 引用链接:Clojure empty? function documentation。通过展开 Source 框查看源代码。
【解决方案2】:

seq 也可以作为 end 的测试, 已经习惯了

(when (seq coll)
  ...)

来自clojure.org lazy

因为(seq nil)(seq ()) 都返回nil,所以它有效。

由于nil 表示false,因此您不需要显式的 nil 测试。

【讨论】:

    猜你喜欢
    • 2015-11-13
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 2022-11-27
    • 2016-10-31
    • 2010-12-08
    • 1970-01-01
    相关资源
    最近更新 更多