我正在尝试将此 Python 代码转换为 Common Lisp:
for a in xrange(1,1000):
for b in xrange(a,1000):
c = (a**2 + b**2) ** 0.5
s = a + b + c
if s == 1000:
return a * b * c
我的第一次尝试是:
(loop for a from 1 to 999
do (loop for b from a to 999
for c = (sqrt (+ (expt a 2) (expt b 2)))
for s = (+ a b c)
until (= s 1000)
finally return (* a b c))))
这行不通。我的任务是:当
s
点击 1000 使上面的整个表达式返回 (* a b c)
.如何从嵌套循环宏中返回一些值?
最佳答案
您可以使用 block
和 return-from
运营商:block
建立一个命名的代码块,你可以从这个 block 返回 return-from
使用 block 的名称
(let (c s)
(block nested-loops
(do ((a 1 (1+ a))) ((= a 999))
(do ((b a (1+ b))) ((= b 999))
(setf c (sqrt (+ (expt a 2) (expt b 2)))
s (+ a b c))
(if (= s 1000)
(return-from nested-loops (* a b c)))))))
PS,我不使用
loop
在这里,我刚习惯do
.也来自 http://www.gigamonkeys.com/book/loop-for-black-belts.html
要允许使用 RETURN-FROM 从特定循环返回(在嵌套 LOOP 表达式时很有用),您可以使用命名的循环关键字命名 LOOP。如果命名子句出现在循环中,它必须是第一个子句。举个简单的例子,假设列表是一个列表列表,并且您希望在其中一个嵌套列表中找到与某些条件匹配的项目。你可以通过一对这样的嵌套循环找到它:
(loop named outer for list in lists do
(loop for item in list do
(if (what-i-am-looking-for-p item)
(return-from outer item))))
关于loops - 从 Common Lisp 中的嵌套循环返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14028497/