簡體   English   中英

功能事件驅動編程

[英]Functional Event Driven Programming

我在使用Clojure和Seesaw編寫功能樣式的事件驅動GUI代碼時遇到了麻煩。 具體來說,我無法弄清楚如何在不使用全局變量或其他一些令人不快的黑客的情況下傳遞程序的狀態。 我目前的做法是這樣的:

(defn event-handler [gui-state event]
   (update-gui! (get-new-state gui-state event)))

(defn update-gui! [gui-state]
   (remove-all-listeners (gui-state :button))
   (seesaw.core/listen (gui-state :button)
                       :action
                       (partial event-handler gui-state)))

它在相關組件上設置一個事件監聽器,具有部分應用的函數來推進狀態並更新gui,包括刪除舊的監聽器。 雖然這似乎有效,但我並不喜歡它,部分是因為我無法在狀態中傳遞監聽器(因為它在我已經定義狀態之后才構建),所以刪除舊的監聽器需要刪除所有偵聽器,這可能會在程序增長時導致問題。

我在網上找到的最接近的解決方案是在這個答案中 ,但我不知道如何像它顯示的那樣處理事件。 我確信必須有一個比我目前的方法更好的解決方案,但我無法弄清楚是什么。

任何人都可以告訴我如何在仍然遵循功能風格的同時響應用戶輸入事件?

來自鏈接答案的Streams看起來像是core.async頻道的模擬。

每個事件都可以通過一個包含事件詳細信息的通道,而不是刪除所有偵聽器。 相同的通道應該轉到按鈕的邏輯處理程序,在那里它將被重復取出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM