Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在clojure中的稀疏嵌套映射中设置默认值_Clojure - Fatal编程技术网

在clojure中的稀疏嵌套映射中设置默认值

在clojure中的稀疏嵌套映射中设置默认值,clojure,Clojure,我已经为地图设置了一组默认值,我希望能够获取任何没有这些值的存储地图并应用默认值 i、 e.如果我有以下输入 (def defaults {:config {:tablet {:urls [] :enable false}}}) (def stored {:config {:tablet { :enable true }}}) 我希望能够创建以下结果 {:config {:tablet {:urls [] :enable true}}} 因此,

我已经为地图设置了一组默认值,我希望能够获取任何没有这些值的存储地图并应用默认值

i、 e.如果我有以下输入

(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
,还有其他一些咒语,但似乎都不管用。一个有效的方法是,如果你知道嵌套的最大深度,
(与…部分合并)(与…部分合并)
,但这是相当粗糙的。似乎应该有一个更简单的解决方案,因为这在Clojuresque代码中似乎并不少见。

以下内容应该允许您合并任意深度嵌套的映射:

(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}}}