这个函数应该计算元素'a'在列表中出现但不起作用的次数:
(defun iter-a_count (lst)
(let ((count 0))
(dolist (x lst)
(if (equal x 'a)
(setf count (+ count 1)))
count )))
此函数始终返回nil。请问我哪里出错了?
答案 0 :(得分:5)
从dolist
宏返回的值是它的第三个“参数”,即
(dolist (iterator iterable result) forms)
如果iterator
每次迭代都更新为car
的下一个单元格的iterable
,则在访问完所有列表单元格后,将返回result
。
您未指定结果,结果的默认值为nil
。我不确定最后一行中计数的目的是什么 - 也许你想要返回计数 - 在这种情况下,把它放在第一行之后。
您还想要考虑几件事:
(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
答案 1 :(得分:2)
请问我哪里出错了?
缩进(例如,你错误地缩进):你写了
(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))