Я хочу записать функцию, которая возвратила бы булевскую переменную, верную, если данный набор не является пустым и ложным иначе.
Я мог или сделать
defn ..
(boolean (seq coll))
или
defn ..
(not (empty? coll))
Поскольку я плохо знаком с clojure, я был первоначально склонен пойти с № 2 (более читаемый), но clojure ссылка API для empty?
явно говорит, используют идиому (seq coll)
вместо (not (empty? coll))
, возможно, избегать двойного отрицания.
Я хочу знать то, что является clojure способом проверить, непуст ли набор, и возвратите истинную/ложную булевскую переменную.
Упомянутый вами отрывок из docstring empty?
означает, в частности, что такая nonempty?
никогда не должна быть необходимой или даже особенно полезной, потому что seq
всегда может заменить ее в булевых контекстах, что в чистом коде Clojure и происходит.
Если вы чувствуете, что вынуждены написать такую функцию, я скажу, что первый подход мне нравится больше. empty?
все равно построена на seq
, так что от ее вызова не уйти; просто приведение результата к булеву кажется более чистым, чем два захода через not
. Другие варианты смотрите, например, nil?
, false?
(я все же предпочитаю приведение).
Кстати, почему вы хотите написать это...? Возможно, для вызова метода Java с аргументом boolean
? В таком случае, я думаю, приведение хорошо выражает намерение.
Обновление: Пример, иллюстрирующий последний пункт:
Простой класс Java:
public class Foo {
public static boolean foo(boolean arg) {
return !arg;
}
}
Некоторый клиентский код Clojure:
(Foo/foo nil)
; => NullPointerException
(Foo/foo (boolean nil))
; => true
В дополнение к отличному ответу Михала Марчика, я отмечу, что существует специфическая функция not-empty:
http://clojure.github.io/clojure/clojure.core-api.html#clojure.core/not-empty
но она делает не совсем то, что вы просите. (Хотя она будет работать в большинстве ситуаций).
Not-empty возвращает nil, если коллекция пуста, и саму коллекцию, если коллекция не пуста. Для тестов предикатов это будет работать хорошо. Если вам действительно нужны значения true и false, то (not (empty? x)) - это то, что вам нужно.