这个函数应该计算元素“a”出现在列表中的次数,但不起作用:
(defun iter-a_count (lst)
(let ((count 0))
(dolist (x lst)
(if (equal x 'a)
(setf count (+ count 1)))
count )))
这个函数总是返回 nil。请问我哪里出错了?
最佳答案
dolist
宏返回的值是它的第三个“参数”,即
(dolist (iterator iterable result) forms)
其中 iterator
每次迭代都会更新为 iterable
的下一个单元格的 car
,在访问完所有列表单元格之后, result
返回。
您没有指定结果,结果的默认值为nil
。我不确定最后一行中 count 的目的是什么 - 也许您想返回计数 - 在这种情况下,将其放在 lst 之后。
您要考虑的其他几件事:
(setf x (+ x 1))
相当于:
(setf x (1+ x))
相当于:
(incf x)
写起来比较地道
(when x forms)
代替
(if x true-branch)
因为如果您以后想要向 true-branch
添加更多表达式,则必须将它们包装在 progn
中 - 这只会使代码困惑。
此外,您正在做的(或似乎正在做的)可以通过使用适当的谓词调用 count-if
来代替。
(defun count-a (list)
(count-if #'(lambda (x) (equal x 'a)) list))
(count-a '(a b c d a b a d a c b d e)) ; 4
关于lisp 迭代函数总是返回 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12564587/