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参数中,否则我们只是将其传递给它.
首先,(= true (something))
可以简单地替换(something)
没有问题(除非你实际上试图区分返回值true
和返回值,比如说1
).如果返回值的选项是true
和false
,(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)