갈루아의 반서재

맵은 키-값 쌍으로 구조화된 데이터를 저장하는데 많이 사용된다. 

맵은 중괄호 {} 로 둘러싸인다. 

1
2
3
user=> {:jam1 "strawberry" :jam2 "blackberry"}
{:jam1 "strawberry", :jam2 "blackberry"}
 
cs

get 함수로 값을가져온다. 

1
2
3
user=> (get {:jam1 "strawberry" :jam2 "blackberry"} :jam2)
"blackberry"
 
cs

키가 없을 경우 반환되는 값을 디폴트로 줄 수 있다. get 함수의 마지막 인수로 디폴트 값 주면 된다. 

1
2
3
4
 
user=> (get {:jam1 "strawberry" :jam2 "blackberry"} :jam3 "not found")
"not found"
 
cs

키자체를 함수로도 사용할 수 있다. 

1
2
3
4
 
user=> (:jam2 {:jam1 "strawberry" :jam2 "blackberry" :jam3 "marmalade"})
"blackberry"
 
cs

keys 함수는 맵의 키만을, vals 함수는 맵의 값만 반환한다.

1
2
3
4
5
6
 
user=> (keys {:jam1 "strawberry" :jam2 "blackberry" :jam3 "marmalade"})
(:jam1 :jam2 :jam3)
user=> (vals {:jam1 "strawberry" :jam2 "blackberry" :jam3 "marmalade"})
("strawberry" "blackberry" "marmalade")
 
cs


맵의 값 갱신하기 (update)

컬렉션의 값은 불변이기 때문에 갱신한다고 할 때는, 갱신된 값을 가지고 새로운 데이터 구조를 반환함을 의미한다. 

클로저의 존속적 데이터 구조는 구조 공유를 사용해 아주 효율적으로 생성된다. 

컬렉션을 변경하는 함수는 새로운 버전의 컬렉션을 반환한다. 


assoc 함수는 맵에 새로운 키-값 쌍을 결합한다.

1
2
3
4
5
 
user=> (assoc {:jam1 "red" :jam2 "black"} :jam1 "orange")
{:jam1 "orange", :jam2 "black"}
user=>
 
cs

dissoc 함수는 맵과 키를 인수로 받아 그 키-값 쌍이 제거된 새로운 맵을 반환한다.

1
2
3
4
5
 
user=> (dissoc {:jam1 "strawberry" :jam2 "blackberry"} :jam1 )
{:jam2 "blackberry"}
user=>
 
cs

merge 함수는 여러 맵의 키-값 쌍을 합치는 데 아주 편리하다. 

1
2
3
4
5
6
7
 
user=> (merge {:jam1 "red" :jam2 "black"}
  #_=> {:jam1 "orange" :jam3 "red"}
  #_=> {:jam4 "blue"})
{:jam1 "orange", :jam2 "black", :jam3 "red", :jam4 "blue"}
user=>
 
cs