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))
我正在构建一个数据模式,并且在我的 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))