
% Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd.
% All rights reserved.
%
% Redistribution and use in source and binary forms, with or without
% modification, are permitted provided that the following conditions are
% met:
%
%     - Redistributions of source code must retain the above copyright
%       notice, this list of conditions and the following disclaimer.
%
%     - Redistributions in binary form must reproduce the above copyright
%       notice, this list of conditions and the following disclaimer in
%       the documentation and/or other materials provided with the
%       distribution.
%
%     - Neither the name of The Numerical ALgorithms Group Ltd. nor the
%       names of its contributors may be used to endorse or promote products
%       derived from this software without specific prior written permission.
%
% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
% IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
% TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
% PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
% OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
% EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
% PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES-- LOSS OF USE, DATA, OR
% PROFITS-- OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
% LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
% NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
% SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.



The \spadtype{CharacterClass} domain allows classes of characters to be
defined and manipulated efficiently.
\exptypeindex{Character}

\xtc{
Character classes can be created by giving either a string or a list
of characters.
}{
\spadcommand{cl1 := charClass [char "a", char "e", char "i", char "o", char "u", char "y"] \bound{cl1}}
}
\xtc{
}{
\spadcommand{cl2 := charClass "bcdfghjklmnpqrstvwxyz" \bound{cl2}}
}
\xtc{
A number of character classes are predefined for convenience.
}{
\spadcommand{digit()}
}
\xtc{
}{
\spadcommand{hexDigit()}
}
\xtc{
}{
\spadcommand{upperCase()}
}
\xtc{
}{
\spadcommand{lowerCase()}
}
\xtc{
}{
\spadcommand{alphabetic()}
}
\xtc{
}{
\spadcommand{alphanumeric()}
}
\xtc{
You can quickly test whether a character belongs to a class.
}{
\spadcommand{member?(char "a", cl1) \free{cl1}}
}
\xtc{
}{
\spadcommand{member?(char "a", cl2) \free{cl2}}
}
\xtc{
Classes have the usual set operations because
the \spadtype{CharacterClass} domain belongs to the category
\spadtype{FiniteSetAggregate(Character)}.
}{
\spadcommand{intersect(cl1, cl2)  \free{cl1 cl2}}
}
\xtc{
}{
\spadcommand{union(cl1,cl2)       \free{cl1 cl2}}
}
\xtc{
}{
\spadcommand{difference(cl1,cl2)  \free{cl1 cl2}}
}
\xtc{
}{
\spadcommand{intersect(complement(cl1),cl2)  \free{cl1 cl2}}
}
\xtc{
You can modify character classes by adding or removing characters.
}{
\spadcommand{insert!(char "a", cl2) \free{cl2}\bound{cl22}}
}
\xtc{
}{
\spadcommand{remove!(char "b", cl2) \free{cl22}\bound{cl23}}
}

For more information on related topics, see
\xmpref{Character} and
\xmpref{String}.
%
\showBlurb{CharacterClass}
