1.Do
(do ((temp-one 1 (1+ temp-one))
(temp-two 0 (1- temp-two)))
((> (- temp-one temp-two) 5) temp-one)) => 4
(do ((temp-one 1 (1+ temp-one))
(temp-two 0 (1+ temp-one)))
((= 3 temp-two) temp-one)) => 3
第一次循环将temp-one和temp-two用初始值(1,0)初始化,再计算最后的循环终止条件,如果结果为false,那么运行body里的代码;第二次循环,先计算step-form里的内容,这里注意几点:1.后面的step-form可以引用前面变量的值(如第二个例子temp-two 0 (1+ temp-one))
但是step-form的计算是并行的,即在temp-two的step-form里引用temp-one的值只能是上一次循环结束时保存的值(如第二个例子当temp-two为3时,实际temp-one为2,因为temp-two不等temp-one的step-form执行完再执行自己的step-form,并行)。
2.do*
(do* ((temp-one 1 (1+ temp-one))
(temp-two 0 (1+ temp-one)))
((= 3 temp-two) temp-one)) => 2
Do*和do很相似,但是do*计算step-form时是串行的。
3.Dolist
(setq temp-two '()) => NIL
(dolist (temp-one '(1 2 3 4) temp-two) (push temp-one temp-two)) => (4 3 2 1)
(setq temp-two 0) => 0
(dolist (temp-one '(1 2 3 4)) (incf temp-two)) => NIL
temp-two => 4
(dolist (x '(a b c d)) (prin1 x) (princ " "))
>> A B C D
=> NIL
4.Dotimes
(dotimes (temp-one 10 temp-one)) => 10
(setq temp-two 0) => 0
(dotimes (temp-one 10 t) (incf temp-two)) => T
temp-two => 10
Dotimes是针对integer操作的(上面例子的10),var(temp-one)每次都会是0至10之间的一个数字,body里利用这个变量做些事情。
分享到:
相关推荐
Includes discussion and examples of advanced constructs for iteration, error handling, object oriented programming, graphical user interfaces, and threading. Supplements Common Lisp reference books ...
#### 9.6 Iteration 迭代 - Lisp提供了多种迭代结构,如DO、DOTIMES等。 - 例如:`(dotimes (i 5) (print i))` 输出0到4。 #### 9.7 Loop Facility 循环设施 - LOOP宏提供了更强大的循环结构。 - 例如:`(loop ...
书中系统地介绍了计算机程序设计的基本原理和方法,并通过具体的程序设计语言——Scheme(一种Lisp方言)来进行阐述。 #### 重要概念和知识点详解 ##### 1. 建立抽象的过程 (Building Abstraction with Procedures...