-
Couldn't load subscription status.
- Fork 8
Living Clojure 03
Kyunggook Kim edited this page Aug 21, 2016
·
3 revisions
- 데이터의 흐름을 제어하기 위해서는 논리연산이 필요하다.
- Boolean 데이터 타입인
true와false값의 클래스를 확인해 보면, - 단지 자바의 java.lang.Boolean이라는 것을 알게 된다.
(class true)
;=> java.lang.Boolean- 함수의 결과가 Boolean 값인지 확인하는 함수는
true?,false?이다. - 클로저에서는 함수 이름 맨 끝에 물음표를 붙이면 결과가 Boolean값이라는 걸 관례로 표시한다.
(true? true)
;=> true
(true? false)
;=> false
(false? false)
;=> true
(false? true)
;=> false- 값이 없음을 검사하는 경우
nil?을 사용한다.
(nil? nil)
;=> true
(nil? 1)
;=> false- 부정(
negation)은ㅜnot을 사용한다. -
nil과false만 논리적 거짓이고, 나머지는 모두 논리적 참이다.
(not true)
;=> false
(not false)
;=> true
(not nil)
;=> true
(not "hi")
;=> false- 비교는 등호 기호(
=)를 사용한다. -
=함수는 자바의 equals 메서드와 같다.
(= :drinkme :drinkme)
;=> true
(= :drinkme 4)
;=> false
(= `(:drinkme :bottle) [:drinkme :bottle])
;=> true
;; (not (= x y))의 단축형은 not=
(not= :drinkme :4)
;=> true- 기본적인 논리 검사 정리
-
true?는true값인지 검사한다. -
false?는false값인지 검사한다. -
nil은 논리적 거짓으로 취급된다. -
nil?은 값이 없음을 검사한다. -
not은 값의 부정을 반환한다. -
=은 동등임을 검사한다. -
not=은 동등이 아님을 검사한다.
-
-
empty?를 사용하면 벡터와 리스트, 맵, 집합이 비었는지 확인할 수 있다.
(empty? [:table :door :key])
;=> false
(empty? []) ;; 벡터
;=> true
(empty? {}) ;; 맵
;=> true
(empty? `()) ;; 리스트
;=> true-
empty?함수의 실제 정의를 보면ㅜnot과seq를 사용한 것을 알 수 있다.
(defn empty? [coll]
(not (seq coll)))- 클로저에는 컬렉션 추상과 시퀀스 추상이 있다.
- 컬렉션은 벡터, 리스트, 맵처럼 단순히 요소를 모아놓은 것이다.
- clojure.lang.IPersistentCollection 인터페이스를 구현한 존속적, 불변적 자료구조를 말한다.
- 이를 통해
count,conj,seq와 같은 함수들을 공유한다. -
seq함수는 컬렉션을 시퀀스로 바꾸어 준다. - 시퀀스 추상은 컬렉션을 리스트처럼 순차적으로 다룰 수 있게 해준다.
- 시퀀스들도 존속적, 불변적이며
first,rest,cons함수를 공유한다. -
seq함수는 컬렉션을 받아서 시퀀스로 반환하는데, 빈 컬렉션이면nil을 반환한다.
(seq [1 2 3])
;=> (1 2 3)
(class [1 2 3])
;=> clojure.lang.PersistentVector
(class (seq [1 2 3]))
;=> clojure.lang.PersistentVector$ChunkedSeq
(seq [])
;=> nil