我受到clojure's 1.5 cond->
macro.的启发
同样,我想创建一个同样想法的宏,应用于函数qazxsw poi。但是,我不知道从哪里开始。
例如,我找不到map
的来源。 (可能是因为它尚未发布)
有什么建议?
有cond->
cond->
的来源
托盘项目人员中有各种各样的https://github.com/clojure/clojure/blob/master/src/clj/clojure/core.clj#L6742,包括apply-map->,它看起来很接近,但并不完全是你想要的。
threading macros
也许会有足够的例子让你挑选出你需要的东西。
如果我理解 - 你想写一个宏,它接受一个部分函数调用的列表,并且对于每一个,将(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))
Here's a concrete example in JS.是另一种在Clojure中做这种事情的模式,它不仅仅适用于Transducers。它们是对reducer函数的抽象。 Clojure的map
/ map
/ filter
(等)如果在没有集合的情况下调用它将创建一个传感器。你可以用reduce
链接它们并在各种环境中使用它们(懒惰,渴望,可观察,无论如何)。 comp
对他们来说是一个很好的介绍。