我试图通过使用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)
在体内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)
+Lisp中的函数是不可变的,它只是计算一个新值:
(+) is zero
(+ x) is just x
(+ x y ...) is the sum of x, y, etc.
Run Code Online (Sandbox Code Playgroud)
在您的代码中,您setf将summ使用从列表中获取的每个值的局部变量.最终,它只包含列表的最后一个值.如果要更新summ,则需要执行以下操作:
(setf summ (+ summ obj))
Run Code Online (Sandbox Code Playgroud)
或者,简单地说:
(incf summ obj)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
114 次 |
| 最近记录: |