Search

[학습] Threading macro

Tags
학습
Clojure
Published Date
2024/09/17

주제

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
복사

참조

다음 질문