我希望在不再有任何引用之后,但在垃圾收集器清除其数据之前对特定实体执行某些操作。我正在使用它进行更多的实验和纯粹的功能性#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编程的状态,并使其看起来尽可能纯净。
答案 0 :(得分:0)
这不是构建正确程序的方法。 A correctly-written program cannot assume that garbage collection is ever run,当然,它不会像你想的那样瞬间运行,以便根据它做出UI决定。
从您的问题描述中可以清楚地知道您实际想要做什么,但将其绑定到垃圾收集肯定是错误的方法。也许你可以在离开B
之后添加一些代码来做任何你想做的事情。