使用Lisp loop宏收集随机偶数时重复同一值的问题排查
Loop宏生成随机偶数列表的问题排查与修复
你的问题核心在于loop宏中with子句的求值时机:with item = (random 1000)会在循环启动前仅执行一次,之后所有迭代都会复用这个初始生成的随机数,自然会得到一堆相同的值。
修复方案
最简洁的解决方式是把with替换为for,for子句会在每次循环迭代时重新求值右边的表达式,这样每次都能生成新的随机数:
(defun some-test (range) (loop repeat range for item = (random 1000) if (evenp item) collect item))
如果需要更显式的赋值控制,也可以用do子句在每次迭代时重新生成随机数:
(defun some-test (range) (loop repeat range with item do (setf item (random 1000)) if (evenp item) collect item))
额外扩展:收集指定数量的偶数
如果你的实际需求是生成恰好range个偶数(而非循环range次后收集符合条件的,可能数量不足),可以调整loop逻辑:
(defun some-test (target-count) (loop with result = '() until (= (length result) target-count) for item = (random 1000) when (evenp item) do (push item result) finally (return (nreverse result))))
这段代码会持续生成随机数,直到收集到足够数量的偶数后返回。
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

