只有在测试成功时返回值的惯用方法是什么,否则返回默认值?我认为构建一个很简单,但我想知道是否有一个用于此目的的内置函数。
(def a {:name "foo"})
(if (map? a) a {})
; {:name "foo"}
(def b "bar")
(if (map? b) b {})
; {}
; is there a built-in function that looks like this?
(get-if map? b {})
答案 0 :(得分:2)
如果可能的话,通常最好使用函数而不是宏:
(defn get-if [pred v default]
(if (pred v) v default))
答案 1 :(得分:1)
编写宏非常简单。我不相信这是惯用的,因为它增加了额外的抽象层而不增加可读性。读这样的代码的人必须查看宏以找出正在发生的事情而不是简单的if。
宏:
(defmacro get-if
[p v d]
`(let [val# ~v]
(if (~p val#)
val#
~d)))
也许如果你告诉我你的用例是什么,我可以帮你更多吗?