Как проверить пустой вектор в Clojure

Какой лучший способ проверить пустой вектор в Clojure? Я ожидал, что это напечатает false:

(if [] "true" "false")

но это не так. Это делает:

(if (> (count []) 0) "true" "false")

но является громоздким - существует ли более короткая конструкция?

Ответ 1

Использовать стандартный предикат (empty? list)

Ответ 2

Наиболее распространенным способом, который я вижу в коде Clojure для проверки непустого списка, является использование seq. Это возвращает нуль, если коллекция пуста или действительный объект seq в противном случае.

Пример использования:

(seq [])
=> nil

(seq nil)
=> nil

(seq [1 2 3])
=> (1 2 3)         ;; note this is a "true value"

(if (seq [1 4 6]) "true" "false")
=> "true"

(if (seq []) "true" "false")
=> "false"

Вы также можете использовать empty?, чтобы протестировать противоположное (т.е. тест для пустого набора). Заметьте, что пусто? реализуется в исходном коде Clojure как (not (seq coll)), поэтому вы можете быть в безопасности, зная, что оба подхода в корне эквивалентны.

Ответ 3

В дополнение к ответу Mishadoff (что более читаемо) вы также можете сравнить с самим пустым списком (и сохранить два символа в длину):

(if (= () []) "true" "false")

Хммм... Я все еще думаю, что предпочитаю ответ Мишадоффа.