Ответ 1
Использовать стандартный предикат (empty? list)
Какой лучший способ проверить пустой вектор в Clojure? Я ожидал, что это напечатает false:
(if [] "true" "false")
но это не так. Это делает:
(if (> (count []) 0) "true" "false")
но является громоздким - существует ли более короткая конструкция?
Использовать стандартный предикат (empty? list)
Наиболее распространенным способом, который я вижу в коде 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))
, поэтому вы можете быть в безопасности, зная, что оба подхода в корне эквивалентны.
В дополнение к ответу Mishadoff (что более читаемо) вы также можете сравнить с самим пустым списком (и сохранить два символа в длину):
(if (= () []) "true" "false")
Хммм... Я все еще думаю, что предпочитаю ответ Мишадоффа.