Lisp 收集随机项(如果它们是偶数)

Jan*_*Jan 2 lisp common-lisp

我来自其他编程语言,最近发现了 lisp,并且感到很惊讶。通过阅读loop宏,我想生成一个包含带有条件的随机数的列表(让我们假设数字应该是偶数)。所以我想出了这个:

(defun some-test (range)
  (loop repeat range
        with item = (random 1000)
        if (evenp item)
        collect item))
Run Code Online (Sandbox Code Playgroud)

然而,这给了我相同的随机数range次数。我在这里做错了什么?显然,item仅评估一次,而不是在每次迭代中评估。

tla*_*tla 5

with在循环开始之前计算表达式。如果要在每次迭代中计算中间值,则需要将其替换为for

(defun some-test (range)
  (loop for item = (random 1000)
        repeat range
        if (evenp item)
        collect item))
Run Code Online (Sandbox Code Playgroud)

然后运行(some-test 5)最多返回 5 个偶数,例如:

CL-USER> (some-test 5)
(758 750 300)
CL-USER> (some-test 5)
(954)
Run Code Online (Sandbox Code Playgroud)