在涉足 Clojure 时,我完成了一个小示例程序,用于从选项列表中选择一个随机选项。
基本思想是迭代选择(分配权重)并将它们的权重转换为一个范围,然后在总范围内选择一个随机数来选择一个。它可能不是最优雅的设计,但让我们认为它是理所当然的。
与我下面的示例相比,wo 会有什么不同?
我对整体程序结构建议、名称间距等不感兴趣,主要是对您对每个功能的处理方式。
我对经验丰富的 Clojurer 如何处理“增强”函数特别感兴趣,在该函数中,我必须使用外部“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))