在垃圾收集之前执行操作

时间:2014-06-23 00:02:22

标签: clojure reference garbage-collection pure-function

我希望在不再有任何引用之后,但在垃圾收集器清除其数据之前对特定实体执行某些操作。我正在使用它进行更多的实验和纯粹的功能性#34; gui抽象。这就是我想做的事情:

(let [window (make-window width height)] ; A
  (various-actions window)
  (let [window (resize window new-width new-height)] ; B
    (more-actions window))
  (and-more-actions window)) ; C

在A窗口实例创建宽度和高度。最终我想在B处更改窗口。代码将此视为不可变动作,但窗口下方只会更改以反映更改。在B范围窗口存在的情况下在A范围窗口上执行的动作(在多线程的情况下)将不允许以某种方式。

在我们完成B处的事情之后在C处离开并留下范围,B窗口对象将被取消引用并收集垃圾。但我想告诉底层窗口机制它应该现在回滚B更改,并再次接受范围活动。因此在C处的行动就好像B效应没有发生。

同样,如果不再引用顶级A窗口,它应该在垃圾收集之前以任何方式破坏自己。

我可以通过让make-window修改注册窗口引用的全局状态来管理这个,但是我不确定如何检测B范围引用丢失的点。我该如何检查对一段数据的引用?还是有其他方法来解决这个问题?

我意识到这是一个有点令人费解的设置,但我想找到一种方法来调和gui编程的状态,并使其看起来尽可能纯净。

1 个答案:

答案 0 :(得分:0)

这不是构建正确程序的方法。 A correctly-written program cannot assume that garbage collection is ever run,当然,它不会像你想的那样瞬间运行,以便根据它做出UI决定。

从您的问题描述中可以清楚地知道您实际想要做什么,但将其绑定到垃圾收集肯定是错误的方法。也许你可以在离开B之后添加一些代码来做任何你想做的事情。