1

此函数应该计算元素“a”出现在列表中的次数,但不起作用:

(defun iter-a_count (lst)
   (let ((count 0))
        (dolist (x lst)
                (if (equal x 'a) 
                    (setf count (+ count 1)))
         count )))

这个函数总是返回 nil。请问我哪里出错了?

4

2 回答 2

5

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
于 2012-09-24T12:03:36.507 回答
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))
于 2012-09-24T13:15:27.520 回答