User Tools

Site Tools


tips:clojure:컬렉션_잘_사용하기

empty?

(not (empty? some-collection)) 

보다는

(seq {}) ;=> nil
(seq []) ;=> nil
(seq ()) ;=> nil
(seq nil) ;=> nil

assoc으로 벡터 갱신

벡터는 인덱스를 키로 하는 맵.

(def v [1 2 3])
(assoc v 0 -12 1 4 2 :p 3 'k)
;=> [-12 4 :p k]

컬렉션 함수와 키워드/심볼 함수

컬렉션은 함수다

([:a :b :c] 2)
;= :c
({:a 5 :b 6} :b)
;= 6
({:a 5 :b 6} :c 7)
;= 7
(#{1 2 3} 3)
;= 3

키워드/심볼은 함수다

(:b {:a 5 :b 6})
;= 6
(:c {:a 5 :b 6} 7)
;= 7
(:d #{:a :b :c})
;= nil

컬렉션보다는 키워드/심볼

(defn get-foo [map]
  (:foo map))
;= #'user/get-foo
(get-foo nil)
;= nil
(defn get-bar [map]
  (map :bar))
;= #'user/get-bar
(get-bar nil)
;= #<NullPointerException java.lang.NullPointerException>

컬렉션의 경우 예외를 발생하지만, 키는 단지 nil을 리턴한다. 게다가 위 코드에서 map이 실제 컬렉션이 아닌 경우에도 예외가 발생할 것이다. 물론 키가 키워드나 심볼이 아니고 스트링이나 수이면 컬렉션을 함수로 사용하는 것이 좋을 것이다.

고계함수에서 사용하기

((juxt :a :b) {:a 1 :b 2 :c 3 :d 4})
;=> [1 2]
(map :name [{:age 21 :name "David"}
            {:gender :f :name "Suzanne"}
            {:name "Sara" :location "NYC"}])
;= ("David" "Suzanne" "Sara")
(some #{1 3 7} [0 2 4 5 6])
;= nil
(some #{1 3 7} [0 2 3 4 5 6])
;= 3
(filter :age [{:age 21 :name "David"}
              {:gender :f :name "Suzanne"}
              {:name "Sara" :location "NYC"}])
;= ({:age 21, :name "David"})
 
(filter (comp (partial <= 25) :age) [{:age 21 :name "David"}
                                     {:gender :f :name "Suzanne" :age 20}
                                     {:name "Sara" :location "NYC" :age 34}])
;= ({:age 34, :name "Sara", :location "NYC"})
tips/clojure/컬렉션_잘_사용하기.txt · Last modified: 2019/02/04 14:26 (external edit)