lisp迭代函数总是返回nil

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)