使用dolist宏对列表求和

Tur*_*abs 1 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))
Run Code Online (Sandbox Code Playgroud)

Ren*_*nzo 7

在体内dolist,你不要对变量summ求值,而是为它赋予列表元素的值,因为(+ obj)总和obj没有其他值,所以返回obj它自己.换句话说,而不是:

(setf summ (+ obj))
Run Code Online (Sandbox Code Playgroud)

你应该写:

(setf summ (+ summ obj))
Run Code Online (Sandbox Code Playgroud)

或者,甚至更好:

(incf summ obj)
Run Code Online (Sandbox Code Playgroud)

执行添加.

最后请注意,您可以直接生成结果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))))
Run Code Online (Sandbox Code Playgroud)


cor*_*ump 5

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

(+)         is zero
(+ x)       is just x
(+ x y ...) is the sum of x, y, etc.
Run Code Online (Sandbox Code Playgroud)

在您的代码中,您setfsumm使用从列表中获取的每个值的局部变量.最终,它只包含列表的最后一个值.如果要更新summ,则需要执行以下操作:

(setf summ (+ summ obj))
Run Code Online (Sandbox Code Playgroud)

或者,简单地说:

(incf summ obj)
Run Code Online (Sandbox Code Playgroud)