Clojure函数实现一个序列

Clojure function to realise a sequence

我有以下功能来收集数据交易报告,这个的输出。

(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 似乎在这里起到类似的作用。

这些是等价的吗?还有什么好说的吗?

你为什么不把它包装在一个向量中?这似乎是最简单的解决方案:

(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}))