

@node Strings, Sequences, Arrays, Top
@chapter Strings

@menu
* String Concepts::		
* Strings Dictionary::		
@end menu

@node String Concepts, Strings Dictionary, Strings, Strings
@section String Concepts

@c including concept-strings

@menu
* Implications of Strings Being Arrays::  
* Subtypes of STRING::		
@end menu

@node Implications of Strings Being Arrays, Subtypes of STRING, String Concepts, String Concepts
@subsection Implications of Strings Being Arrays

Since all @i{strings} are @i{arrays}, all rules which apply
generally to @i{arrays} also apply to @i{strings}.
See @ref{Array Concepts}.

For example,
     @i{strings} can have @i{fill pointers},
 and @i{strings} are also subject to the rules of @i{element type} @i{upgrading}
        that apply to @i{arrays}.

@node Subtypes of STRING,  , Implications of Strings Being Arrays, String Concepts
@subsection Subtypes of STRING

All functions that operate on @i{strings} 
will operate on @i{subtypes} of @i{string} as well.

However,
the consequences are undefined if a @i{character} is inserted into a @i{string}
for which the @i{element type} of the @i{string} does not include that @i{character}.

@c end of including concept-strings

@node Strings Dictionary,  , String Concepts, Strings
@section Strings Dictionary

@c including dict-strings

@menu
* string (System Class)::	
* base-string::			
* simple-string::		
* simple-base-string::		
* simple-string-p::		
* char::			
* string::			
* string-upcase::		
* string-trim::			
* string=::			
* stringp::			
* make-string::			
@end menu

@node string (System Class), base-string, Strings Dictionary, Strings Dictionary
@subsection string                                                       [System Class]

@subsubheading  Class Precedence List::
@b{string},
@b{vector},
@b{array},
@b{sequence},
@b{t}

@subsubheading  Description::

A @i{string} is a @i{specialized} @i{vector} 
whose @i{elements} are of @i{type} @b{character} or a @i{subtype} of @i{type} @b{character}.  
When used as a @i{type specifier} for object creation,
@b{string} means @t{(vector character)}.

@subsubheading  Compound Type Specifier Kind::

Abbreviating.

@subsubheading  Compound Type Specifier Syntax::

(@code{string}@{@i{@t{[}size@t{]}}@})

@subsubheading  Compound Type Specifier Arguments::

@i{size}---a non-negative @i{fixnum},
	    or the @i{symbol} @b{*}.

@subsubheading  Compound Type Specifier Description::

This denotes the union of all @i{types}
@t{(array @i{c} (@i{size}))}
for all @i{subtypes} @i{c} of @b{character};
that is, the set of @i{strings} of size @i{size}.

@subsubheading  See Also::

@ref{String Concepts},
@ref{Double-Quote},
@ref{Printing Strings}

@node base-string, simple-string, string (System Class), Strings Dictionary
@subsection base-string                                                          [Type]

@subsubheading  Supertypes::

@b{base-string},
@b{string},
@b{vector},
@b{array},
@b{sequence},
@b{t}

@subsubheading  Description::

The @i{type} @b{base-string} is equivalent to 

@t{(vector base-char)}.

The @i{base string} representation is the most efficient @i{string} representation
that can hold an arbitrary sequence of @i{standard characters}.

@subsubheading  Compound Type Specifier Kind::

Abbreviating.

@subsubheading  Compound Type Specifier Syntax::

(@code{base-string}@{@i{@t{[}size@t{]}}@})

@subsubheading  Compound Type Specifier Arguments::

@i{size}---a non-negative @i{fixnum},
	    or the @i{symbol} @b{*}.

@subsubheading  Compound Type Specifier Description::

This is equivalent to the type @t{(vector base-char @i{size})};
that is, the set of @i{base strings} of size @i{size}.

@node simple-string, simple-base-string, base-string, Strings Dictionary
@subsection simple-string                                                        [Type]

@subsubheading  Supertypes:: 

@b{simple-string},
@b{string},
@b{vector},
@b{simple-array},
@b{array},
@b{sequence},
@b{t}

@subsubheading  Description::

A @i{simple string} is a specialized one-dimensional
@i{simple array} whose @i{elements} are of @i{type} @b{character} or a @i{subtype} of @i{type} @b{character}.
When used as a @i{type specifier} for object creation,
@b{simple-string} means @t{(simple-array character (@i{size}))}.

