2013-07-06 40 views
6

我在幾種情況下運行,我想在可選函數的對象上執行一系列操作。 「 - >」對於同一對象(例如(c(b(a x)))變爲( - > x a b c))的命令序列非常適用,除非某些操作是可選的。例如,假設我想做的事:clojure's - >(箭頭)操作符和可選操作

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

有沒有辦法做到這一點在中更加明確地使用類似的操作「 - >」?

回答

10

你可以用cond->做到這一點,用Clojure 1.5新引入的:

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

或者,更好,

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

含義,「拿x,將其穿過a,拍攝效果和通過b將其穿過(> (a x) 2),否則保持不變,最後拿出你已得到的結果,並通過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和子句解釋爲測試和表達式對,然後將線程x通過那些相應測試真實的exp。」 –

+0

Pallet的[thread-expr](https://github.com/pallet/thread-expr)有更多類似的fns。 – noahlz