Loops 从Common Lisp中的嵌套循环返回
我正在尝试将此Python代码转换为公共Lisp:Loops 从Common Lisp中的嵌套循环返回,loops,common-lisp,nested-loops,Loops,Common Lisp,Nested Loops,我正在尝试将此Python代码转换为公共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
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时,使上面的整个表达式返回(*abc)
。如何从嵌套循环宏返回一些值?您可以使用块
和从
返回运算符:块
建立一个命名的代码块,您可以使用块名从该块返回从
(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,我在这里不使用循环
,我只是习惯了做
也来自
要允许使用RETURN-FROM从特定循环返回(嵌套循环表达式时很有用),可以使用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))))
Python
return
语句不是从循环返回,而是从包含循环的整个函数返回。在Common Lisp中,函数建立一个与函数同名的隐式块。因此,您可以使用:
(return-from function-name (* a b c))
执行与Python代码等效的返回。我认为您的解决方案应该在保持Python代码原始形式的同时进行少量调整
(loop named outer for a from 1 below 1000 do
(loop for b from a below 1000
for c = (sqrt (+ (expt a 2) (expt b 2)))
for s = (+ a b c)
if (= s 1000) do (return-from outer (* a b c))))
如果您想输入中缀公式,可以使用quicklisp中提供的中缀库(ql:quickload:infix),然后修改上述内容以获得
(loop named outer for a from 1 below 1000 do
(loop for b from a below 1000
for c = #i(sqrt (a^^2 + b^^2))
for s = #i(a + b + c)
if (= s 1000) do (return-from outer #i(a * b * c))))