lisp 迭代函数总是返回 nil

标签 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。请问我哪里出错了?

最佳答案

dolist 宏返回的值是它的第三个“参数”,即

(dolist (iterator iterable result) forms)

其中 iterator 每次迭代都会更新为 iterable 的下一个单元格的 car ,在访问完所有列表单元格之后, result 返回。

您没有指定结果,结果的默认值为nil。我不确定最后一行中 count 的目的是什么 - 也许您想返回计数 - 在这种情况下,将其放在 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

关于lisp 迭代函数总是返回 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12564587/

相关文章:

haskell - 这个 Haskell 输入缩进有什么问题?

Scheme 中的范围 (Lisp)

scala - Spark 流的迭代算法

lisp - Scheme中 `define`的返回值是多少?

javascript - jquery 有更好的循环吗?

python - 遍历 Python 列表中的每两个元素

syntax-error - Coq let 子句中的多个赋值

haskell : using guards after where

lisp - 将列表的每个元素与 lisp 中另一个列表的每个元素相乘

python - 有没有类似 Lisp 的 SLIME for Python/Django 的东西?