Do-while цикл в Clojure? - PullRequest
       17

Do-while цикл в Clojure?

7 голосов
/ 30 декабря 2011

Итак, я хочу сначала выполнить кучу кода, а , а затем спросить пользователя, хочет ли он сделать это снова.Я думал, что наиболее удобный способ сделать это - цикл do-while, как в C ++, и, поскольку я не могу найти какие-либо функции do-while в Clojure, я написал следующее:

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

Будет ли лучший (как в более идиоматическом Clojure-ish) способ написания этого макроса, или, возможно, лучший способ делать то, что я хочу, без прохождения маршрута do-while?

1 Ответ

15 голосов
/ 30 декабря 2011

Вот слегка измененная версия макроса while Clojure * , где тест проводится после оценки тела:

(defmacro do-while
  [test & body]
  `(loop []
     ~@body
     (when ~test
       (recur))))
...