在 clojure 中重新加载一个 val

Reload a val in clojure

我在一些辅助函数旁边定义了一个数据连接值:

(def uri "datomic:dev://localhost:4334/dab")

(defn delete-db [] (d/delete-database uri))
(defn create-db [] (d/create-database uri))

(def conn (d/connect uri))

问题是,如果我调用 delete-db 然后调用 create-db,"conn" 值中的连接将被删除。所以我需要一种方法能够在完成 delete/create 循环后 'reload' conn 值。鉴于 "def values" 的不变性,我该怎么做?

我遇到了这个:http://www.rkn.io/2014/02/10/datomic-antipatterns-connnnn/ 它讨论了不使用 conn 作为值的原因,但是它只在进行查询时才有意义。我正在将 conn 传递给函数以进行交易。

我会为您的问题推荐两种解决方案:

  1. 简单:将您的连接值包装到 atom 中。它明确表示它可能会随时间变化,并为您提供明确定义的变化特征。您可以公开一个干净的 API 函数,例如 open-conectionclose-connection 来操纵原子的状态。

  2. 复杂:您可以使用 library/framework 来处理运行时资源的生命周期。最流行的(也是非常正交的方法)是 Component and Mount.

您也可以使用 alter-var-root,但我会将其作为最后的手段使用,并将其视为 hack。