如何在循环中返回特定值

时间:2015-01-09 18:32:48

标签: loops common-lisp

我是LISP的新手我有Peter Seibel的“Practical Common Lisp”一书,但我找不到我的问题的答案。 所以基本上如何让它返回最后一个“:do”

的值
(defun averages (numbers)
 (loop :for i :in numbers :sum i :into x :do (/ x (length numbers))))

请记住,我没有这么久。 我也不是非常清楚Stackoverflow的不成文和不做的事。

2 个答案:

答案 0 :(得分:4)

使用finally

(defun averages (numbers)
  (loop :for i :in numbers :sum i :into x
     :finally (return (/ x (length numbers)))))

为了避免两次遍历列表,你可以做(​​按照@ mark-reed和@ joshua-taylor的建议)

(defun averages (numbers)
  (loop :for n :in numbers :sum n :into x :count t :into len
     :finally (return (/ x len))))

但在性能方面可能没什么区别。

PS。您可能需要考虑CLOCC/CLLIB/math.lisp以满足您的基本统计需求。

答案 1 :(得分:0)

如果你没有在LOOP中使用多个变量等高级功能,那么它很容易简化:

(defun averages (numbers)
  (loop for i in numbers sum i into x
        finally (return (/ x (length numbers)))))

利用LOOP表单返回总和:

(defun averages (numbers)
  (/ (loop for i in numbers sum i)
     (length numbers)))

首先检查一个空的数字列表可能也很有用。