Skip to content

Living Clojure 03

Kyunggook Kim edited this page Aug 21, 2016 · 3 revisions

2장. 제어문과 함수형 변환

논리에 따라 흐름 제어하기

  • 데이터의 흐름을 제어하기 위해서는 논리연산이 필요하다.
  • Boolean 데이터 타입인 truefalse 값의 클래스를 확인해 보면,
  • 단지 자바의 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을 사용한다.
  • nilfalse만 논리적 거짓이고, 나머지는 모두 논리적 참이다.
(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? 함수의 실제 정의를 보면 ㅜnotseq를 사용한 것을 알 수 있다.
(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

- 흐름 제어 이용하기

함수를 만드는 함수

구조분해(destructuring)

지연(laziness)의 힘

재귀

함수형 프로그래밍에서의 데이터 변환

- 궁극의 map

- 궁극의 reduce

- 다른 유용한 데이터 처리 함수들

Clone this wiki locally