簡體   English   中英

創建一個Clojure Map線程宏(map->)

[英]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))

這是JS中的具體示例。

傳感器

換能器是Clojure中進行這種事情的另一種模式,它不僅在map 它們是對reducer函數的抽象。 如果在沒有集合的情況下調用Clojure的map / filter / reduce (等等),則會創建一個轉換器。 您可以將它們與comp鏈接起來,並在各種上下文中使用它們(懶惰,渴望,可觀察,等等)。 Rich Hickey的演講很不錯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM