Строка документации для empty?
гласит: «Пожалуйста, используйте идиому (seq x) вместо (not (пусто? x))». MisterMetaphor указывает, что использование seq
в качестве предиката может иметь смысл при использовании в if-let
:
(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")