Clojure中的Do-while循环?

wro*_*ame 7 functional-programming clojure

所以我想首先执行一堆代码,然后询问用户是否要再次执行此操作.我认为最方便的方法是在C++中使用do-while循环,因为我似乎无法在Clojure中找到任何do-while函数,所以我写了以下内容:

(defmacro do-while
  "Executes body before testing for truth expression"
  [test & body]
  `(do (do ~@body) (while ~test ~@body)))
Run Code Online (Sandbox Code Playgroud)

是否有更好的(如在更惯用的Clojure-ish中)编写这个宏的方式,或者可能是一种更好的方式来做我想要的而不经过do-while路线?

Ger*_*ert 16

这是Clojure while宏的一个稍微改变的版本,在评估主体后进行测试:

(defmacro do-while
  [test & body]
  `(loop []
     ~@body
     (when ~test
       (recur))))
Run Code Online (Sandbox Code Playgroud)