如何以惯用方式创建一个无限循环?
while(true){
calc();
}
我希望永远调用calc函数。只需一次调用该函数即可。
编辑: 我忘了提到另一件事,那就是calc有副作用。它进行一些计算并修改一个字节数组。
如何以惯用方式创建一个无限循环?
while(true){
calc();
}
我希望永远调用calc函数。只需一次调用该函数即可。
编辑: 我忘了提到另一件事,那就是calc有副作用。它进行一些计算并修改一个字节数组。
while
是核心库中的一部分。
(while true (calc))
这会扩展为一个简单的recur
。
(defmacro while
"Repeatedly executes body while test expression is true. Presumes
some side-effect will cause test to become false/nil. Returns nil"
[test & body]
`(loop []
(when ~test
~@body
(recur))))
dosync
没有意义吗?你可以写成 (sync nil ...) 的形式。 - Jonas(循环 [] (计算) (递归))
另一种解决方案是使用repeatedly
,如下所示:
(repeatedly calc)
与无限循环不同,这将返回一个无限序列。虽然惰性序列会比紧密循环慢一些,但也允许对循环进行一定的控制。