給出一個->>
管道,像這樣:條件元素>>管道
(defn my-fn []
(->> (get-data)
(do-foo)
(do-bar)
(do-baz)))
我願提出不同階段的條件。
來考慮寫這的第一個方法是這樣:
(defn my-fn [{:keys [foo bar baz]}]
(->> (get-data)
(if foo (do-foo) identity)
(if bar (do-bar) identity)
(if baz (do-baz) identity))
然而,隨着->>
宏試圖插入if
形式,這不僅看起來不幸在性能方面(有noop identity
調用),但實際上無法編譯。
什麼是適當的,合理的DRY寫作方式?
'get-data'是否會像' - >>'通常使用的那樣返回一個序列? 'do-'函數是否會調用副作用,或者獲取/返回什麼? – 2012-08-01 22:31:50
看起來不太可能,如果在線程調用中會以任何可感知的方式損害性能 – 2012-08-01 22:49:00
@AlexTaggart是的,'get-data'返回一個序列 - 可能是一個很長的序列,使得它成爲一個內部循環。 'do- *'功能是純粹的,沒有副作用;也許我在這個例子中糟糕的命名了代碼。 – 2012-08-01 22:55:47