习惯性的clojure有条件地调用函数

Tob*_*ede 4 idioms idiomatic clojure

我有一个clojure函数,如果特定条件为真,需要将信息推送到地图中,使用该映射作为另一个函数的参数.

我有以下内容,但是对条形函数的重复调用感觉很笨拙.

(defn foo ([opts]

  (if (= true (something))       
    (bar (into opts {:a b}))
    (bar opts)))

(def bar [opts])
Run Code Online (Sandbox Code Playgroud)

因此,如果(某些)是真的,我们在调用bar函数之前将额外的选项推送到opts参数中,否则我们只是将其传递给它.

Ret*_*ief 7

首先,(= true (something))可以简单地替换(something)没有问题(除非你实际上试图区分返回值true和返回值,比如说1).如果返回值的选项是truefalse,(something)它本身将正常工作.您也可以使用merge而不是into,这可能会更加清晰.

你可以试试

(bar (if (something)
       (merge opts {:a b})
       opts))
Run Code Online (Sandbox Code Playgroud)

这也可以工作,虽然它涉及merge不必要时调用(something)false,尽管nil对于第二个参数,merge应该很快返回.

(bar (merge opts
            (when (something)
              {:a b})))
Run Code Online (Sandbox Code Playgroud)

  • 由于`(into {} nil)=> {}`,你可以做`(bar(进入opts(when(something){:ab})))`.也可以使用`merge`而不是`into`. (2认同)