2012-02-03 20 views
4

特定の条件が真であればマップに情報をプッシュするクロージャー機能があり、そのマップを別の関数のパラメータとして使用します。条件付きで関数を呼び出す慣用のクロージャ

私は以下のようなことがありますが、バー機能を繰り返し呼び出すと不調です。

したがって、(何か)がtrueの場合、bar関数を呼び出す前にoptsパラメータに余分なオプションを追加します。それ以外の場合は、渡します。

答えて

7

まず最初は、(あなたが実際にtrueの戻り値と1、たとえば、の戻り値を区別しようとしている場合を除き)(= true (something))は問題なく(something)で簡単に交換することができるということです。返り値のオプションがtruefalseの場合、(something)だけで正常に動作します。また、intoの代わりにmergeを使うこともできます。

あなたはそれが(something)がfalseの場合に、第2引数にnilで、mergeは非常に迅速に返す必要がありますが、不必要にmergeを呼び出す必要が、これは、同様に動作します

(bar (if (something) 
     (merge opts {:a b}) 
     opts)) 

を試みることができます。

(bar (merge opts 
      (when (something) 
       {:a b}))) 
+2

を書き込むことができ、あなたは 'のoptsに(バー((とき(何か){行うことができることを注意:ABを}))) '。 'into'の代わりに' merge'を使うこともできます。 – Jonas

+0

@Jonasありがとう - – Retief

0

条件コードを関数にリファクタリングします。次のようなものがあります:

(defn addAIfSomethig [opt] (if (something) (into opts {:a "A"}) opt)) 
(defn addBIfSomethig [opt] (if (something) (into opts {:b "B"}) opt)) 

次に、関数を使用して、bar use関数の呼び出しを変更する必要がある関数を修正します。

(defn foo [opt] 
    (let [modifiers (comp addAIfSomethig addBIfSomethig)] 
     (bar (modifiers opt)) 
    )) 
+0

私は本当に投票に感謝しますが、その理由をコメントとして追加するとawsomeになります – Ankur

+0

Clojureで 'camelCase'関数名を使用するのは慣用ではありません。 '(defn <* _-!magicalFruit!-_ *> [](+ 1 1))'と書くことができますが、コードを 'foo-bar' 、 'foo-bar?'、 'foo-bar!'、 'foo-> bar'のように、 –

+0

clojure(およびgeneral lisp)スタイルに関する情報をありがとう – Ankur

2

レシピの回答は大丈夫です。 ifは、単なる条件付き構成ではなく、Clojureの式であることに注意してください。したがって、戻り値を持って、あなたは、関数へのパラメータとして戻り値を使用することができます。

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

あなたはJavaで三項演算子と考えることができます。

0

のClojure 1.5ので、これは `` => {}({}ゼロに)ので

(cond-> opts (something) (merge {:a b})) 
関連する問題