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
。我调查过:
collect
但是 return 是一个包含我想要的值的值列表(末尾的最后一个 j
)
finally
但是没用。
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
,或者你想达到什么,以获得更好的答案。
(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
。我调查过:
collect
但是 return 是一个包含我想要的值的值列表(末尾的最后一个j
)finally
但是没用。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
,或者你想达到什么,以获得更好的答案。