2015-08-23 6 views
2

Является ли Clojure логическим and отличным от нормального логического and (& &)? Почему это дает значениеЛогические И в Clojure

((and odd? #(> 10 %)) 6) 

and Нужно ли 2 истинных оператора для возврата true?

ответ

5

and необязательно возвращается true. Он фактически возвращает false или nil, если какой-либо из данных элементов false или nil. Если ни один из них не существует, он возвращает самый последний элемент (он не возвращает true).

В вашем случае and возвращает функцию #(> 10 %) (и ничего больше), которая затем применяется к 6, которая возвращает true. Это связано с тем, что обе функции не являются nil или false. Это как шаги будут работать:

((and odd? #(> 10 %)) 6) 
(#(> 10 %) 6) 
;; => true 

То, что вы ищете, чтобы составить предикатные функции:

((every-pred odd? #(> 10 %)) 6) ;; => false 

FYI: Существует также это дополнение «or»: some-fn.

+0

Но '(нечетное? 6)' Неверно. Почему он переходит к следующему выражению? Согласно определению логического и возвращает false, если его первый элемент возвращает false. – amirteymuri

+0

Это означает, что 'и' не оценивает (так, как я написал код) '(odd? 6)' AND '(> 10 6)'? Но вместо этого выглядит буквально для 'false' или' nil'? – amirteymuri

+0

'и' не знает о '6' и не выполняет функции. Если вы хотите создавать функции, у вас есть 'every-pred' и это дополнение' some-fn' – ClojureMostly

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