clojure的reducers如何为原生javascript对象/数组工作?

时间:2013-07-05 04:19:58

标签: clojure clojurescript

我只理解了reducers talk中的几个部分,一个是数据结构可以实现IReducible接口并且能够本地转换,而不是首先转换为LazySeq

我希望在本机javascript数组和对象的clojurescript中利用它,但我不太清楚从哪里开始。任何人都可以举例说明如何做到这一点吗?

1 个答案:

答案 0 :(得分:2)

在ClojureScript中,相关协议称为IReduce,并且已针对标准库中的数组实现。相关的extend-type表单是here(链接到目前最新的master提交)。

IKVReduce使用reduce-kv,地图参数也使用clojure.core.reducers/reduce

您可以为本机对象提供一个包装器,您希望以这种方式进行转换:

(defn wrap-as-reducible [obj]
  (reify
    IReduce
    (-reduce [this f]
      ...)
    (-reduce [this f init]
      ...)
    IKVReduce
    (-kv-reduce [this f init]
       ...)))

根据您的需要实施IReduceIKVReduce中的一个或两个。

通常直接为“本机对象”实现任一协议可能不是一个好主意,因为这相当于提供了一个默认情况,这将使得对可还原性的检查毫无意义等。