2014-09-18 2 views
0

맵에 대한 기본값 집합이 있는데 값이없고 저장된 기본값을 적용 할 수 있습니다.클로저의 스파 스 (sparse) 중첩 된 맵에서 기본값 설정

즉 내가 다음 입력

(def defaults {:config {:tablet {:urls [] :enable false}}}) 
(def stored {:config {:tablet {   :enable true }}}) 

있어 만약 내가 다음과 같은 결과를 만들 수 있도록하고 싶습니다.

   {:config {:tablet {:urls [] :enable true}}} 

따라서 저장된 값은 존재할 때 사용되지만 기본값은 해당 키가 존재하지 않을 때 사용됩니다. merge, merge-with merge, merge-with concat, merge-with conj 및 몇 가지 다른 주문을 시도했지만 아무 것도 작동하지 않는 것 같습니다. 하나는 이고, 일은 중첩의 최대 깊이를 알고 있다면 (merge-with (partial merge-with ... (partial merge-with merge) ...))이지만 꽤 해킹 된 것입니다. 마치 Clojuresque 코드에서 드문 것처럼 보이는 것처럼 간단한 해결책이있는 것처럼 보입니다. 다음의 라인을 따라

+1

[깊은 병합] (https://github.com/richhickey/clojure-contrib/blob/2ede388a9267d175bfaa7781ee9d57532eb4f20f/ src/main/clojure/clojure/contrib/map_utils.clj # L41) –

답변

2

뭔가 당신이 임의의 중첩지도를 병합 할 수 있도록해야합니다

(defn deep-merge [& ms] 
    (apply merge-with 
      (fn [& vs] 
      (if (every? map? vs) 
       (apply deep-merge vs) 
       (last vs))) 
      ms)) 

(deep-merge {:config {:tablet {:urls [] :enable false}}} 
      {:config {:tablet {   :enable true }}}) 
; => {:config {:tablet {:urls [], :enable true}}} 
관련 문제