RosettaCodeData/Task/Averages-Simple-moving-average/Common-Lisp/averages-simple-moving-average.lisp
Ingy döt Net 764da6cbbb CDE
2013-04-10 16:57:12 -07:00

11 lines
460 B
Common Lisp

(defun simple-moving-average (period &aux
(sum 0) (count 0) (values (make-list period)) (pointer values))
(setf (rest (last values)) values) ; construct circularity
(lambda (n)
(when (first pointer)
(decf sum (first pointer))) ; subtract old value
(incf sum n) ; add new value
(incf count)
(setf (first pointer) n)
(setf pointer (rest pointer)) ; advance pointer
(/ sum (min count period))))