2015-04-12 3 views
4

Схема поддерживает boolean?, чтобы проверить, имеет ли символ или значение логический тип.Что такое эквивалент boolean? в Clojure

(boolean? #\t) 
(boolean? #\f) 

В то время как в Clojure, я могу найти только integer?, number?, list?, и т.д., но без boolean?.

Что представляет собой эквивалент boolean? в Clojure?

+3

Имейте в виду, что 'true' - не единственное истинное значение, а' false' - не единственное ложное значение. Вы, наверное, это знаете. Это просто предупреждение для новичков, читающих это позже. – Mars

ответ

10

вы могли бы сделать

(defn boolean? [x] 
    (instance? Boolean x)) 
1

Если вы в земле типов, и вы хотите знать, если что-то логическое значение, то, как Шломи выложила вы можете сделать boolean? функцию достаточно легко из instance?. Вот версия переменных аргументов:

(defn bools? 
    [& xs] 
    (every? (partial instance? Boolean) xs)) 

с выходами:

>> (bools? true) => true 
>> (bools? true false) => true 
>> (bools? true nil) => false 

Я никогда не нуждался, чтобы сделать это, так как я только когда-либо дело с ценностями и тем фактом, что все в Clojure является «truthy "за исключением ложных или ноль.

4
  • В Clojure все значения являются логическими: действительные первые аргументы для if form и всего его потомства. В этом смысле все логично.
  • Единственные ошибочные значения - это nil и false. Хотя
    Boolean/FALSE, статический объект, содержащий false, и (Boolean. false) - новый объект Boolean, содержащий false - оценить false. Последнее не соответствует тому, как я читаю документацию, но это , что показывает мне светлая таблица. Я бы сказал, избегайте создания вашего собственных Boolean. Почему Java позволяет это, я не могу понять.
  • Я никогда не сталкивался с ситуацией, когда логика требовала знания , было ли что-то в наборе #{true false}. Если вам нужно это сделать, следовать Shlomi's advice.
  • Многие стандартные функции производят nil для ничего или отказ. Например, для примера набор, примененный к нечлену. В таких случаях вы можете найти самостоятельно, используя nil? для проверки на nil, особенно там, где false будет действительным и отличным значением.
+0

Хотя в общем случае необходимость в этом не представляется допустимой, в одном случае, когда нужно было бы это сделать, необходимо ввести в программу параметр командной строки, такой как флаг отладки. В таком случае кодер хотел бы убедиться, что пользователь четко установил истинное значение и не предоставил случайно не ошибочное значение. – Don

8

Еще одна версия:

(defn boolean? [x] 
    (or (true? x) (false? x))) 
+0

Есть ли значение x, которое может заставить эту функцию возвращать false? Я бы подумал, что бы вы ни дали, это вернет истину. false false, null - это ложь, и все остальное, что вы могли бы дать, правдиво. –

+2

Каждое значение, за исключением Boolean.TRUE и Boolean.FALSE, возвращает эту функцию false. Прочтите документы об истинности? и false ?. Они предназначены для того, чтобы отличить правду от реальных булевых значений. –

+1

Это замечательно, и я тоже работаю над Clojurescript (я просто тестировался в cljs и clj REPL). –

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