Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 从Common Lisp中的嵌套循环返回_Loops_Common Lisp_Nested Loops - Fatal编程技术网

Loops 从Common 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

我正在尝试将此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 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))))