Clojure 调用一系列函数并存储它们的 return 值

Clojure call series of functions and store their return values

我正在构建一个数据模式,并且在我的 clj 文件的底部有以下内容,它定义和处理模式和初始数据。每次调用下面调用的函数 d/transact.

(defn recreate-database []
  "To recreate db after running delete-database in bin/repl"
  (pt1-transact-schema)
  (pt1-transact-data)
  (pt2-transact-schema)
  (pt2-transact-data)
  (pt3-transact-schema)
  (pt3-transact-data))

默认情况下,我们只能看到最后一个表单的 return 值,但我想查看或保存六个函数调用中每一个的结果。

想知道这样做的好方法是什么。

想到了(map (comp println eval) [functions]),但那是不对的。

你可以试试这个:

(defn recreate-database []
  "To recreate db after running delete-database in bin/repl"

  (mapv #(%) [pt1-transact-schema
              pt1-transact-data
              pt2-transact-schema
              pt2-transact-data
              pt3-transact-schema
              pt3-transact-data]))

表达式 #(%) 是 lambda 函数的 shorthand 表示法,它接受一个参数,代表一个函数,并调用该函数。如果您觉得它更具可读性,您可以将该表达式替换为 (fn [f] (f)).

还有一个不错的功能组合函数叫做juxt:

user> ((juxt + - * /) 1 2)
;;=> [3 -1 2 1/2]

user> ((juxt (constantly 1) (constantly 2) (constantly 3)))
;;=> [1 2 3]

或者您的情况:

(def recreate-database (juxt pt1-transact-schema
                             pt1-transact-data
                             pt2-transact-schema
                             pt2-transact-data
                             pt3-transact-schema
                             pt3-transact-data))

使用 datomic,您只需要一个连接和一个 tx 数据列表。然后你可以使用 map 到 return 每个步骤的交易结果(即每个 tx-data):

(defn recreate-database [conn & tx-data]
  (->> tx-data
       (map (partial d/transact conn))
       doall))