如何每次从重复功能获得不同的值?

时间:2018-02-19 16:59:12

标签: clojure clojurescript

我每次得到10个相同的结果:

(repeat 10 (rand 10))

例如:

=> (2.54681114871718 2.54681114871718 2.54681114871718 2.54681114871718 2.54681114871718 2.54681114871718 2.54681114871718 2.54681114871718 2.54681114871718 2.54681114871718)

我假设它是某种记忆,我是对的吗?我每次如何获得不同的价值?

2 个答案:

答案 0 :(得分:11)

repeat返回包含给定值的序列,因此(rand 10)作为参数被评估一次。您可以使用带有函数的repeatedly

(repeatedly 10 #(rand 10))

答案 1 :(得分:3)

我不会说这是由于记忆。 repeat只是一个函数,因此(rand 10)必须在repeat运行之前进行评估。这意味着

(repeat 10 (rand 10))

需要首先评估其参数,并评估为(例如):

(repeat 10 2.54681114871718)

从这里开始,应该清楚为什么它会一遍又一遍地回归同样的事情。

要做你想做的事,你必须使用一个宏:

(defmacro repeatedlyM [n & body]
  `(repeatedly ~n (fn [] ~@body)))

(repeatedlyM 10 (rand 10))

(9.132286678823302
 9.767508843398039
 5.826387907720001
 2.2938644928402283
 8.673658990046192
 8.112592355036686
 2.9539038027898314
 2.721946311854755
 0.53309774963476
 7.258845714766884)

这是有效的,因为在调用之前不会像使用普通函数那样计算宏的参数。 (rand 10)字面意思,放在一个函数中,并运行多次而不是一次。

将代码包装在一个函数中并使用repeatedly就像其他答案一样,但几乎肯定是更好的解决方案。