首页 > 解决方案 > 使用 dolist 宏对列表求和

问题描述

我试图通过使用 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))

标签: common-lisp

解决方案


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

(setf summ (+ 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))))

推荐阅读