创建无限循环的惯用方法是什么?
while(true){
calc();
}
我想永远调用calc函数。一遍又一遍地调用一个函数。
编辑: 我忘了提到的另一件事是calc有副作用。它做了一些计算并修改了一个字节数组。
答案 0 :(得分:25)
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))))
答案 1 :(得分:16)
使用Brian在其答案中提供的while
宏,编写一个forever
宏是一项简单的任务,除了从while
中删除布尔测试之外什么都不做:
(defmacro forever [& body] `(while true ~@body)) user=> (forever (print "hi ")) hi hi hi hi hi hi hi hi hi hi hi ....
这是任何Lisp的有趣部分,你可以创建自己的控制结构,作为回报,你可以避免很多boilerplate code。
答案 2 :(得分:12)
(循环[] (计算值) (RECUR))
答案 3 :(得分:3)
另一种解决方案是使用repeatedly
,如:
(repeatedly calc)
这不是一个infinte循环,而是返回一个无限序列。延迟序列比紧密循环慢一点,但也可以控制循环。