如何 return 循环中的特定值

How to return a specific value in a loop

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

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

请记住,我这样做的时间并不长。 我也不是很清楚 Whosebug 中不成文的注意事项。

使用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 来满足您的基本统计需求。

如果你不在LOOP中使用多变量等高级特性,很容易简化它:

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

只要利用循环形式 returns 总和:

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

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