1

我想在不再引用特定实体之后,但在垃圾收集器擦除其数据之前对特定实体执行一些操作。我正在使用它进行更多“纯功能” 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 作用域的窗口上执行的操作以某种方式是不允许的。

在 C 处,我们在 B 处完成操作并离开 let 范围后,B 窗口对象将被取消引用并被垃圾收集。但我想向底层窗口机制发出信号,它现在应该回滚 B 更改,并再次接受 A 范围活动。因此,在 C 处的动作就好像 B 效应没有发生一样。

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

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

我意识到这是一个有点复杂的设置,但我想找到一种方法来协调 gui 编程的状态性并使其看起来尽可能纯粹。

4

1 回答 1

0

这不是构建正确程序的方法。一个正确编写的程序不能假设垃圾收集一直在运行,当然它也不会像您希望的那样立即运行,以便根据它做出 UI 决策。

从您的问题描述中根本不清楚您真正想要做什么,但是将其与垃圾收集联系起来肯定是错误的方法。也许您可以在离开后添加一些代码B,以执行您想要的任何操作。

于 2014-06-23T07:42:43.947 回答