이 문서는 Clojure 1.11.0 버전을 기준으로 합니다.

타입

Clojure의 truefalsejava.lang.Boolean 타입이다.

(type true)  ; java.lang.Boolean
(type false) ; java.lang.Boolean

boolean? 함수는 주어진 타입이 Boolean이면 true를 리턴한다.

(boolean? true) ; true
(boolean? 123)  ; false

=

= 함수는 주어진 값들이 같으면 true를 리턴한다.

(= true true) ; true
(= 1 1 1)     ; true

여러 값이 주어졌을 때에는 하나라도 다른 값이 있다면 false를 리턴한다.

(= 1 1 2) ; false

= 함수는 Java의 equals 메소드를 사용한다는 점을 기억해 두자.

;equals-based
#_(defn =
  "Equality. Returns true if x equals y, false if not. Same as Java
  x.equals(y) except it also works for nil. Boxed numbers must have
  same type. Clojure's immutable data structures define equals() (and
  thus =) as a value, not an identity, comparison."
  {:inline (fn [x y] `(. clojure.lang.Util equals ~x ~y))
   :inline-arities #{2}
   :added "1.0"}
  ([x] true)
  ([x y] (clojure.lang.Util/equals x y))
  ([x y & more]
   (if (= x y)
     (if (next more)
       (recur y (first more) (next more))
       (= y (first more)))
     false)))

여기에서 ([x y] (clojure.lang.Util/equals x y))을 주목하자.

clojure.lang.Util.equals는 이렇게 생겼다.

static public boolean equals(Object k1, Object k2){
  if(k1 == k2)
    return true;
  return k1 != null && k1.equals(k2); // equals를 사용한다
}

not

not 함수는 ture가 주어지면 false를 리턴하고, false가 주어지면 true를 리턴한다. 다른 언어처럼 !을 사용하지 않으니 주의.

(not true)  ; false
(not false) ; true

(not 1)     ; false
(not 0)     ; false
(not "foo") ; false
(not nil)   ; true ; Clojure에서는 false와 nil 만 false로 평가된다.

not 함수의 소스코드는 다음과 같다.

(defn not
  "Returns true if x is logical false, false otherwise."
  {:tag Boolean
   :added "1.0"
   :static true}
  [x] (if x false true))

not=

not= 함수는 하나라도 다른 값이 섞여 있다면 true를 리턴한다.

(not= 1 1 2) ; true
(not= 1 2 3) ; true

(not= 1 1 1)       ; false
(not= nil nil nil) ; false

(not= false false false) ; false
(not= true true true)    ; false

true?, false?

true? 함수는 주어진 값이 true이면 true를 리턴한다.

(true? true)
=> true
(true? false)
=> false

false? 함수는 주어진 값이 false이면 true를 리턴한다.

(false? true)
=> false
(false? false)
=> true

false? 함수의 소스코드는 다음과 같다.

(defn false?
  "Returns true if x is the value false, false otherwise."
  {:tag Boolean,
   :added "1.0"
   :static true}
  [x] (clojure.lang.Util/identical x false))

주어진 값 xfalseidentical로 비교하고 있다.

참고로 identical은 단순히 Java의 == 연산자를 사용한다.

static public boolean identical(Object k1, Object k2){
  return k1 == k2;
}

and

and는 이렇게 사용한다.

(and true true)   ; true
(and false false) ; false
(and true false)  ; false

(and true true false) ; false
(and true true true) ; true

and는 하나하나 비교해가다가 true로 평가되지 않는 값(falsenil)이 나오면 그 값을 리턴한다.

(and true true nil true) ; nil
(and true true nil false true) ; nil
(and true true false nil true) ; false

or

or은 이렇게 사용한다.

(or true true)   ; true
(or false true)  ; true
(or false false) ; false
(or false false true) ; true

or도 하나하나 비교해가다가 true로 평가되는 값이 나오면 그 값을 바로 리턴한다.

(or false false 0) ; 0
(or false false 1) ; 1
(or 1 false)       ; 1

참고문헌