[英]Create a clojure map threading macro ( map-> )
我受到cond->
的1.5 cond->
宏的啟發。
同樣,我想創建一個具有相同想法的宏,並將其應用於函數map
。 但是,我不知道從哪里開始。
例如,我找不到cond->
的源。 (可能是因為尚未發布)
有什么建議么?
托盤項目中有各種各樣的線程宏 ,其中包括apply-map->看起來很接近,盡管並不完全是您想要的。
(letfn [(apply-map-
[arg f arg-coll]
`(let [arg# ~arg]
(apply ~f arg#
~@(butlast arg-coll)
(apply concat ~(last arg-coll)))))]
(defmacro apply-map->
"Apply in a threaded expression.
e.g.
(-> :a
(apply-map-> hash-map 1 {:b 2}))
=> {:a 1 :b 2}"
[arg f & arg-coll]
(apply-map- arg f arg-coll))
也許那里有足夠的示例供您選擇所需的內容。
如果我理解-您想編寫一個包含部分函數調用列表的宏,然后為每個宏添加map
(或apply map
)到開頭,並將前一個結果添加到結尾?
盡管這不能直接回答如何編寫該宏,但我想指出您有幾種選擇。
map
對於純函數始終如此:
(=
(map g (map f coll))
(map (comp g f) coll))
重構版本只遍歷一次集合,不需要進行中間集合。
這是線程的樣子:
(=
(->> coll
(map f)
(map g))
(map #(->> % f g) coll))
換能器是Clojure中進行這種事情的另一種模式,它不僅在map
。 它們是對reducer函數的抽象。 如果在沒有集合的情況下調用Clojure的map
/ filter
/ reduce
(等等),則會創建一個轉換器。 您可以將它們與comp
鏈接起來,並在各種上下文中使用它們(懶惰,渴望,可觀察,等等)。 Rich Hickey的演講很不錯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.