2013-07-06 19 views
6

私はいくつかの状況で実行しました。ここでは、オプションの関数を持つオブジェクトに対して一連の演算を実行します。 " - >"は、いくつかの操作がオプションである場合を除いて、同じオブジェクト(例:(c(b(a x)))上の一連のコマンドにはうまく機能します( - > x a b c))。例えば、私がやってみたかったとします「 - >」clojure - >(arrow)演算子とオプションの演算

(c 
    (if (> (a x) 2) 
    (b (a x)) 
    (a x) 
    ) 
) 

明確な方法で同様の操作を使用していることを行うための方法はありますか?

答えて

10

あなたは新しくはClojure 1.5で導入され、cond->でそれを行うことができます。

(cond-> x 
    true  a 
    (> (a x) 2) b 
    true  c) 

または、より良い、

(-> x 
    a 
    (cond-> (> (a x) 2) b) 
    c) 

意味、「、xを取るaに通します、結果を取ると、 (> (a x) 2)の場合はbまでスレッドしてください。変更しない場合は、最後に取得したものを取り、cにスレッドしてください。

つまり

cond->は、それを通して、あなたの表現をスレッド化する代わりに、単一のフォームのを除いて、->ようなもので、テストはfalseyとテストがtruthyであればスレッドのために使用されている場合、フォームがスキップされ、テスト+形のペアを取る:

(cond-> x 
    test-1 form-1 
    test-2 form-2) 

;; if test-1 is truthy and test-2 is falsey, output is as if from 
(-> x test-1) 

;; if it's the other way around, output is as if from 
(-> x test-2) 

;; if both tests are truthy: 
(-> x test-1 test-2) 

;; if both tests are falsey: 
x 
+3

ちなみに、 'cond->'は私の個人的なチャンピオンであり、最も知られていないDocstringコンテストです。 –

+1

別の言い方をすると、「xと句を取り、句をtestとexprのペアとして解釈し、対応するテストが真実であるexprsを通してxをスレッド化します。 –

+0

パレットの[thread-expr](https://github.com/pallet/thread-expr)には、もっと類似したfnがあります。 – noahlz