(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
但它提前结束了循环答案 0 :(得分:3)
(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
,或者你想要达到的目标,以获得更好的答案。