Clojure无限循环

时间:2009-10-03 23:16:12

标签: clojure

创建无限循环的惯用方法是什么?


while(true){
   calc();
}

我想永远调用calc函数。一遍又一遍地调用一个函数。

编辑: 我忘了提到的另一件事是calc有副作用。它做了一些计算并修改了一个字节数组。

4 个答案:

答案 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循环,而是返回一个无限序列。延迟序列比紧密循环慢一点,但也可以控制循环。