我受到Clojure 1.5中的
同样地,我想创建一个类似的宏,应用于函数
例如,我找不到
有什么建议吗?
cond->
宏的启发。 同样地,我想创建一个类似的宏,应用于函数
map
。 然而,我不知道从哪里开始。例如,我找不到
cond->
的源代码。(可能是因为它还没有发布)有什么建议吗?
cond->
宏的启发。 map
。 然而,我不知道从哪里开始。cond->
的源代码。(可能是因为它还没有发布)这是 cond->
的源代码,链接在此:https://github.com/clojure/clojure/blob/master/src/clj/clojure/core.clj#L6742
(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
的一种模式。它们可以看作是对缩减函数的一种抽象。如果在没有集合的情况下调用Clojure的map
/filter
/reduce
(等等),将创建一个转换器。您可以使用comp
链接它们并在各种上下文(惰性、急切、可观察等)中使用它们。Rich Hickey的演讲是一个很好的入门指南。
map
”吗? - mobytemap
作为函数在一系列语句中的目的是使代码更易读,可以说是“同样的想法”。 - Zchpyvr