5

Clojure ve Tahterevalli kullanarak, olay tabanlı GUI kodunu işlevsel bir tarzda yazmakta sorun yaşıyorum. Spesifik olarak, programın durumunu nasıl globals kullanmadan, ya da başka bir hoş olmayan hack kullanmadan anlayamıyorum.İşlevsel Olay Driven Programlama

(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))) 

Eski dinleyici kaldırma dahil GUI, devlet ilerlemek ve güncellemek için kısmen uygulanan fonksiyonu ile ilgili bileşende bir olay dinleyicisi ayarlar: My mevcut yaklaşımın böyle bir şeydir. Bu işe yaramış gibi görünse de, gerçekten hoşlanmıyorum, çünkü dinleyicinin kendisini devlette geçiremediğimden (durumu zaten tanımladıktan sonraya kadar inşa edilmediğinden), bu nedenle eski dinleyicinin kaldırılmasını gerektiriyor. programın büyürken sorunlara neden olabilecek tüm dinleyicileri kaldırmak.

Çevrimiçi bulduğum en yakın çözüm this answer içeriğidir, ancak olayların nasıl göründüğü gibi bir akışla nasıl işleneceğini bilmiyorum. Eminim şu anki yaklaşımımdan daha iyi bir çözüm olmalı, ama ne olduğunu anlayamıyorum.

İşlevsel bir stili takip ederken, kullanıcı giriş olaylarına nasıl yanıt verebileceğimi bana gösterebilir mi?

cevap

1

Bağlantılı yanıttaki akışlar, core.async kanallarının bir benzetimi gibi görünüyor.

Tüm dinleyicileri kaldırmak yerine, her olay, olay ayrıntılarının bulunduğu bir kanaldan iletilebilir. Aynı kanal, tekrar tekrar alınacağı düğmenin mantık işleyicisine gitmelidir.

+0

Bu işe yarıyor gibi görünüyor ve oldukça basittir. Teşekkürler. – resueman