lisp迭代函数总是返回nil

时间:2012-09-24 11:55:09

标签: lisp iteration let

这个函数应该计算元素'a'在列表中出现但不起作用的次数:

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

此函数始终返回nil。请问我哪里出错了?

2 个答案:

答案 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))