如何在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
相关产品推荐
相关产品推荐

