从clojure中的普通lisp替换(null x)函数的惯用方法

Posted

技术标签:

【中文标题】从clojure中的普通lisp替换(null x)函数的惯用方法【英文标题】:idiomatic way to replace (null x) function from common lisp in clojure 【发布时间】: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)。 【参考方案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 测试。

【讨论】:

以上是关于从clojure中的普通lisp替换(null x)函数的惯用方法的主要内容,如果未能解决你的问题,请参考以下文章

Clojure快餐教程-运行在JVM上的Lisp方言

试玩儿Clojure

Clojure let vs Common Lisp let

何时在 clojure(或 lisp)中使用感叹号?

Clojure 的 Emacs/Swank/Paredit 教程

如何使clojure程序结构更容易识别?