Basic loops

Syntax

• (do ({var | (var [init-form [step-form]])}*) (end-test-form result-form*) declaration* {tag | statement}*)
• (do* ({var | (var [init-form [step-form]])}*) (end-test-form result-form*) declaration* {tag | statement}*)
• (dolist (var list-form [result-form]) declaration* {tag | statement}*)
• (dotimes (var count-form [result-form]) declaration* {tag | statement}*)

dolist

`dolist` is a looping macro created to easily loop through the lists. One of the simplest uses would be:

``````CL-USER> (dolist (item '(a b c d))
(print item))

A
B
C
D
NIL ; returned value is NIL
``````

Note that since we did not provide return value, `NIL` is returned (and A,B,C,D are printed to `*standard-output*`).

`dolist` can also return values:

``````;;This may not be the most readable summing function.
(defun sum-list (list)
(let ((sum 0))
(dolist (var list sum)
(incf sum var))))

CL-USER> (sum-list (list 2 3 4))
9
``````

dotimes

`dotimes` is a macro for integer iteration over a single variable from 0 below some parameter value. One of the simples examples would be:

``````CL-USER> (dotimes (i 5)
(print i))

0
1
2
3
4
NIL
``````

Note that `NIL` is the returned value, since we did not provide one ourselves; the variable starts from 0 and throughout the loop becomes values from 0 to N-1. After the loop, the variable becomes the N:

``````CL-USER> (dotimes (i 5 i))
5

CL-USER> (defun 0-to-n (n)
(let ((list ()))
(dotimes (i n (nreverse list))
(push i list))))
0-TO-N
CL-USER> (0-to-n 5)
(0 1 2 3 4)
``````

Simple loop

The loop macro has two forms: the "simple" form and the "extended" form. The extended form is covered in another documentation topic, but the simple loop is useful for very basic loop.

The simple loop form takes a number of forms and repeats them until the loop is exited using return or some other exit (e.g., throw).

``````(let ((x 0))
(loop
(print x)
(incf x)
(unless (< x 5)
(return))))

0
1
2
3
4
NIL
``````

2016-07-22
2016-08-08
common-lisp Pedia
Icon