Whole Sequence Manipulations
A handful of functions perform operations on a whole sequence (or sequences) at a time. These tend to be simpler than the other functions I’ve described so far. For instance, **COPY-SEQ**
and **REVERSE**
each take a single argument, a sequence, and each returns a new sequence of the same type. The sequence returned by **COPY-SEQ**
contains the same elements as its argument while the sequence returned by **REVERSE**
contains the same elements but in reverse order. Note that neither function copies the elements themselves—only the returned sequence is a new object.
The **CONCATENATE**
function creates a new sequence containing the concatenation of any number of sequences. However, unlike **REVERSE**
and **COPY-SEQ**
, which simply return a sequence of the same type as their single argument, **CONCATENATE**
must be told explicitly what kind of sequence to produce in case the arguments are of different types. Its first argument is a type descriptor, like the :element-type
argument to **MAKE-ARRAY**
. In this case, the type descriptors you’ll most likely use are the symbols **VECTOR**
, **LIST**
, or **STRING**
.9 For example:
(concatenate 'vector #(1 2 3) '(4 5 6)) ==> #(1 2 3 4 5 6)
(concatenate 'list #(1 2 3) '(4 5 6)) ==> (1 2 3 4 5 6)
(concatenate 'string "abc" '(#\d #\e #\f)) ==> "abcdef"