Clojure 当表达式超出范围时,如何运行函数?
我得到了一个有副作用的表达式:Clojure 当表达式超出范围时,如何运行函数?,clojure,garbage-collection,Clojure,Garbage Collection,我得到了一个有副作用的表达式: (database-reference "sites" "stackoverflow" "users") 这将创建一个必须清理的引用。在功能上,我需要 (let [ref (database-reference ...)] (do-things-to ref) (.close ref) 但是对于其他程序员(我的用户)来说,始终指定let表单并不是很直观。要求始终使用宏也是不合适的 我想在ref超出范围时自动调用.close。我可以为所有数据库引用实现一
(database-reference "sites" "stackoverflow" "users")
这将创建一个必须清理的引用。在功能上,我需要
(let [ref (database-reference ...)]
(do-things-to ref)
(.close ref)
但是对于其他程序员(我的用户)来说,始终指定let
表单并不是很直观。要求始终使用宏也是不合适的
我想在ref
超出范围时自动调用.close
。我可以为所有数据库引用实现一个协议,但找不到合适的协议。我的直觉是这样说:
(deftype DatabaseReference [stuff]
clojure.lang.IDispose
(dispose [this] (.close this))
但是clojure.lang.IDispose
当然不存在。使用open
应该可以job@Andre打开时
实际上是我需要避免的宏观情况。删除了答案,这样就可以看到没有答案。我认为这是不可能的。绑定值不应该知道它绑定到什么,所以它可以自由地传递。想象一下,有人拿着引用并把它放在一边,例如。G进入一个原子
。然后一个引用离开了作用域,并且(假设您要求的是可能的)关闭了,所以存储在atom中的引用将不再可用。