在clojure中重新加载val

在clojure中重新加载val,clojure,datomic,Clojure,Datomic,我有一个datomic连接值与一些辅助函数一起定义: (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,然后创建db,“conn”值中的连接将被删除。因此,我需要一种在执行删除/创建循环

我有一个datomic连接值与一些辅助函数一起定义:

(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,然后创建db,“conn”值中的连接将被删除。因此,我需要一种在执行删除/创建循环后能够“重新加载”conn值的方法。鉴于“def值”的不可变性质,我如何做到这一点


我遇到了这样一个问题:它讨论了不使用conn作为值的原因,但是它只有在执行查询时才有意义。我正在将conn传递到函数中以执行事务。

我建议两种解决方案:

  • 简单:将连接值包装到
    atom
    中。它明确表示它可能随时间而变化,并为您提供了明确定义的变化特征。您可以公开干净的API函数,如
    打开连接
    关闭连接
    ,它们将操纵原子的状态

  • 复杂:您可以使用一个库/框架来处理运行时资源的生命周期。最流行的(也是非常正交的)方法是和


  • 您也可以使用
    alter var root
    ,但我会将其作为最后手段使用,并将其视为黑客攻击。

    我建议两种解决方案:

  • 简单:将连接值包装到
    atom
    中。它明确表示它可能随时间而变化,并为您提供了明确定义的变化特征。您可以公开干净的API函数,如
    打开连接
    关闭连接
    ,它们将操纵原子的状态

  • 复杂:您可以使用一个库/框架来处理运行时资源的生命周期。最流行的(也是非常正交的)方法是和

  • 您也可以使用
    altervar root
    ,但我会将其作为最后手段使用,并将其视为黑客攻击