Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 当表达式超出范围时,如何运行函数?_Clojure_Garbage Collection - Fatal编程技术网

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中的引用将不再可用。