以下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的值在每一行都相同。
我已经在网上搜索了这个实例中的循环宏的良好文档,但找不到多少。我很感激任何见解!
答案 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