Clojure无限循环

Ham*_*aya 17 clojure

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


while(true){
   calc();
}
Run Code Online (Sandbox Code Playgroud)

我想永远调用calc函数.一次又一次地调用一个函数.

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

Bri*_*per 25

while 在核心库中.

(while true (calc))
Run Code Online (Sandbox Code Playgroud)

这扩展到简单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))))
Run Code Online (Sandbox Code Playgroud)

  • 似乎(虽然(calc)nil)会更有用. (2认同)

Jon*_*nas 16

使用Brian在他的回答中提供的while宏是一个简单的任务,编写一个宏,除了从以下位置删除布尔测试之外什么也不做:foreverwhile

(defmacro forever [& body] 
  `(while true ~@body))

user=> (forever (print "hi "))                         
hi hi hi hi hi hi hi hi hi hi hi ....

这是任何Lisp的有趣部分,您可以创建自己的控制结构,作为回报,您可以避免大量的样板代码.

  • 我不同意.你觉得`dosync`毫无意义吗?你也可以写(同步nil ...). (3认同)

z5h*_*z5h 12

(loop [](calc)(recur))