【发布时间】:2015-05-07 21:53:07
【问题描述】:
在 clojure 中设置默认值的惯用方法是使用合并:
;; `merge` can be used to support the setting of default values
(merge {:foo "foo-default" :bar "bar-default"}
{:foo "custom-value"})
;;=> {:foo "custom-value" :bar "bar-default"}
然而,实际上,默认值通常不是简单的常量,而是函数调用。显然,如果不使用该函数,我想避免调用它。
到目前为止,我正在做类似的事情:
(defn ensure-uuid [msg]
(if (:uuid msg)
msg
(assoc msg :uuid (random-uuid))))
并应用我的ensure-* 函数,例如(-> msg ensure-uuid ensure-xyz)。
有什么更惯用的方法来做到这一点?我在想这样的事情:
(merge-macro {:foo {:bar (expensive-func)} :xyz (other-fn)} my-map)
(associf my-map
[:foo :bar] (expensive-func)
:xyz (other-fn))
【问题讨论】:
标签: clojure