我試圖找到一種方法來通過函數列表線程值。如何將一個列表傳遞給clojure的` - >`宏?
首先,我有一個常用的基於環代碼:
(defn make-handler [routes]
(-> routes
(wrap-json-body)
(wrap-cors)
;; and so on
))
但是,這不是最佳的,因爲我想寫一個測試,以檢查路由實際上總結CORS包裹。我決定將這些包裝解壓縮成一個def。因此,代碼變成如下:
(def middleware
(list ('wrap-json-body)
('wrap-cors)
;; and so on
))
(defn make-handler [routes]
(-> routes middleware))
這顯然不工作,不應該爲->
宏不拿名單的第二個參數。所以我試圖用apply
功能來解決:
(defn make-handler [routes]
(apply -> routes middleware))
最終與保釋出來:
CompilerException了java.lang.RuntimeException:無法採取的宏觀 值:#」 clojure.core/- >
於是問題出現了:一個人如何傳遞值的列表中->
宏(或者說,任何其他宏)作爲一個將與apply
的功能嗎?
也許這是一個重複和[在clojure中,如何將宏應用於列表?](https://stackoverflow.com/questions/9273333/in-clojure-how-to-apply-a-macro-一個清單)回答你的問題。 – sloth
@sloth,謝謝你指出一個。雖然它提供了關於如何解決問題的一些想法,但我更喜歡leetwinsky的答案,因爲它更符合我的口味和乾淨。 – eploko
' - >'的要點是讓代碼更易於閱讀。但是,如果你只是寫一個新的宏,以便你可以使用' - >'(在代碼中你永遠不會看到,因爲它只存在於宏擴展中),但我沒有看到這一點。本着從不使用宏的精神,我建議採用以下解決方案:'(減少#(%2%)路由中間件)' – galdre