cat*_*ory 1 lisp iteration let
此函数应该计算元素"a"出现在列表中但不起作用的次数:
(defun iter-a_count (lst)
(let ((count 0))
(dolist (x lst)
(if (equal x 'a)
(setf count (+ count 1)))
count )))
Run Code Online (Sandbox Code Playgroud)
此函数始终返回nil.请问我哪里出错了?
小智 5
从dolist宏返回的值是它的第三个"参数",即
(dolist (iterator iterable result) forms)
Run Code Online (Sandbox Code Playgroud)
在返回所有列表单元格之后,iterator每次迭代更新car为下一个单元格的位置.iterableresult
您没有指定结果,结果的默认值是nil.我不确定最后一行计数的目的是什么 - 也许你想要返回计数 - 在这种情况下,把它放在lst之后.
还有几件你想要考虑的事情:
(setf x (+ x 1))
Run Code Online (Sandbox Code Playgroud)
相当于:
(setf x (1+ x))
Run Code Online (Sandbox Code Playgroud)
这相当于:
(incf x)
Run Code Online (Sandbox Code Playgroud)
写作更加惯用
(when x forms)
Run Code Online (Sandbox Code Playgroud)
代替
(if x true-branch)
Run Code Online (Sandbox Code Playgroud)
因为如果你以后想要添加更多的表达式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
Run Code Online (Sandbox Code Playgroud)