我想在不再有任何引用之后对特定实体执行一些操作,但在垃圾收集器擦除其数据之前。我用它来做一个"纯功能"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的操作并离开let作用域后,B窗口对象将被不引用并被垃圾收集。但是我想向底层窗口机制发出信号,它现在应该回滚B更改,并再次接受A范围活动。因此,C点的作用就像B点的效应没有发生一样。同样,如果顶级A窗口不再被引用,它应该在垃圾回收之前以任何方式销毁自己。
我可以通过让make-window修改注册窗口引用的全局状态来管理这个问题,但我不确定如何检测B范围引用丢失的点。我如何检查对一个数据的引用?还是有其他方法来解决这个问题?
我意识到这是一个有点复杂的设置,但我想找到一种方法来调和GUI编程的有状态性,并使其看起来尽可能纯净。
这不是构建正确程序的方法。一个正确编写的程序不能假设曾经运行过垃圾收集,当然它也不会像您希望的那样即时运行,以便根据它做出UI决策。
从你的问题描述中根本不清楚你真正想做什么,但是将它与垃圾收集联系起来肯定是错误的方法。也许你可以在离开B
后添加一些代码,这将做任何你想要的。