1

Clojure に関する別の質問があります。

そのため、現在プロジェクトに取り組んでおり、そのための GUI コンポーネントを作成しようとしています。すべての機能パーツが機能しているので、見栄えを良くして、シーソーの仕組みについてもう少し学びたいと思います。

基本的に、ユーザーが特定の種類のデータを入力するために使用できる一連の入力フィールド (つまり、テキスト フィールド、スライダー、コンボボックス) があります。ユーザーが「確認」ボタンをクリックすると、ボタンのアクションで前述の入力フィールドのすべての値が返されるようにします。スレッドの経験はあまりありませんが、(明らかに) 同時実行性の問題が発生する可能性があることは理解しています。どうすればこれを達成できますか?

参考までに、私のコードの小さなサンプルを次に示します。

    ;
    ;in restaurant-gui.core
    ;

    (defn window-setup []
      (let [my-font        (font :name "Arial"
                                 :size 22)

           cuisine-label   (label    :text "Cuisine: "
                                     :font my-font
                                     :border [20 10])

           cuisine         (combobox :model["Any cuisine"
                                            "American"
                                            "Barbecue"
                                            "Chinese"
                                            "French"
                                            "Italian"])

           confirm-button  (button   :text "Confirm"
                                     :listen [:action (fn [event] event 
                           (selection cuisine))])

           window-contents (vertical-panel :items [cuisine-label cuisine 
                            confirm-button])]
           window-contents))

    ;     
    ;in restaurant-inference-engine.core
    ;

    (defn -main
      [&args]

      (binding [window-contents (window-setup)]
        (draw-window window-contents)     ;somehow listen here for
                                          ;information from the button
                                          ;and bind it to button-info?...

        (search-for-restaurant button-info)))

また、誰かが私が見ることができる単純から中間の clojure コードを知っていれば、私は非常に感謝しています. 言語の理解を深めるために、適切に作成された clojure コードにもっと触れたいと思っています。

4

1 に答える 1

1

GUI のような本質的にステートフルなものを操作する場合、Clojure のミュータブル ステート機能を利用すると便利なことがよくあります。私は2つの基本的なアプローチを見てきました:

  • 各 UI 要素の状態を に保存しref、関連する参照を UI の状態で動作する必要がある関数に渡します。
  • GUI の状態を 1 つに格納し、atomUI コンポーネントを使用するすべての関数にそのアトムを渡すことで、いつでも UI の現在の状態を使用できるようにします。一貫した方法で更新するように注意してください。
  • core.async を使用して、UI イベントがメッセージを必要とするコンポーネントにメッセージを送信するようにします。これにより、chans をセットアップする作業を行う必要がありますが、私の意見ではクリーンなコードで非常に応答性の高い UI が可能になります。

これらのいずれかがすべてのプロジェクトまたは大部分のプロジェクトで機能する可能性は低いと思われるため、特定のプロジェクトがどのように見えるかについては多少の影響があります. Clojure の公式の状態変更メソッド (atoms、vars、refs、agents、chans) に固執していれば、「並行性」の問題について心配する必要はないでしょう。

于 2016-02-25T00:28:01.177 に答える