Lisp:如何获得最终的循环值?

Lisp: How to obtain the final loop value?

(defun index-iteration (n) 
  (let ((x 0))
    (loop for j from 0 to n while (< x n) do
      (setf x (max-index-for-iteration j)))))

我有以下 lisp 代码,在循环结束时我想 return 值 j。我调查过:

你需要像这样组合 finally and return:

(loop ...
  finally (return (1- j)))

请注意不幸的使用 1- 这是由于 finally 子句在 终止后 执行的事实 条款(while 在你的情况下)在那里转移控制权。 IOW,它需要了解如何处理终止条款。

您可以留在 loop 域中(没有额外的 let),例如 这个:

(loop for j from 0 to n
  for ret = j
  do ...
  finally (return ret))

您也可以使用 maximize 子句:

(loop for j from 0 to n ...
  maximize j)

但这依赖于 j 的最终值是最大值的知识。

PS。另请注意,您不需要 loop.

中的 while 子句

看起来你可能想要这样的东西,但我不确定:

(defun index-iteration (n)
  (loop :for j :from 0 :to n
        :for x := (max-index-for-iteration j)
        :while (<= x n)
        :finally (return (1- j))))

有几件事让这个味道像一个差一个:to<=,在你的问题代码中 x 总是 0在第一次迭代期间(n = 0 时应该发生什么?)。也许显示更多上下文,e。 G。 max-index-for-iteration,或者你想达到什么,以获得更好的答案。