5

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를, 국가를 발전하고 업데이트 할 수있는 부분적으로 적용 기능, 관련 구성 요소에 이벤트 리스너를 설정 : 내 현재의 접근 방식은 다음과 같이한다. 이것이 작동하는 것처럼 보이지만 실제로는 상태에서 청취자 자체를 전달할 수 없기 때문에 (부분적으로는 상태를 정의한 후에 구성되지 않기 때문에) 청취자를 제거 할 필요가 있습니다. 프로그램이 커짐에 따라 문제를 일으킬 수있는 모든 리스너를 제거합니다.

온라인에서 찾은 가장 가까운 해결책은 this answer입니다.하지만 이벤트를 스트림처럼 처리하는 방법을 알지 못합니다. 나는 현재의 접근 방식보다 더 나은 해결책이 있어야한다고 확신하지만, 나는 무엇을 알아낼 수 없다.

기능적 스타일을 따르면서 사용자 입력 이벤트에 어떻게 대응할 수 있습니까?

답변

1

링크 된 답변의 스트림은 core.async 채널의 아날로그처럼 보입니다.

모든 리스너를 제거하는 대신 각 이벤트는 이벤트 세부 정보가있는 채널을 전달할 수 있습니다. 동일한 채널은 버튼의 로직 핸들러로 이동해야 반복적으로 사용됩니다.

+0

작동하는 것처럼 보이며 매우 간단합니다. 감사. – resueman