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

时间:2017-03-31 19:15:49

标签: lisp common-lisp clisp

(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代码,在循环结束时我想返回值j。我调查过了:

  • collect但会返回一个值列表,其中包含我想要的值(最后的j
  • finally但它不起作用。
  • return但它提前结束了循环

2 个答案:

答案 0 :(得分:3)

您需要合并 finallyreturn,如下所示:

(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。另请注意,您不需要while中的loop子句。

答案 1 :(得分:1)

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

(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,或者你想要达到的目标,以获得更好的答案。