You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Clojure:如何在完成计算后检查循环条件?

在Clojure中实现do-while逻辑的精准方案

当然可行!Clojure本身没有内置的do-while语法,但我们可以通过几种简洁且地道的方式实现这种「先执行计算、后判断条件」的循环逻辑,完全匹配你的需求。

方法1:用loop + recur手动实现(最推荐)

这是Clojure里实现自定义循环的标准方式,灵活度拉满,完全能精准控制执行顺序:

(loop []
  ;; 第一步:先执行你的计算逻辑
  (let [calculation-result (perform-your-calc)]
    ;; 第二步:根据计算结果判断是否继续循环
    (when (should-continue? calculation-result)
      (recur))))

逻辑说明:

  • 进入loop后,必然先执行perform-your-calc完成计算,完全符合你要求的「首次先执行」。
  • 计算完成后,用when判断条件:如果条件为真,recur会回到loop开头,再次执行计算+判断;如果条件为假,when返回nil,循环直接终止。

如果需要在循环中维护状态(比如计数器、累计值),只需要给loop添加绑定即可:

(loop [count 0]
  (let [new-count (inc count)
        doubled (* new-count 2)]
    (println "当前计算结果:" doubled)
    ;; 当new-count小于5时继续循环
    (when (< new-count 5)
      (recur new-count))))

运行这段代码会先打印当前计算结果:2,然后判断是否继续,完美实现do-while的逻辑。

方法2:封装自定义do-while宏(语法糖风格)

如果你需要多次复用这种逻辑,可以自己封装一个宏,让代码看起来和其他语言的do-while一模一样:

(defmacro do-while
  [body condition]
  `(loop []
     ~body
     (when ~condition
       (recur))))

使用时的语法非常直观:

(do-while
  (let [rand-num (rand-int 10)]
    (println "生成的随机数:" rand-num))
  (> rand-num 3))

这个宏会先执行body里的代码,再判断condition,满足就重复执行,用起来和原生语法糖没区别。

⚠️ 注意避坑:
别直接用Clojure内置的while函数!它的逻辑是先判断条件,再执行体((while condition body)),如果首次条件不满足,代码体根本不会执行,这和你要的「先执行后判断」完全相反。

内容的提问来源于stack exchange,提问作者Boba_Fett

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:22:25