Given a list pp of permutations we can form their product by means of a
for loop instead of writing down the product explicitly.
    gap> pp:= [ (1,3,2,6,8)(4,5,9), (1,6)(2,7,8)(4,9), (1,5,7)(2,3,8,6),
    >           (1,8,9)(2,3,5,6,4), (1,9,8,6,3,4,7,2) ];;
    gap> prod:= ();
    ()
    gap> for p in pp do
    >       prod:= prod * p;
    >    od;
    gap> prod;
    (1,8,4,2,3,6,5) 
First  a  new variable prod is initialized to the  identity permutation
().  Then  the  loop variable p  takes as its  value one  permutation
after the other from  the  list  pp and is multiplied with  the present
value of  prod  resulting in a new  value  which  is then  assigned  to
prod.
The for loop has the following syntax.
for var in list do statements od;
The  effect of the for  loop  is to execute the statements for  every
element  of  the list.   A for  loop  is  a  statement  and therefore
terminated by a semicolon.  The list of statements  is enclosed by  the
keywords do and od  (reverse  do).  A for  loop returns no value.
Therefore we had  to  ask  explicitly for  the  value  of  prod in  the
preceding example.
The for  loop  can loop over any kind of  list, even a list with holes.
In many  programming languages (and  in  former versions  of GAP, too)
the for loop has the form
for var from first to last do statements od;
But this is merely a special  case of  the general  for loop as defined
above where the list in the loop body is a range.
for var in [first..last] do statements od;
You can for instance loop over a range to compute the factorial 15! of the number 15 in the following way.
    gap> ff:= 1;
    1
    gap> for i in [1..15] do
    >       ff:= ff * i;
    >    od;
    gap> ff;
    1307674368000 
The following example introduces the while loop which has the following
syntax.
while condition do statements od;
The while loop loops over the statements  as  long as the condition
evaluates to true.  Like the for loop the  while loop is terminated
by the keyword od followed by a semicolon.
We can use  our list primes to perform a very simple factorization.  We
begin by  initializing a list factors to the empty list.   In this list
we want to collect the prime factors of the number 1333.  Remember that a
list has to exist  before any values  can be assigned to positions of the
list.  Then we  will loop over the list primes and  test for each prime
whether it divides the  number.  If it does we will  divide the number by
that prime, add it to the list factors and continue.
    gap> n:= 1333;
    1333
    gap> factors:= [];
    [  ]
    gap> for p in primes do
    >       while n mod p = 0 do
    >          n:= n/p;
    >          Add(factors, p);
    >       od;
    >    od;
    gap> factors;
    [ 31, 43 ]
    gap> n;
    1 
As n now has the value 1 all prime factors  of 1333 have been found and
factors contains a complete factorization of  1333.  This can of course
be verified by multiplying 31 and 43.
This loop  may  be applied  to arbitrary  numbers in order  to find prime
factors.  But  as primes is not a complete list of all primes this loop
may fail  to find all prime factors of  a number greater than 2000,  say.
You  can try to improve it in such a way that new primes are added to the
list primes if needed.
You have already seen that list objects may be  changed.   This holds  of
course also for the  list in a loop body.  In most  cases  you have to be
careful not  to change this list, but there are situations  where this is
quite useful.  The following example  shows a quick way  to determine the
primes smaller than 1000 by a sieve method.  Here we will make use of the
function Unbind to delete entries from a list.
    gap> primes:= [];
    [  ]
    gap> numbers:= [2..1000];
    [ 2 .. 1000 ]
    gap> for p in numbers do
    >       Add(primes, p);
    >       for n in numbers do
    >          if n mod p = 0 then
    >             Unbind(numbers[n-1]);
    >          fi;
    >       od;
    >    od; 
The inner loop  removes all entries from numbers that are  divisible by
the last detected prime p.  This is done by the function Unbind which
deletes the binding of the list position  numbers[n-1] to the value n
so that afterwards numbers[n-1] no longer has  an  assigned value.  The
next  element encountered in numbers  by the outer  loop necessarily is
the next prime.
In a similar way it is possible to enlarge the list which is looped over. This yields a nice and short orbit algorithm for the action of a group, for example.
In this section  you have learned how  to loop over a  list by the  for
loop and how to loop with respect to a logical condition with the while
loop.  You have seen that even the list in the loop body can be changed.
The  for loop is described in For.  The while  loop is described in
While.
GAP 3.4.4