Clojure に手を出している間に、選択肢のリストからランダムな選択肢を選ぶ小さなサンプル プログラムを完成させました。
基本的な考え方は、(重みが割り当てられた) 選択肢を反復処理し、それらの重みを範囲に変換してから、合計範囲内の乱数を選択して 1 つを選択することです。最もエレガントなデザインではないかもしれませんが、当然のこととしましょう。
以下の私の例と比べて何が違うでしょうか?
全体的なプログラム構造の提案、名前の間隔などには興味がありません。主に各機能へのアプローチに興味があります。
私は特に、ベテランの Clojurer が "augment" 関数にどのように取り組むかに興味があります。この関数では、外部の "cur" 変数を使用して範囲の前の端を参照する必要がありました。
(def colors
(hash-map
:white 1,
:red 10,
:blue 20,
:green 1,
:yellow 1
)
)
(def color-list (vec colors))
(def cur 0)
(defn augment [x]
(def name (nth x 0))
(def val (nth x 1))
(def newval (+ cur val))
(def left cur)
(def right newval)
(def cur (+ cur val))
[name left right]
)
(def color-list-augmented (map augment color-list))
(defn within-bounds [bound]
(def min-bound (nth bound 1))
(def max-bound (nth bound 2))
(and (> choice min-bound) (< choice max-bound))
)
(def choice (rand-nth (range cur)))
(def answer
(first (filter within-bounds color-list-augmented))
)
(println "Random choice:" (nth answer 0))