@subsubheading  Compound Type Specifier Kind::

Abbreviating.

@subsubheading  Compound Type Specifier Syntax::

(@code{simple-string}@{@i{@t{[}size@t{]}}@})

@subsubheading  Compound Type Specifier Arguments::

@i{size}---a non-negative @i{fixnum},
	    or the @i{symbol} @b{*}.

@subsubheading  Compound Type Specifier Description::

This denotes the union of all @i{types}
@t{(simple-array @i{c} (@i{size}))} for all @i{subtypes} @i{c} of
@b{character}; that is, the set of @i{simple strings} of size @i{size}.

@node simple-base-string, simple-string-p, simple-string, Strings Dictionary
@subsection simple-base-string                                                   [Type]

@subsubheading  Supertypes::

@b{simple-base-string},
@b{base-string},
@b{simple-string},
@b{string},
@b{vector},
@b{simple-array},
@b{array},
@b{sequence},
@b{t}

@subsubheading  Description::

The @i{type} @b{simple-base-string} is equivalent to 

@t{(simple-array base-char (*))}.

@subsubheading  Compound Type Specifier Kind::

Abbreviating.

@subsubheading  Compound Type Specifier Syntax::

(@code{simple-base-string}@{@i{@t{[}size@t{]}}@})

@subsubheading  Compound Type Specifier Arguments::

@i{size}---a non-negative @i{fixnum},
	    or the @i{symbol} @b{*}.

@subsubheading  Compound Type Specifier Description::

This is equivalent to the type @t{(simple-array base-char (@i{size}))};
that is, the set of @i{simple base strings} of size @i{size}.

@node simple-string-p, char, simple-base-string, Strings Dictionary
@subsection simple-string-p                                                  [Function]

@code{simple-string-p}  @i{object} @result{}  @i{generalized-boolean}

@subsubheading  Arguments and Values::

@i{object}---an @i{object}.

@i{generalized-boolean}---a @i{generalized boolean}.

@subsubheading  Description::

Returns @i{true} if @i{object} is of @i{type} @b{simple-string};
otherwise, returns @i{false}.

@subsubheading  Examples::
@example
 (simple-string-p "aaaaaa") @result{}  @i{true}
 (simple-string-p (make-array 6 
                              :element-type 'character 
                              :fill-pointer t)) @result{}  @i{false}
@end example

