あなたは新しくは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
ちなみに、 'cond->'は私の個人的なチャンピオンであり、最も知られていないDocstringコンテストです。 –
別の言い方をすると、「xと句を取り、句をtestとexprのペアとして解釈し、対応するテストが真実であるexprsを通してxをスレッド化します。 –
パレットの[thread-expr](https://github.com/pallet/thread-expr)には、もっと類似したfnがあります。 – noahlz