Использование функции Seq в Clojure

Из руководства по 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 для проверки пустоты коллекции?


person Community    schedule 15.08.2015    source источник
comment
Пустая коллекция не возвращает nil. Вероятно, вы имеете в виду нуль-каламбур, который работает в другом направлении: если у вас есть nil и вы ищете последовательность, она будет действовать как пустая. Но не наоборот. В других lisps ваш пробег будет другим: Пустые коллекции отличаются от нулевых. Clojure не отождествляет nil и '().   -  person Thumbnail    schedule 17.08.2015


Ответы (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