我有一個clojure函數,如果特定條件爲真,需要將信息推入地圖,將該地圖用作另一個函數的參數。有條件調用函數有條件地調用函數
我有以下幾點,但是對重複調用bar函數感覺很笨拙。因此,如果(某事)是真的,我們會在調用bar函數之前將其他選項添加到opts參數中,否則我們只是傳遞它。
我有一個clojure函數,如果特定條件爲真,需要將信息推入地圖,將該地圖用作另一個函數的參數。有條件調用函數有條件地調用函數
我有以下幾點,但是對重複調用bar函數感覺很笨拙。因此,如果(某事)是真的,我們會在調用bar函數之前將其他選項添加到opts參數中,否則我們只是傳遞它。
第一件事是(= true (something))
可以簡單地通過(something)
沒有問題更換(除非你實際上是嘗試的true
一個返回值,比如說,1
返回值來區分)。如果返回值的選項是true
和false
,則(something)
本身可以正常工作。你也可以使用merge來代替into,這可能會稍微清晰些。
你可以嘗試
(bar (if (something)
(merge opts {:a b})
opts))
這會工作爲好,儘管它需要調用merge
不必要時(something)
是假的,雖然與nil
的第二個參數,merge
應該很快返回。
(bar (merge opts
(when (something)
{:a b})))
將條件代碼重構爲函數。喜歡的東西:
(defn addAIfSomethig [opt] (if (something) (into opts {:a "A"}) opt))
(defn addBIfSomethig [opt] (if (something) (into opts {:b "B"}) opt))
然後在你的功能,你需要調用欄使用功能組成之前修改選擇。
(defn foo [opt]
(let [modifiers (comp addAIfSomethig addBIfSomethig)]
(bar (modifiers opt))
))
retief的答案沒錯。應該注意的是,if
是Clojure中的一個表達式,而不僅僅是一個條件構造。因此,它有一個返回值,你可以使用返回值作爲參數傳遞給函數:
(bar (if (something)
(into opts {:a b})
opts))
你可以把它作爲在Java中三元運算符。
注意,由於Clojure的1.5這個可以寫
(cond-> opts (something) (merge {:a b}))
由於'(進入{}無)=> {}',你可以做'(巴(進入OPTS(時(東西){:AB })))'。也可以使用'merge'而不是'into'。 – Jonas 2012-02-04 05:39:31
@Jonas謝謝 - 更新 – Retief 2012-02-04 05:44:27