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

如何在Common Lisp的LOOP宏中条件性绑定变量?

在Common Lisp LOOP宏内条件性绑定变量的实现方案

你遇到的错误源于Common Lisp LOOP宏的语法规则::for这类变量绑定/迭代子句不能直接跟在:when条件子句之后。:when的作用是过滤或修饰后续的执行类子句(如:collect、:do),而非触发新的绑定操作。

以下是两种无需跳出循环、可在单个LOOP调用内实现需求的方案,均能保留:collect等LOOP上下文功能:

方案一:条件化绑定变量后过滤

通过在:for子句中用条件表达式绑定变量,再用:when过滤无效项,既符合语法要求,又简洁直观:

(loop :for (num div) :in '((1 2) (4 2) (3 0) (1 4))
      :for res = (when (/= 0 div) (/ num div))  ; 仅当div不为0时计算除法结果
      :when res  ; 自动跳过div为0的迭代项
      :collect num
      :do (format t "~A divided by ~A = ~A~%" num div res))

方案二::when结合局部变量(适配复杂逻辑)

如果需要在条件内执行更多复杂操作,可将变量绑定放在:when后的:do块中,注意:collect需作为:when的直接后续子句(不能嵌套在:do内部):

(loop :for (num div) :in '((1 2) (4 2) (3 0) (1 4))
      :when (/= 0 div)
      :collect num
      :do (let ((res (/ num div)))
            (format t "~A divided by ~A = ~A~%" num div res)))

这个方案中,:collect num仅在div不为0时执行;:do块内的局部变量res仅在条件满足时绑定,从根源避免了除以零的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 02:20:28