从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 let vs Common Lisp let