我正在尝试将此 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
hit 1000 使上面的整个表达式返回(* a b c)
。如何从嵌套循环宏返回一些值?
您可以使用block
and return-from
运营商:block
建立一个命名的代码块,您可以从该块返回return-from
使用块的名称
(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。如果命名子句出现在循环中,则它必须是第一个子句。举一个简单的示例,假设列表是列表的列表,并且您希望在其中一个嵌套列表中查找与某些条件匹配的项目。您可以通过一对嵌套循环找到它,如下所示:
(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))))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)