此函数应该计算元素“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
每次迭代都将where更新为car
的下一个单元格iterable
,在访问完所有列表单元格之后,result
返回。
您没有指定结果,结果的默认值为nil
. 我不确定最后一行中计数的目的是什么——也许你想返回计数——在这种情况下,把它放在 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
请问我哪里出错了?
缩进(如,你缩进错误):你写
(defun iter-a_count (lst)
(let ((count 0))
(dolist (x lst)
(if (equal x 'a)
(setf count (+ count 1)))
count)))
但我认为你的意思是
(defun iter-a_count (lst)
(let ((count 0))
(dolist (x lst)
(if (equal x 'a)
(setf count (+ count 1))))
count))