Common lisp 使用dolist宏对列表求和

Common lisp 使用dolist宏对列表求和,common-lisp,Common Lisp,我试图用dolist宏对列表求和。但是,我做不到。它总是返回列表的最后一个元素。提前谢谢 (defun sumlist2 (l) ;;this function computes total of a list by using dolist macro (let ((summ 0)) (dolist (obj l) (setf summ (+ obj))) summ)) 在dolist的主体中,您不会对变量summ求和,而是将列表元素的值赋给它,因为(+o

我试图用dolist宏对列表求和。但是,我做不到。它总是返回列表的最后一个元素。提前谢谢

(defun sumlist2 (l)
  ;;this function computes total of a list by using dolist macro
  (let ((summ 0))
    (dolist (obj l)
      (setf summ (+ obj)))
    summ))

dolist
的主体中,您不会对变量
summ
求和,而是将列表元素的值赋给它,因为
(+obj)
obj
求和,没有其他值,因此返回
obj
本身。换句话说,不是:

(setf summ (+ obj))
(setf sum (+ obj))
你应该写:

(setf summ (+ summ obj))
或者,更好的是:

(incf summ obj)
执行加法的

最后请注意,您可以直接从
dolist
生成结果,如:

(defun sumlist2 (l)
  ;;this function computes total of a list by using dolist macro
  (let ((summ 0))
    (dolist (obj l summ)
      (incf summ obj))))

dolist
的主体中,您不会对变量
summ
求和,而是将列表元素的值赋给它,因为
(+obj)
obj
求和,没有其他值,因此返回
obj
本身。换句话说,不是:

(setf summ (+ obj))
(setf sum (+ obj))
你应该写:

(setf summ (+ summ obj))
或者,更好的是:

(incf summ obj)
执行加法的

最后请注意,您可以直接从
dolist
生成结果,如:

(defun sumlist2 (l)
  ;;this function computes total of a list by using dolist macro
  (let ((summ 0))
    (dolist (obj l summ)
      (incf summ obj))))

Lisp中的
+
函数是不可变的,它只计算一个新值:

(+)         is zero
(+ x)       is just x
(+ x y ...) is the sum of x, y, etc.
在代码中,您可以使用从列表中获取的每个值来设置本地
summ
变量。 最后,它只包含列表的最后一个值。如果要更新
summ
,需要执行以下操作:

(setf summ (+ summ obj))
或者,简单地说:

(incf summ obj)

Lisp中的
+
函数是不可变的,它只计算一个新值:

(+)         is zero
(+ x)       is just x
(+ x y ...) is the sum of x, y, etc.
在代码中,您可以使用从列表中获取的每个值来设置本地
summ
变量。 最后,它只包含列表的最后一个值。如果要更新
summ
,需要执行以下操作:

(setf summ (+ summ obj))
或者,简单地说:

(incf summ obj)

循环的FYI

(loop for i in '(1 2 3) sum i)
;; 6


请参阅更多信息:

使用
循环的FYI

(loop for i in '(1 2 3) sum i)
;; 6


请参阅下面的详细信息:

我有一个可以为您工作的函数示例,然后将解释您的错误:

(defun sum-list(lst)
  (let((sum 0))
    (dolist(l lst)
      (setf sum (+ sum l)))
     sum))
而不是:

(setf summ (+ obj))
(setf sum (+ obj))
我们将在上一次迭代中已经获得的列表的总和添加到当前正在迭代的列表中的数字:

(sum-list ‘(1 2 3 4 5 6 7))
28

下面我们可以传递一个整数列表1-7,它将返回值28

下面我举了一个函数示例,它可以为您工作,然后将解释您的错误:

(defun sum-list(lst)
  (let((sum 0))
    (dolist(l lst)
      (setf sum (+ sum l)))
     sum))
而不是:

(setf summ (+ obj))
(setf sum (+ obj))
我们将在上一次迭代中已经获得的列表的总和添加到当前正在迭代的列表中的数字:

(sum-list ‘(1 2 3 4 5 6 7))
28

下面我们可以传递一个整数列表1-7,它将返回值28

FYI和谷歌同行,用循环和序列求和:FYI和谷歌同行,用循环和序列求和: