【发布时间】:2014-03-02 22:12:57
【问题描述】:
empty? 的文档字符串说“请使用成语 (seq x) 而不是 (not (empty?x))”。 MisterMetaphor 指出在if-let 中使用seq 作为谓词是有意义的:
(if-let [s (seq might-be-empty)]
(fn-for-non-empty-seq s)
(fn-for-empty-seq))
我真的应该使用seq 来测试一般的非空性吗? seq 可以将其参数转换为不同的形式。例如:
user=> (class (lazy-seq '(1 2 3)))
clojure.lang.LazySeq
user=> (class (seq (lazy-seq '(1 2 3))))
clojure.lang.PersistentList
user=> (class (map inc [1 2 3]))
clojure.lang.LazySeq
user=> (class (seq (map inc [1 2 3])))
clojure.lang.ChunkedCons
如果只是想测试非空,不需要新的绑定,或者我不需要在绑定之前进行转换,这似乎是浪费周期。在这种情况下,not-empty 不是更好的选择吗?如果其参数为空,则返回nil,如果非空,则其参数不变。
(if (not-empty [])
"more to do"
"all done")
【问题讨论】:
标签: clojure