我来自其他编程语言,最近发现了 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仅评估一次,而不是在每次迭代中评估。
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)