2014-11-25 89 views
4

我有一個功能「my-func」,它處理地圖x它獲取作爲參數並返回一張地圖。處理過程非常漫長,因此我將其轉移到函數block-with-several-function-calls-on-x 如果傳入地圖包含:special-key,則應將附加的鍵值對添加到傳出地圖中。什麼是「做額外的東西,當...」的Clojure方式

(defn my-func [x] 
    (if (contains? x :special-key) 
    (assoc (block-with-several-function-calls-on-x x) 
      :extra-key true) 
    (block-with-several-function-calls-on-x x))) 

我真的想保持內my-funcblock-with-several-function-calls-on-x的代碼。我使用其他編程語言,我只是簡單地將該部分的輸出保存在一個變量中,並且(如有必要)之後添加附加部分並返回值。我被告知使用let不是「Clojuresque」。

那麼,將代碼傳遞給一個函數(就像我上面做的那樣)是唯一的方法?或者是一個do-additonal-stuff-to-output-of-second-block -function:

(defn my-func [x] 
    (do-additional-stuff-to-output-of-second-block 
    (when (contains? x :special-key) 
     (assoc :extra-key true)) 
    (block-with-several-function-calls-on-x x))) 
+0

「使用讓不是Clojuresque」 - 這是荒謬和搞笑的錯誤,並說這個人不太瞭解Clojure – noisesmith 2014-11-25 15:06:14

+0

也許有一些溝通不暢?例如,讓我們不創建「變量」。無論如何,執行此操作的標準方法是使用let。 – noisesmith 2014-11-25 15:13:05

回答

0

下面的選項可能比你目前一個更地道和簡潔。它避免了重複對block-with-several-function-calls-on-x函數的調用,並使用when來傳達條件中缺少備選項的含義。

(defn block-with-several-function-calls-on-x [x] 
    x) 

(defn my-func [x] 
    (into (block-with-several-function-calls-on-x x) 
     (when (contains? x :special-key) 
      {:extra-key true}))) 

(my-func {:bla 1 :special-key 2}) 
;= {:bla 1, :special-key 2, :extra-key true} 
(my-func {:bla 1}) 
;= {:bla 1} 
3

cond->cond->>->->>有條件的版本,並可能適合你的需要:

(defn my-func 
    [x] 
    (cond-> (block-with-several-function-calls-on-x x) 
    (contains? x :special-key) (assoc :extra-key true) 
    (contains? x :other-key) (dissoc :we-dont-need-this))) 

雖然,只有一個條件,這可能不是可讀性的縮影。

+0

現在,這是一個downvote我真的不明白... – xsc 2014-11-25 15:43:30

1

儘管你有意見,我會使用let

(defn my-func [x] 
    (let [ans (block-with-several-function-calls-on-x x)] 
    (if (contains? x :special-key) 
     (assoc ans :extra-key true) 
     ans))) 

注:

  • 你提到的唯一價值是布爾值。如果全部您的值是 布爾值,請使用set而不是map。
  • 如果不是,我懷疑你有錯誤(falsenil)值。在 他們的缺席,你可以用 (x :special-key)(:special-key x)替換(contains? x :special-key)
相關問題