首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >创建一个clojure映射线程宏( map-> )

创建一个clojure映射线程宏( map-> )
EN

Stack Overflow用户
提问于 2013-01-10 08:20:11
回答 3查看 1.1K关注 0票数 2

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

类似地,我想创建一个具有相同想法的宏,应用于函数map。然而,我不知道从哪里开始。

例如,我找不到cond->的源代码。(可能是因为它还没有发布)

有什么建议吗?

EN

回答 3

Stack Overflow用户

发布于 2013-01-10 09:33:56

Stack Overflow用户

发布于 2013-01-10 10:01:24

托盘项目人员提供了各种应用程序,包括threading macros -map->,它看起来很接近,但并不完全是您想要的。

代码语言:javascript
复制
(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))

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

票数 2
EN

Stack Overflow用户

发布于 2019-04-25 03:30:26

如果我理解的话--您想要编写一个宏,它接受部分函数调用的列表,并且对于每个调用,将map (或apply map)添加到开头,将前面的结果添加到结尾?

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

排除map因素

对于纯函数来说,这总是正确的:

代码语言:javascript
复制
(=
  (map g (map f coll))
  (map (comp g f) coll))

重构后的版本只遍历集合一次,并且不需要创建中间集合。

下面是使用线程时的样子:

代码语言:javascript
复制
(=
  (->> coll
       (map f)
       (map g))

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

Here's a concrete example in JS.

传感器

Transducers是在map之外的另一种在Clojure中做这类事情的模式。它们在某种程度上是reducer函数的抽象。Clojure的map / filter / reduce (等)如果在没有集合的情况下调用,将创建一个换能器。您可以将它们与comp链接在一起,并在各种上下文中使用它们(懒惰、急切、可观察等等)。它们上的Rich Hickey's talk是一个很好的介绍。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14248832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档