Events 函数式事件驱动编程
我在使用Clojure和跷跷板以功能性风格编写事件驱动的GUI代码时遇到困难。具体来说,我不知道如何在不使用globals或其他一些令人不快的黑客的情况下传递程序的状态。我目前的做法是这样的:Events 函数式事件驱动编程,events,user-interface,clojure,functional-programming,seesaw,Events,User Interface,Clojure,Functional Programming,Seesaw,我在使用Clojure和跷跷板以功能性风格编写事件驱动的GUI代码时遇到困难。具体来说,我不知道如何在不使用globals或其他一些令人不快的黑客的情况下传递程序的状态。我目前的做法是这样的: (defn event-handler [gui-state event] (update-gui! (get-new-state gui-state event))) (defn update-gui! [gui-state] (remove-all-listeners (gui-stat
(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通道的模拟
每个事件可能传入一个包含事件详细信息的通道,而不是删除所有侦听器。同一个通道应该转到按钮的逻辑处理程序,在那里它将被重复使用。这似乎是可行的,而且非常简单。谢谢