ランダムに指定された式の1つを選択して評価するマクロを定義します。たとえば、Clojure:ローカルスコープで引用されたフォームを評価する方法は?
(equal-chance
(println "1")
(println "2"))
は、半分の時間に「1」を、もう半分に「2」を出力する必要があります。
Iは
(defmacro equal-chance
[& exprs]
`(rand-nth '~exprs))
、使用しようとしたが、これは(すなわち、それは(println "1")
を返すのではなく、実際に「1」を印刷する)むしろそれを評価するよりも、引用された形式のいずれかを返します。私はeval
を使用できません。なぜなら、バインディングを保持しないからです。たとえば、
(let [x 10] (eval '(println x)))
は、シンボルxを解決できないと訴えます。
ローカルスコープで引用されたフォームを評価する方法はありますか?それとももっと良い方法がありますか?
これは素晴らしい動作します! – Ken
私はfn/callではなくdelay/forceを使いたいと思います: '(force(rand-nth [〜@(map(partial list \' delay)exprs)])) ) ' – amalloy