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:

  1. (concatenate 'vector #(1 2 3) '(4 5 6)) ==> #(1 2 3 4 5 6)
  2. (concatenate 'list #(1 2 3) '(4 5 6)) ==> (1 2 3 4 5 6)
  3. (concatenate 'string "abc" '(#\d #\e #\f)) ==> "abcdef"