【问题标题】:Clojure call series of functions and store their return valuesClojure 调用一系列函数并存储它们的返回值
【发布时间】:2020-05-06 13:32:53
【问题描述】:

我正在构建一个 datomic 架构,并在我的 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))

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

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

想过(map (comp println eval) [functions])之类的东西,但那不对。

【问题讨论】:

    标签: clojure datomic


    【解决方案1】:

    还有一个不错的函数组合函数,叫做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))
    

    【讨论】:

    • 最优雅的解决方案。我注意到juxt 是高阶函数,上面的def(注意它不是defn)返回一个函数(因为这是juxt 所做的),然后必须调用它,例如(recreate-database)。美丽...
    【解决方案2】:

    你可以试试这个:

    (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 函数的简写符号,它接受一个参数,表示一个函数,然后调用该函数。如果您觉得它更具可读性,可以将该表达式替换为 (fn [f] (f))

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 这很酷。我需要它不要在一个事务中插入所有内容,因为我目前依赖txInstant 而不是我的一些数据的具体域时间(可能会改变这一点),并且需要不同的 tx 时间来测试域逻辑,但是我看到这个小小的 fn 将处理它单独给出的每张地图。 (tx-data 实际上是 :tx-data 映射 datomic 期望的列表)。绝妙的解决方案!
      猜你喜欢
      • 1970-01-01
      • 2015-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多