【分享】在循环中跳出
本帖最后由 tigcat 于 2025-9-6 23:29 编辑foreach循环中要把列表循环完,这可能会耗费不必要的时间。我们要尽快结果多余判断,实现goto
下面几种方法大家可以在数据结构庞大时候试试谁快。
示例:
(defun c:tt1 ( / )
(vl-catch-all-apply
'(lambda ()
(foreach x '(1 2 3 4 5)
(princ (strcat "\n当前值: " (itoa x)))
(if (= x 3)
(progn
(setq &cc 99)
(princ "结束循环")
(kjdkfjdlfl);随便搞个函数错误中断
)
)
)
)
)
(princ "\n循环已跳出。")
(princ)
)
(defun c:tt2 ( / lst x)
(setq lst '(1 2 3 4 5))
(while lst
(setq x (car lst))
(princ (strcat "\n当前值: " (itoa x)))
(if (= x 3)
(progn
(princ "\n跳出循环")
(setq &cc 97)
(setq lst nil) ; 让循环条件失效,相当于 break
)
(setq lst (cdr lst))
)
)
(princ)
)
根据五楼大佬提醒,补充
; 基本用法 - 查找第一个偶数
(vl-some '(lambda (x) (if (= (rem x 2) 0) x)) '(1 3 5 8 9 10))
; 返回: 8
; 更复杂的例子 - 查找并处理
(setq mylist '(1 2 3 4 5 6))
(vl-some
'(lambda (item)
(princ (strcat "\n检查: " (itoa item)))
(if (> item 3)
(progn
(princ (strcat "\n找到大于3的数: " (itoa item)))
item; 返回找到的值,vl-some会停止
)
nil ; 返回nil,vl-some继续下一个元素
)
)
mylist
)
(defun c:tt ()
(setq lst '(1 2 3 4 5))
(while (setq x (car lst))
(princ (strcat "\n当前值: " (itoa x)))
(setq lst (if (= x 3) nil(cdr lst)))
)
(princ)
) 这可以的。。程序大的时候用的可以。 方便在大选集中调用 要中途满足条件就跳出,可以用vl-some
kozmosovia 发表于 2025-9-6 20:38
要中途满足条件就跳出,可以用vl-some
感谢大佬指出 用while再加个判断应该也可以吧,,while的好处是过程中可以修改表 雨的节奏 发表于 2025-9-8 10:14
用while再加个判断应该也可以吧,,while的好处是过程中可以修改表
可以的,三段示例代码中的第二段有示例
页:
[1]