Clojure函数实现序列

问题描述 投票:0回答:1

我具有以下功能来收集Daomic交易报告,此earlier question的输出。

(def recreate-database
  "Defines a function which when called will call each of the four given
   functions and return a collection containing the output of each."
  (juxt pt1-transact-schema
        pt1-transact-data
        pt2-transact-schema
        pt2-transact-data))

下一步是,每个函数本身可能不调用一个事务,而是调用一系列事务,因此所需的完整结果将是用于初始数据库构建的事务报告的嵌套集合。

我有以下内容,这是不合适的,因为从上面的recreate-database调用时,只有最后的交易报告通过,该函数当然只会返回其最终形式。

(defn pt1-transact-data []
  (d/transact conn {:tx-data pt1-user-data})
  (d/transact conn {:tx-data pt1-path-data})
  (d/transact conn {:tx-data pt1-series-data}))

所以我到达了下面

(defn pt1-transact-data []
  (map identity
    [(d/transact conn {:tx-data pt1-user-data})
     (d/transact conn {:tx-data pt1-path-data})
     (d/transact conn {:tx-data pt1-series-data})
     (d/transact conn {:tx-data pt1-path-series-data})]))

这很好,除了仍然有附带的复杂性。 map identity相对于此处的预期含义在语言上较低。

因此,我们只需要“ 实现序列”,所以我提取了:

(defn realize-all [coll] (map identity coll))

然后我想起了doall。在这里也可以使用它。

所以,这和doall一样吗?

我从(source doall)中注意到,它看起来并不相同,导致dorun,从而导致... recur

因此map identitydoalldorun在这里看起来起类似的作用。

这些等效吗?还有更多要说的吗?

clojure datomic
1个回答
1
投票

为什么不将其包装在矢量中?这似乎是最简单的解决方案:

(defn pt1-transact-data []
  [(d/transact conn {:tx-data pt1-user-data})
   (d/transact conn {:tx-data pt1-path-data})
   (d/transact conn {:tx-data pt1-series-data})])

否则,您可以使用mapv

(defn pt1-transact-data []
  (mapv (partial d/transact conn)
        [{:tx-data pt1-user-data}
         {:tx-data pt1-path-data}
         {:tx-data pt1-series-data}))
© www.soinside.com 2019 - 2024. All rights reserved.