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

pre*_*to8 4 common-lisp

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

(loop for a from 5 to 10
      and b = a do
      (format t "~d ~d~%" a b))
Run Code Online (Sandbox Code Playgroud)

使用SCBL,它会产生以下输出:

5 5
6 5
7 6
8 7
9 8
10 9
Run Code Online (Sandbox Code Playgroud)

我期待a和b的值在每一行上都是相同的.

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

Rai*_*wig 12

(loop for a from 5 to 10
      and b = a
      do (format t "~d ~d~%" a b))
Run Code Online (Sandbox Code Playgroud)

上面的代码在概念上可以看作接近PSETF.值以"并行"更新.原因是AND.

让我们用FOR替换AND:

(loop for a from 5 to 10
      for b = a
      do (format t "~d ~d~%" a b))
Run Code Online (Sandbox Code Playgroud)

上面将在概念上更新变量接近通常的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
Run Code Online (Sandbox Code Playgroud)

有关解释,请参阅Common Lisp HyperSpec 6.1.2.1迭代控件:

如果使用多个迭代子句来控制迭代,则默认情况下顺序发生变量初始化和步进. 当不需要顺序绑定和步进时,构造可用于连接两个或多个迭代子句.条款的迭代行为加入了类似于宏的行为要做*.