特定のエンティティへの参照がなくなった後、ガベージ コレクターがそのデータを消去する前に、特定のエンティティに対していくつかのアクションを実行したいと考えています。私はこれを、より「純粋に機能的な」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 プログラミングのステートフル性を調整し、可能な限り純粋に見えるようにする方法を見つけたいと考えています。