如果测试成功或在Clojure中返回默认值,则返回值的惯用方法

时间:2015-11-15 13:56:35

标签: clojure

只有在测试成功时返回值的惯用方法是什么,否则返回默认值?我认为构建一个很简单,但我想知道是否有一个用于此目的的内置函数。

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

2 个答案:

答案 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)))

也许如果你告诉我你的用例是什么,我可以帮你更多吗?