函数事件驱动编程



我在使用 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,包括删除旧侦听器。虽然这似乎有效,但我不太喜欢它,部分原因是我无法在状态中传递侦听器本身(因为它直到我已经定义了状态之后才被构造),因此删除旧侦听器需要删除所有侦听器,随着程序的增长,这可能会导致问题。

我在网上找到的最接近的解决方案是这个答案,但我不知道如何处理事件作为流,就像它显示的那样。我相信一定有比我目前的方法更好的解决方案,但我无法弄清楚是什么。

谁能告诉我如何在遵循功能风格的同时响应用户输入事件?

来自链接答案的流看起来像是 core.async 频道的模拟。

每个事件可能会在包含事件详细信息的通道中传递,而不是删除所有侦听器。同一通道应转到按钮的逻辑处理程序,从中重复获取该通道。

相关内容

  • 没有找到相关文章

最新更新