loops - 从 Common Lisp 中的嵌套循环返回

标签 loops common-lisp nested-loops

我正在尝试将此 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) .如何从嵌套循环宏中返回一些值?

最佳答案

您可以使用 blockreturn-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/

相关文章:

python - 最大化嵌套 for 循环的 cpu 使用率的最简单方法是什么?

Python:理解循环

javascript - 如何改进此算法以仅使用三个循环?

lisp - 如何在 Lisp Works 中对包含数字和字母的列表求和

ssl - 如何在后现代而不是 cl+ssl 中使用 Lispworks comm 包进行 SSL 访问

java - 如何统计数组中所有字母字符的个数?

php - 如何存储和重置 PHP 数组指针?

python - 为什么循环中只有一个警告?

file - 从文件中读取 Common Lisp

python - 在Python中循环列表和嵌套列表