주제
Clojure 학습
목표
•
Threading macro의 종류와 어떻게 사용하는지 익힌다
키워드
→ | →> | some -> | some →> |
cond → | cond →> | as → | |
정리
•
→
◦
쓰레드 퍼스트 매크로
◦
각 표현식의 첫번째 인자 위치로 이전 값을 전달
(-> 5
(+ 3)
(/ 2)
(- 1))
; 확장: (- (/ (+ 5 3) 2) 1)
; 결과: 3
; 실제 사용 예:
(-> "hello world"
.toUpperCase
(.replace "HELLO" "GOODBYE"))
; 결과: "GOODBYE WORLD"
Clojure
복사
•
→>
◦
쓰레드 라스트 매크로
◦
각 표현식의 마지막 인자 위치로 이전 값을 전달
(->> [1 2 3 4 5]
(map #(* % 2))
(filter even?)
(reduce +))
; 확장: (reduce + (filter even? (map #(* % 2) [1 2 3 4 5])))
; 결과: 30
; 실제 사용 예:
(->> (range 1 101)
(filter #(zero? (mod % 3)))
(map #(* % %))
(take 5))
; 결과: (9 36 81 144 225)
Clojure
복사
•
some
◦
조건부 쓰레딩 매크로
◦
nil을 만나면 즉시 평가를 중단하고 nil을 반환
(some-> {:a {:b {:c 42}}}
:a
:b
:c
(+ 1))
; 결과: 43
(some-> {:a {:b {:c 42}}}
:a
:x ; 존재하지 않는 키
:c
(+ 1))
; 결과: nil
Clojure
복사
•
cond
◦
조건부 쓰레딩 매크로
◦
조건이 참일 때만 단계를 실행
◦
거짓일 경우 지나간다
(let [x 1]
(cond-> x
true (+ 1)
false (* 42)
(> x 0) (- 3)))
; 결과: -1
; 실제 사용 예:
(defn process-number [n]
(cond-> n
(even? n) (/ 2)
(> n 10) (* 3)
(< n 0) -))
(process-number 12) ; 결과: 18
(process-number 5) ; 결과: 5
Clojure
복사
•
as
◦
임의의 위치에 이전 결과를 배치 할 수 있다
◦
처음은 초기값 그다음은 심볼을 받는다
▪
(as → 초기값 심볼)
(as-> 0 x
(inc x)
(/ 42 x)
(* 2 x))
; 결과: 84
; 실제 사용 예:
(as-> [:a :b :c] $
(map name $)
(zipmap $ (range))
(update $ "b" inc))
; 결과: {"a" 0, "b" 2, "c" 2}
Clojure
복사