创建一个clojure贴图线程宏(map->)

问题描述 投票:2回答:3

我受到clojure's 1.5 cond-> macro.的启发

同样,我想创建一个同样想法的宏,应用于函数qazxsw poi。但是,我不知道从哪里开始。

例如,我找不到map的来源。 (可能是因为它尚未发布)

有什么建议?

clojure
3个回答
3
投票

cond-> cond->的来源


2
投票

托盘项目人员中有各种各样的https://github.com/clojure/clojure/blob/master/src/clj/clojure/core.clj#L6742,包括apply-map->,它看起来很接近,但并不完全是你想要的。

threading macros

也许会有足够的例子让你挑选出你需要的东西。


1
投票

如果我理解 - 你想写一个宏,它接受一个部分函数调用的列表,并且对于每一个,将(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)添加到开头,将前一个结果添加到结尾?

虽然这并没有直接回答如何编写宏,但我想指出你有几个选择。

Factor out apply map

对于纯函数,这总是如此:

map

重构版本仅对集合进行一次处理,并且不需要进行中间集合。

这是线程的样子:

(=
  (map g (map f coll))
  (map (comp g f) coll))

(= (->> coll (map f) (map g)) (map #(->> % f g) coll))

Transducers

Here's a concrete example in JS.是另一种在Clojure中做这种事情的模式,它不仅仅适用于Transducers。它们是对reducer函数的抽象。 Clojure的map / map / filter(等)如果在没有集合的情况下调用它将创建一个传感器。你可以用reduce链接它们并在各种环境中使用它们(懒惰,渴望,可观察,无论如何)。 comp对他们来说是一个很好的介绍。

© www.soinside.com 2019 - 2024. All rights reserved.