我每次得到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)
我假设它是某种记忆,我是对的吗?我每次如何获得不同的价值?
答案 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
就像其他答案一样,但几乎肯定是更好的解决方案。