+
does not modify its arguments, so, since you never modify var
, its initial value of 0 is returned.
You need to replace (+ var (nth i L))
with (incf var (nth i L))
, of, equivalently, (setq var (+ var (nth i L)))
.
See incf
.
Note that you should bind var
with let
instead of making it global with setq
.
Most importantly, note that your algorithm is quadratic in the length of the list argument (because nth
scans your list every time from the start).
Here are some better implementations:
(defun sum-1 (l)
(reduce #'+ l))
(defun sum-2 (l)
(loop for x in l sum x))
(defun sum-3 (l)
(let ((sum 0))
(dolist (x l sum)
(incf sum x))))
Here is a bad implementation:
(defun sum-4 (l)
(apply #'+ l))
The problem with sum-4
is that it will fail if the length of the supplied list is larger than call-arguments-limit
.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…