2015-08-15 3 views
2

От manual of 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

+4

'(=() nil) ---> false' – lispHK01

+0

Пустая коллекция делает * not * return' nil'. Вероятно, вы думаете о nil-punning, который работает в другом направлении: если у вас есть «nil», и вы ищете последовательность, она будет действовать как пустая. * Но не наоборот *. В [other lisps] (http://clojure.org/lisps) ваш пробег будет варьироваться: * Пустые коллекции отличны от нуля. Clojure не приравнивает nil и '(). * – Thumbnail

ответ

3

пустая коллекция не falsey, поэтому в тесте не будет иметь значения, если он пустой или нет:

(if '() "a" "b") 
=> "a" 

Так что, если вы хотите сделать что-то другое, если он пуст:

(if (seq '()) "a" "b") 
=> "b" 
3

Из документов в верхней части этой страницы:

далее также работает на нитях, родной Java массивы (ссылочных типов) и любые объекты, которые реализуют Iterable

Таким образом, используя сл для проверки работы пустоты по любому из этих типов коллекций. Таким образом, вы получаете последовательный идиоматический способ проверки пустоты на любом из этих типов, как демонстрирует пример.

Тот факт, что seq возвращает nil как на пустую коллекцию, так и на nil, делает проверку более простой, а не проверяет наличие пустого или нулевого.

Смежные вопросы