1.(let ((x 'a))
(do ((x 1 (+ x 1))
(y x x))
((> x 5))
(format t "(~A ~A) " x y)))
输出为:(1 A) (2 1) (3 2) (4 3) (5 4)
NIL
2.(let ((x 'a))
(do ((x 1 (+ x 1))
(y x))
((> x 5))
(format t "(~A ~A) " x y)))
输出为:(1 A) (2 A) (3 A) (4 A) (5 A)
NIL
这是为什么呢?
在2中(y x x)少了一个x,那么说明do中的变量没用,也可以说,第一个x代表let定义的值,第二个x代表的是do里的局部变量。
但是还有一个问题是是1中的输出为什么第一次是:(1 A),这里引用树上的一段话:每一次循环,x的值是前一个值加1,y的值是前一个的x的值。因为第一次进循环,x为1,x之前的值为a,此时输出为(1 A),update-form的值为(+ 1 1);第二次进循环时,x的值为2,x之前的值为1,y的值也就是1,此时输出为:(2 1)......
(do ((x 1 (+ x 1))
(y x x))
((> x 5))
(format t "(~A ~A) " x y)))
输出为:(1 A) (2 1) (3 2) (4 3) (5 4)
NIL
2.(let ((x 'a))
(do ((x 1 (+ x 1))
(y x))
((> x 5))
(format t "(~A ~A) " x y)))
输出为:(1 A) (2 A) (3 A) (4 A) (5 A)
NIL
这是为什么呢?
在2中(y x x)少了一个x,那么说明do中的变量没用,也可以说,第一个x代表let定义的值,第二个x代表的是do里的局部变量。
但是还有一个问题是是1中的输出为什么第一次是:(1 A),这里引用树上的一段话:每一次循环,x的值是前一个值加1,y的值是前一个的x的值。因为第一次进循环,x为1,x之前的值为a,此时输出为(1 A),update-form的值为(+ 1 1);第二次进循环时,x的值为2,x之前的值为1,y的值也就是1,此时输出为:(2 1)......