Из руководства по clojure о seq
мы читаем: ;; (seq x) is the recommended idiom for testing if a collection is not empty
(every? seq ["1" [1] '(1) {:1 1} #{1}])
;;=> true
. Но пустая коллекция также возвращает nil
, так какой смысл использовать seq
для проверки пустоты коллекции?
Использование функции Seq в Clojure
Ответы (2)
Пустая коллекция не является ложной, поэтому в тесте не имеет значения, пуста она или нет:
(if '() "a" "b")
=> "a"
Итак, если вы хотите сделать что-то еще, если оно пустое:
(if (seq '()) "a" "b")
=> "b"
person
Diego Basch
schedule
15.08.2015
Из документов в верхней части этой страницы:
seq также работает со строками, собственными массивами Java (ссылочных типов) и любыми объектами, которые реализуют Iterable.
Таким образом, использование seq для проверки пустоты работает для любого из этих типов коллекций. Таким образом, вы получаете последовательный идиоматический способ проверки пустоты для любого из этих типов, как показано в примере.
Тот факт, что seq возвращает nil
как для пустой коллекции, так и для nil
, также упрощает проверку, в отличие от необходимости проверки на пустое или nil.
person
leeor
schedule
15.08.2015
nil
. Вероятно, вы имеете в виду нуль-каламбур, который работает в другом направлении: если у вас естьnil
и вы ищете последовательность, она будет действовать как пустая. Но не наоборот. В других lisps ваш пробег будет другим: Пустые коллекции отличаются от нулевых. Clojure не отождествляет nil и '(). - person Thumbnail   schedule 17.08.2015