@subsubheading  Notes::
@example
 (simple-string-p @i{object}) @equiv{} (typep @i{object} 'simple-string)
@end example

@node char, string, simple-string-p, Strings Dictionary
@subsection char, schar                                                      [Accessor]

@code{char}  @i{string index} @result{}  @i{character}

@code{schar}  @i{string index} @result{}  @i{character}

(setf (@code{char} @i{string index}) new-character)@*(setf (@code{schar} @i{string index}) new-character)@*

@subsubheading  Arguments and Values:: 

@i{string}---for @b{char},  a @i{string};
		 for @b{schar}, a @i{simple string}.

@i{index}---a @i{valid array index} for the @i{string}.

@i{character}, @i{new-character}---a @i{character}.

@subsubheading  Description::

@b{char} and @b{schar} @i{access} the @i{element} of @i{string}
specified by @i{index}.

@b{char} ignores @i{fill pointers} when @i{accessing} @i{elements}.

@subsubheading  Examples::

@example
 (setq my-simple-string (make-string 6 :initial-element #\A)) @result{}  "AAAAAA"
 (schar my-simple-string 4) @result{}  #\A
 (setf (schar my-simple-string 4) #\B) @result{}  #\B
 my-simple-string @result{}  "AAAABA"
 (setq my-filled-string
       (make-array 6 :element-type 'character
                     :fill-pointer 5
                     :initial-contents my-simple-string))
@result{}  "AAAAB"
 (char my-filled-string 4) @result{}  #\B
 (char my-filled-string 5) @result{}  #\A
 (setf (char my-filled-string 3) #\C) @result{}  #\C
 (setf (char my-filled-string 5) #\D) @result{}  #\D
 (setf (fill-pointer my-filled-string) 6) @result{}  6
 my-filled-string @result{}  "AAACBD"
@end example

@subsubheading  See Also::

@ref{aref}
,
@ref{elt}
,

@ref{Compiler Terminology}

@subsubheading  Notes::

@example
 (char s j) @equiv{} (aref (the string s) j)
@end example

@node string, string-upcase, char, Strings Dictionary
@subsection string                                                           [Function]

@code{string}  @i{x} @result{}  @i{string}

@subsubheading  Arguments and Values::

@i{x}---a @i{string}, a @i{symbol}, or a @i{character}.

@i{string}---a @i{string}.

@subsubheading  Description::

Returns a @i{string} described by @i{x}; specifically:

@table @asis

@item @t{*}  
If @i{x} is a @i{string}, it is returned.
@item @t{*}  
If @i{x} is a @i{symbol}, its @i{name} is returned.
@item @t{*}  

If @i{x} is a @i{character},

then a @i{string} containing that one @i{character} is returned.
@item @t{*}  

@b{string} might perform additional, @i{implementation-defined} conversions.

@end table

@subsubheading  Examples::

@example
 (string "already a string") @result{}  "already a string"
 (string 'elm) @result{}  "ELM"
 (string #\c) @result{}  "c"
@end example

@subsubheading  Exceptional Situations::

In the case where a conversion is defined neither by this specification nor
by the @i{implementation}, an error of @i{type} @b{type-error} is signaled.

@subsubheading  See Also::

@ref{coerce}
,
@b{string} (@i{type}).

@subsubheading  Notes::

@b{coerce} can be used to convert a @i{sequence} of @i{characters}
to a @i{string}.

@b{prin1-to-string}, @b{princ-to-string}, @b{write-to-string},
or @b{format} (with a first argument of @b{nil}) can be used to get a
@i{string} representation of a @i{number} or any other @i{object}.

@node string-upcase, string-trim, string, Strings Dictionary
@subsection string-upcase, string-downcase, string-capitalize, 
@subheading nstring-upcase, nstring-downcase, nstring-capitalize
@flushright
@i{[Function]}
@end flushright

@code{string-upcase}  @i{string @r{&key} start end} @result{}  @i{cased-string}

@code{string-downcase}  @i{string @r{&key} start end} @result{}  @i{cased-string}

@code{string-capitalize}  @i{string @r{&key} start end} @result{}  @i{cased-string}

@code{nstring-upcase}  @i{string @r{&key} start end} @result{}  @i{string}

@code{nstring-downcase}  @i{string @r{&key} start end} @result{}  @i{string}

@code{nstring-capitalize}  @i{string @r{&key} start end} @result{}  @i{string}

@subsubheading  Arguments and Values:: 

@i{string}---a @i{string designator}.
  For @b{nstring-upcase},
      @b{nstring-downcase},
  and @b{nstring-capitalize},
  the @i{string} @i{designator} must be a @i{string}.

@i{start}, @i{end}---@i{bounding index designators} of @i{string}.
 The defaults for @i{start} and @i{end} are @t{0} and @b{nil}, respectively.

@i{cased-string}---a @i{string}.

@subsubheading  Description::

@b{string-upcase},  @b{string-downcase},  @b{string-capitalize},
@b{nstring-upcase}, @b{nstring-downcase}, @b{nstring-capitalize}
change the case of the subsequence of @i{string} 
@i{bounded} by @i{start} and @i{end} 
as follows:

@table @asis

@item string-upcase  
@b{string-upcase} returns a @i{string} just like @i{string} 
with all lowercase characters replaced by the corresponding uppercase 
characters.  More precisely, each character of the result @i{string} 
is produced by applying the @i{function} @b{char-upcase} to the corresponding
character of @i{string}.

@item string-downcase  
@b{string-downcase} is like @b{string-upcase} 
except that all uppercase characters are replaced by the corresponding 
lowercase characters (using @b{char-downcase}).

@item string-capitalize  
@b{string-capitalize} produces a copy of @i{string} such that,
for every word in the copy, the first @i{character} of the ``word,''
if it has @i{case}, is @i{uppercase} and
any other @i{characters} with @i{case} in the word are @i{lowercase}.
For the purposes of @b{string-capitalize},
a ``word'' is defined to be a
consecutive subsequence consisting of @i{alphanumeric} @i{characters},
delimited at each end either by a non-@i{alphanumeric} @i{character}
or by an end of the @i{string}.

@item nstring-upcase, nstring-downcase, nstring-capitalize   
@b{nstring-upcase}, @b{nstring-downcase},
and @b{nstring-capitalize} are identical to @b{string-upcase}, 
@b{string-downcase}, and @b{string-capitalize}
respectively except that they  modify @i{string}.
@end table

For @b{string-upcase}, @b{string-downcase}, and @b{string-capitalize},
@i{string} is not modified.  However, if no characters in @i{string} 
require conversion, the result may be either @i{string} or a copy of it,
at the implementation's discretion.

@subsubheading  Examples::
@example
 (string-upcase "abcde") @result{}  "ABCDE"
 (string-upcase "Dr. Livingston, I presume?")
@result{}  "DR. LIVINGSTON, I PRESUME?"
 (string-upcase "Dr. Livingston, I presume?" :start 6 :end 10)
@result{}  "Dr. LiVINGston, I presume?"
 (string-downcase "Dr. Livingston, I presume?")
@result{}  "dr. livingston, i presume?"

 (string-capitalize "elm 13c arthur;fig don't") @result{}  "Elm 13c Arthur;Fig Don'T"
 (string-capitalize " hello ") @result{}  " Hello "
 (string-capitalize "occlUDeD cASEmenTs FOreSTAll iNADVertent DEFenestraTION")
@result{}   "Occluded Casements Forestall Inadvertent Defenestration"
 (string-capitalize 'kludgy-hash-search) @result{}  "Kludgy-Hash-Search"
 (string-capitalize "DON'T!") @result{}  "Don'T!"    ;not "Don't!"
 (string-capitalize "pipe 13a, foo16c") @result{}  "Pipe 13a, Foo16c"

 (setq str (copy-seq "0123ABCD890a")) @result{}  "0123ABCD890a"
 (nstring-downcase str :start 5 :end 7) @result{}  "0123AbcD890a"
 str @result{}  "0123AbcD890a"
@end example

@subsubheading  Side Effects::

    @b{nstring-upcase},
    @b{nstring-downcase}, 
and @b{nstring-capitalize} modify @i{string} as appropriate
rather than constructing a new @i{string}.

@subsubheading  See Also::

@ref{char-upcase}
, @b{char-downcase}

@subsubheading  Notes::
The result is always of the same length
as @i{string}.

@node string-trim, string=, string-upcase, Strings Dictionary
@subsection string-trim, string-left-trim, string-right-trim                 [Function]

@code{string-trim}  @i{character-bag string} @result{}  @i{trimmed-string}

@code{string-left-trim}  @i{character-bag string} @result{}  @i{trimmed-string}

@code{string-right-trim}  @i{character-bag string} @result{}  @i{trimmed-string}

@subsubheading  Arguments and Values::

@i{character-bag}---a @i{sequence} containing @i{characters}.

@i{string}---a @i{string designator}.

@i{trimmed-string}---a @i{string}.

@subsubheading  Description::

@b{string-trim} returns a substring of @i{string}, 
with all characters in @i{character-bag} stripped off the beginning and end.
@b{string-left-trim} is similar but strips characters off only the beginning; 
@b{string-right-trim} strips off only the end.

If no @i{characters} need to be trimmed from the @i{string},
then either @i{string} itself or a copy of it may be returned,
at the discretion of the implementation.

All of these @i{functions} observe the @i{fill pointer}.

@subsubheading  Examples::
@example
 (string-trim "abc" "abcaakaaakabcaaa") @result{}  "kaaak"
 (string-trim '(#\Space #\Tab #\Newline) " garbanzo beans
        ") @result{}  "garbanzo beans"
 (string-trim " (*)" " ( *three (silly) words* ) ")
@result{}  "three (silly) words"

 (string-left-trim "abc" "labcabcabc") @result{}  "labcabcabc"
 (string-left-trim " (*)" " ( *three (silly) words* ) ")
@result{}  "three (silly) words* ) "

 (string-right-trim " (*)" " ( *three (silly) words* ) ") 
@result{}  " ( *three (silly) words"
@end example

@subsubheading  Affected By::

The @i{implementation}.

@node string=, stringp, string-trim, Strings Dictionary
@subsection string=, string/=, string<, string>, string<=, string>=, 
@subheading string-equal, string-not-equal, string-lessp, 
@subheading string-greaterp, string-not-greaterp, string-not-lessp
@flushright
@i{[Function]}
@end flushright

@code{string=}  @i{string1 string2 @r{&key} start1 end1 start2 end2} @result{}  @i{generalized-boolean}

@code{string/=}  @i{string1 string2 @r{&key} start1 end1 start2 end2} @result{}  @i{mismatch-index}

@code{string<}  @i{string1 string2 @r{&key} start1 end1 start2 end2} @result{}  @i{mismatch-index}

@code{string>}  @i{string1 string2 @r{&key} start1 end1 start2 end2} @result{}  @i{mismatch-index}

@code{string<=}  @i{string1 string2 @r{&key} start1 end1 start2 end2} @result{}  @i{mismatch-index}

@code{string>=}  @i{string1 string2 @r{&key} start1 end1 start2 end2} @result{}  @i{mismatch-index}

@code{string-equal}  @i{string1 string2 @r{&key} start1 end1 start2 end2} @result{}  @i{generalized-boolean}

@code{string-not-equal}  @i{string1 string2 @r{&key} start1 end1 start2 end2} @result{}  @i{mismatch-index}

@code{string-lessp}  @i{string1 string2 @r{&key} start1 end1 start2 end2} @result{}  @i{mismatch-index}

@code{string-greaterp}  @i{string1 string2 @r{&key} start1 end1 start2 end2} @result{}  @i{mismatch-index}

@code{string-not-greaterp}  @i{string1 string2 @r{&key} start1 end1 start2 end2} @result{}  @i{mismatch-index}

@code{string-not-lessp}  @i{string1 string2 @r{&key} start1 end1 start2 end2} @result{}  @i{mismatch-index}

@subsubheading  Arguments and Values::

@i{string1}---a @i{string designator}.

@i{string2}---a @i{string designator}.

@i{start1}, @i{end1}---@i{bounding index designators} of @i{string1}.
 The defaults for @i{start} and @i{end} are @t{0} and @b{nil}, respectively.

@i{start2}, @i{end2}---@i{bounding index designators} of @i{string2}.
 The defaults for @i{start} and @i{end} are @t{0} and @b{nil}, respectively.

@i{generalized-boolean}---a @i{generalized boolean}.

@i{mismatch-index}---a @i{bounding index} of @i{string1}, or @b{nil}.

@subsubheading  Description::

These functions perform lexicographic comparisons on @i{string1} and @i{string2}.
@b{string=} and @b{string-equal} are called equality functions;
the others are called inequality functions.
The comparison operations these @i{functions} perform are restricted
     to the subsequence of @i{string1} @i{bounded} by @i{start1} and @i{end1}
 and to the subsequence of @i{string2} @i{bounded} by @i{start2} and @i{end2}.

A string @i{a} is equal to a string @i{b} if it contains the same number
of characters, and the corresponding characters are the @i{same}
under @b{char=} or @b{char-equal}, as appropriate.

A string @i{a} is less than a string @i{b} if in the first position in
which they differ the character of @i{a} is less than the corresponding
character of @i{b} according to @b{char<} or @b{char-lessp} 
as appropriate, or if string @i{a} is a proper prefix of string @i{b}
(of shorter length and matching in all the characters of @i{a}).

The equality functions return a @i{generalized boolean} 
that is @i{true} if the strings are equal, 
or @i{false} otherwise.

The inequality functions return a @i{mismatch-index}
that is @i{true} if the strings are not equal,
or @i{false} otherwise.
When the @i{mismatch-index} is @i{true},
it is an @i{integer} representing the first character position at which the 
two substrings differ, as an offset from the beginning of @i{string1}.

The comparison has one of the following results:

@table @asis

@item @b{string=}  
@b{string=} is @i{true} if the supplied substrings are of
the same length and contain the @i{same} characters in corresponding
positions; otherwise it is @i{false}.

@item @b{string/=}  
@b{string/=} is @i{true} if the supplied substrings are 
different; otherwise it is @i{false}.

@item @b{string-equal}  
@b{string-equal} is just like @b{string=} 
except that differences in case are ignored; 
two characters are considered to be the same if @b{char-equal} is @i{true} of them.

@item @b{string<}  
@b{string<} is @i{true} if substring1 is less than substring2;
otherwise it is @i{false}.

@item @b{string>}  
@b{string>} is @i{true} if substring1 is greater than substring2;
otherwise it is @i{false}.

@item @b{string-lessp}, @b{string-greaterp}  
@b{string-lessp} and @b{string-greaterp} 
are exactly like @b{string<} and @b{string>}, respectively,
except that distinctions between uppercase and lowercase letters are ignored.
It is as if @b{char-lessp} were used instead of @b{char<}
for comparing characters.

@item @b{string<=}  
@b{string<=} is @i{true} if substring1 is less than or equal to substring2;
otherwise it is @i{false}.

@item @b{string>=}  
@b{string>=} is @i{true} if substring1 is greater than or equal to substring2;
otherwise it is @i{false}.

@item @b{string-not-greaterp}, @b{string-not-lessp}  
@b{string-not-greaterp} and @b{string-not-lessp}
are exactly like @b{string<=} and @b{string>=}, respectively, 
except that distinctions between uppercase and lowercase letters are ignored.
It is as if @b{char-lessp} were used instead of @b{char<}
for comparing characters.

@end table

@subsubheading  Examples::

@example
 (string= "foo" "foo") @result{}  @i{true}
 (string= "foo" "Foo") @result{}  @i{false}
 (string= "foo" "bar") @result{}  @i{false}
 (string= "together" "frog" :start1 1 :end1 3 :start2 2) @result{}  @i{true}
 (string-equal "foo" "Foo") @result{}  @i{true}
 (string= "abcd" "01234abcd9012" :start2 5 :end2 9) @result{}  @i{true}
 (string< "aaaa" "aaab") @result{}  3
 (string>= "aaaaa" "aaaa") @result{}  4
 (string-not-greaterp "Abcde" "abcdE") @result{}  5
 (string-lessp "012AAAA789" "01aaab6" :start1 3 :end1 7
                                      :start2 2 :end2 6) @result{}  6
 (string-not-equal "AAAA" "aaaA") @result{}  @i{false}
@end example

@subsubheading  See Also::

@ref{char=}

@subsubheading  Notes::

@b{equal} calls @b{string=} if applied to two @i{strings}.

@node stringp, make-string, string=, Strings Dictionary
@subsection stringp                                                          [Function]

@code{stringp}  @i{object} @result{}  @i{generalized-boolean}

@subsubheading  Arguments and Values::

@i{object}---an @i{object}.

@i{generalized-boolean}---a @i{generalized boolean}.

@subsubheading  Description::

Returns @i{true} if @i{object} is of @i{type} @b{string};
otherwise, returns @i{false}.

@subsubheading  Examples::

@example
 (stringp "aaaaaa") @result{}  @i{true}
 (stringp #\a) @result{}  @i{false}
@end example

@subsubheading  See Also::

@ref{typep}
,
@b{string} (@i{type})

@subsubheading  Notes::

@example
 (stringp @i{object}) @equiv{} (typep @i{object} 'string)
@end example

@node make-string,  , stringp, Strings Dictionary
@subsection make-string                                                      [Function]

@code{make-string}  @i{size @r{&key} initial-element element-type} @result{}  @i{string}

@subsubheading  Arguments and Values::

@i{size}---a @i{valid array dimension}.

@i{initial-element}---a @i{character}.

 The default is @i{implementation-dependent}.

@i{element-type}---a @i{type specifier}.
 The default is @b{character}.

@i{string}---a @i{simple string}.

@subsubheading  Description::

@b{make-string} returns a @i{simple string} of length @i{size}
whose elements have been initialized to @i{initial-element}.

The @i{element-type} names the @i{type} of the @i{elements} of the @i{string};
a @i{string} is constructed of the most @i{specialized}
@i{type} that can accommodate @i{elements} of the given @i{type}.  

@subsubheading  Examples::

@example
 (make-string 10 :initial-element #\5) @result{}  "5555555555"
 (length (make-string 10)) @result{}  10
@end example

@subsubheading  Affected By::

The @i{implementation}.

@c end of including dict-strings

@c %**end of chapter

