Common Lisp“循环for”宏如何与多个“和”ed计数器一起工作?

时间:2010-11-20 02:52:17

标签: common-lisp

以下Common Lisp代码不会产生我期望的输出:

(loop for a from 5 to 10
      and b = a do
      (format t "~d ~d~%" a b))

使用SCBL生成此输出:

5 5
6 5
7 6
8 7
9 8
10 9

我期望a和b的值在每一行都相同。

我已经在网上搜索了这个实例中的循环宏的良好文档,但找不到多少。我很感激任何见解!

2 个答案:

答案 0 :(得分:12)

(loop for a from 5 to 10
      and b = a
      do (format t "~d ~d~%" a b))

以上代码在概念上可以看作接近PSETF。值以“并行”更新。原因是AND。

让我们用FOR替换AND:

(loop for a from 5 to 10
      for b = a
      do (format t "~d ~d~%" a b))

上面会在概念上更新常见的SETF,“顺序”。

CL-USER 20 > (loop for a from 5 to 10
                   for b = a
                   do (format t "~d ~d~%" a b))
5 5
6 6
7 7
8 8
9 9
10 10

有关说明,请参阅Common Lisp HyperSpec 6.1.2.1 Iteration Control

  

如果使用多个迭代子句   控制迭代,变量   初始化和步进发生   默认顺序。   构造可以用来连接两个   或者更多的迭代子句   顺序绑定和步进是   不必要。迭代行为   由加入的子句类似   使用宏的行为   尊重做*

答案 1 :(得分:3)

在给出任何变量的新值之前,评估AND子句的步骤形式。请改用for b = a then a强制进行有序评估。

参考。 http://www.gigamonkeys.com/book/loop-for-black-belts.html#equals-then-iteration