A list is a collection of objects separated by  commas and enclosed  in
brackets.  Let us for example construct the list primes of the first 10
prime numbers.
    gap> primes:= [2, 3, 5, 7, 11, 13, 17, 19, 23, 29];
    [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 ] 
The next two primes are  31 and 37.  They may be appended to the existing
list by the function Append which takes  the existing list as its first
and another list as a second argument.  The  second argument  is appended
to the list primes and  no  value is returned.  Note that  by appending
another list the object primes is changed.
    gap> Append(primes, [31, 37]);
    gap> primes;
    [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37 ] 
You can as well add single new elements to existing lists by the function
Add  which takes  the existing list  as its  first argument  and  a new
element as  its second argument.  The  new  element  is added to the list
primes and again no value is returned but the list primes is changed.
    gap> Add(primes, 41);
    gap> primes;
    [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41 ] 
Single elements of a list are referred to by their position in the  list.
To get the value  of the seventh prime, that is the seventh entry in  our
list primes, you simply type
    gap> primes[7];
    17 
and you  will get the  value  of the  seventh prime.  This  value  can be
handled like any other value, for example multiplied by 2 or  assigned to
a variable.  On the other hand this mechanism allows to assign a value to
a  position in  a list.  So the next prime 43 may be inserted in the list
directly  after  the  last  occupied  position  of primes.   This  last
occupied position is returned by the function Length.
    gap> Length(primes);
    13
    gap> primes[14]:= 43;
    43
    gap> primes;
    [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43 ] 
Note that this operation again has changed the object primes.  Not only
the next position of a list is capable  of taking  a  new  value.  If you
know that 71 is the 20th prime, you can as well enter it right now in the
20th position of primes.   This  will result in a list with holes which
is however still a list and has length 20 now.
    gap> primes[20]:= 71;
    71
    gap> primes;
    [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43,,,,,, 71 ]
    gap> Length(primes);
    20 
The list itself however must  exist before a  value can be  assigned to a
position of the list.  This list may be the empty list [ ].
    gap> lll[1]:= 2;
    Error, Variable: 'lll' must have a value
    gap> lll:= [];
    [  ]
    gap> lll[1]:= 2;
    2 
Of course  existing  entries of a  list can be changed by this mechanism,
too.  We will not do it here  because  primes then may no  longer  be a
list of primes.  Try for yourself to change the 17 in the list into a 9.
To  get  the  position  of  17  in  the  list  primes use  the function
Position  which takes the list as its first argument and the element as
its second  argument and returns the position of  the first occurrence of
the element 17 in  the list primes.  Position will return false  if
the element is not contained in the list.
    gap> Position(primes, 17);
    7
    gap> Position(primes, 20);
    false 
In  all  of the  above changes to  the  list primes,  the list has been
automatically resized.  There  is no need  for you to tell GAP how big
you want a list to be.  This is all done dynamically.
It is not necessary for the objects collected in a list to be of the same type.
    gap> lll:= [true, "This is a String",,, 3];
    [ true, "This is a String",,, 3 ] 
In the same way a list may be part of another list. A list may even be part of itself.
    gap> lll[3]:= [4,5,6];; lll;
    [ true, "This is a String", [ 4, 5, 6 ],, 3 ]
    gap> lll[4]:= lll;
    [ true, "This is a String", [ 4, 5, 6 ], ~, 3 ] 
Now the tilde ~ in the fourth position of lll denotes the object that
is currently printed.  Note that the  result of the last operation is the
actual  value of  the  object  lll  on  the  right  hand  side  of  the
assignment.  But in fact  it is identical to the value  of the whole list
lll on the left hand side of the assignment.
A  string  is  a  very  special  type of list,  which  is printed  in a
different way. A string is simply a dense list  of characters.  Strings
are used mainly in  filenames and error  messages.   A string literal can
either be  entered  simply as the list  of characters or  by writing  the
characters between doublequotes ".  GAP  will  always output strings
in the latter format.
    gap> s1 := ['H','a','l','l','o',' ','w','o','r','l','d','.'];
    "Hallo world."
    gap> s2 := "Hallo world.";
    "Hallo world."
    gap> s1 := ['H','a','l','l','o',' ','w','o','r','l','d','.'];
    "Hallo world."
    gap> s1 = s2;
    true
    gap> s2[7];
    'w' 
Sublists of lists can easily be extracted and assigned using the operator
{ }.
    gap> sl := lll{ [ 1, 2, 3 ] };
    [ true, "This is a String", [ 4, 5, 6 ] ]
    gap> sl{ [ 2, 3 ] } := [ "New String", false ];
    [ "New String", false ]
    gap> sl;
    [ true, "New String", false ] 
This way you get a new list that contains at position i that element
whose position is the ith entry of the argument of { }.
In this long section you have encountered the fundamental concept of a list. You have seen how to construct lists, how to extend them and how to refer to single elements of a list. Moreover you have seen that lists may contain elements of different types, even holes (unbound entries). But this is still not all we have to tell you about lists.
You will find a discussion about identity and equality of lists in the next section. Moreover you will see special kinds of lists like sets (in About Sets), vectors and matrices (in About Vectors and Matrices) and Strings and Characters.
GAP 3.4.4