  
  [1X27 [33X[0;0YStrings and Characters[133X[101X
  
  
  [1X27.1 [33X[0;0YIsChar and IsString[133X[101X
  
  [1X27.1-1 IsChar[101X
  
  [29X[2XIsChar[102X( [3Xobj[103X ) [32X Category
  [29X[2XIsCharCollection[102X( [3Xobj[103X ) [32X Category
  
  [33X[0;0YA  [13Xcharacter[113X  is  simply  an  object  in  [5XGAP[105X  that  represents an arbitrary
  character from the character set of the operating system. Character literals
  can be entered in [5XGAP[105X by enclosing the character in [13Xsinglequotes[113X [10X'[110X.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27Xx:= 'a';  IsChar( x );[127X[104X
    [4X[28X'a'[128X[104X
    [4X[28Xtrue[128X[104X
    [4X[25Xgap>[125X [27X'*';[127X[104X
    [4X[28X'*'[128X[104X
  [4X[32X[104X
  
  [1X27.1-2 IsString[101X
  
  [29X[2XIsString[102X( [3Xobj[103X ) [32X filter
  
  [33X[0;0YA  [13Xstring[113X  is  a  dense  list (see [2XIsList[102X ([14X21.1-1[114X), [2XIsDenseList[102X ([14X21.1-2[114X)) of
  characters  (see [2XIsChar[102X  ([14X27.1-1[114X));  thus  strings  are  always  homogeneous
  (see [2XIsHomogeneousList[102X ([14X21.1-3[114X)).[133X
  
  [33X[0;0YA  string  literal  can  either  be  entered as the list of characters or by
  writing  the  characters  between  [13Xdoublequotes[113X  [10X"[110X.  [5XGAP[105X  will always output
  strings in the latter format. However, the input via the double quote syntax
  enables   [5XGAP[105X   to  store  the  string  in  an  efficient  compact  internal
  representation. See [2XIsStringRep[102X ([14X27.3-1[114X) below for more details.[133X
  
  [33X[0;0YEach  character, in particular those which cannot be typed directly from the
  keyboard,  can  also  be  typed  in three digit octal notation. And for some
  special   characters  (like  the  newline  character)  there  is  a  further
  possibility to type them, see section [14X27.2[114X.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27Xs1 := ['H','e','l','l','o',' ','w','o','r','l','d','.'];[127X[104X
    [4X[28X"Hello world."[128X[104X
    [4X[25Xgap>[125X [27XIsString( s1 );[127X[104X
    [4X[28Xtrue[128X[104X
    [4X[25Xgap>[125X [27Xs2 := "Hello world.";[127X[104X
    [4X[28X"Hello world."[128X[104X
    [4X[25Xgap>[125X [27Xs1 = s2;[127X[104X
    [4X[28Xtrue[128X[104X
    [4X[25Xgap>[125X [27Xs3 := "";  # the empty string[127X[104X
    [4X[28X""[128X[104X
    [4X[25Xgap>[125X [27Xs3 = [];[127X[104X
    [4X[28Xtrue[128X[104X
    [4X[25Xgap>[125X [27XIsString( [] );[127X[104X
    [4X[28Xtrue[128X[104X
    [4X[25Xgap>[125X [27XIsString( "123" );  IsString( 123 );[127X[104X
    [4X[28Xtrue[128X[104X
    [4X[28Xfalse[128X[104X
    [4X[25Xgap>[125X [27XIsString( [ '1', '2', '3' ] );[127X[104X
    [4X[28Xtrue[128X[104X
    [4X[25Xgap>[125X [27XIsString( [ '1', '2', , '4' ] );  # strings must be dense[127X[104X
    [4X[28Xfalse[128X[104X
    [4X[25Xgap>[125X [27XIsString( [ '1', '2', 3 ] );  # strings must only contain characters[127X[104X
    [4X[28Xfalse[128X[104X
  [4X[32X[104X
  
  
  [1X27.1-3 [33X[0;0YStrings As Lists[133X[101X
  
  [33X[0;0YNote  that  a string is just a special case of a list. So everything that is
  possible  for  lists  (see [14X21[114X)  is  also  possible for strings. Thus you can
  access  the  characters  in  such  a  string (see [14X21.3[114X), test for membership
  (see [14X30.6[114X),  ask  for  the  length,  concatenate  strings (see [2XConcatenation[102X
  ([14X21.20-1[114X)),  form  substrings  etc.  You can even assign to a mutable string
  (see [14X21.4[114X).  Of  course unless you assign a character in such a way that the
  list stays dense, the resulting list will no longer be a string.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XLength( s2 );[127X[104X
    [4X[28X12[128X[104X
    [4X[25Xgap>[125X [27Xs2[2];[127X[104X
    [4X[28X'e'[128X[104X
    [4X[25Xgap>[125X [27X'a' in s2;[127X[104X
    [4X[28Xfalse[128X[104X
    [4X[25Xgap>[125X [27Xs2[2] := 'a';;  s2;[127X[104X
    [4X[28X"Hallo world."[128X[104X
    [4X[25Xgap>[125X [27Xs1{ [1..4] };[127X[104X
    [4X[28X"Hell"[128X[104X
    [4X[25Xgap>[125X [27XConcatenation( s1{ [ 1 .. 6 ] }, s1{ [ 1 .. 4 ] } );[127X[104X
    [4X[28X"Hello Hell"[128X[104X
  [4X[32X[104X
  
  
  [1X27.1-4 [33X[0;0YPrinting Strings[133X[101X
  
  [29X[2XViewObj[102X( [3Xstr[103X ) [32X method
  [29X[2XPrintObj[102X( [3Xstr[103X ) [32X method
  
  [33X[0;0YIf  a  string  is  displayed  by  [2XView[102X  ([14X6.3-3[114X), for example as result of an
  evaluation  (see [14X6.1[114X),  or  by  [2XViewObj[102X  ([14X6.3-5[114X) and [2XPrintObj[102X ([14X6.3-5[114X), it is
  displayed  with enclosing doublequotes. (But note that there is an ambiguity
  for  the  empty string which is also an empty list of arbitrary [5XGAP[105X objects;
  it  is  only  printed  like  a  string  if  it  was input as empty string or
  converted  to  a  string  with  [2XConvertToStringRep[102X  ([14X27.3-2[114X).) The output of
  [2XPrintObj[102X can be read back into [5XGAP[105X.[133X
  
  [33X[0;0YStrings  behave  differently  from  other  [5XGAP[105X objects with respect to [2XPrint[102X
  ([14X6.3-4[114X),  [2XPrintTo[102X  ([14X9.7-3[114X),  or [2XAppendTo[102X ([14X9.7-3[114X). These commands [13Xinterpret[113X a
  string  in the sense that they essentially send the characters of the string
  directly to the output stream/file. (But depending on the type of the stream
  and  the  presence  of some special characters used as hints for line breaks
  there  may  be  sent  some  additional  newline  (or  backslash and newline)
  characters.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27Xs4:= "abc\"def\nghi";;[127X[104X
    [4X[25Xgap>[125X [27XView( s4 );  Print( "\n" );[127X[104X
    [4X[28X"abc\"def\nghi"[128X[104X
    [4X[25Xgap>[125X [27XViewObj( s4 );  Print( "\n" );[127X[104X
    [4X[28X"abc\"def\nghi"[128X[104X
    [4X[25Xgap>[125X [27XPrintObj( s4 );  Print( "\n" );[127X[104X
    [4X[28X"abc\"def\nghi"[128X[104X
    [4X[25Xgap>[125X [27XPrint( s4 );  Print( "\n" );[127X[104X
    [4X[28Xabc"def[128X[104X
    [4X[28Xghi[128X[104X
    [4X[25Xgap>[125X [27Xs := "German uses strange characters: äöüß\n";[127X[104X
    [4X[28X"German uses strange characters: äöüß\n"[128X[104X
    [4X[25Xgap>[125X [27XPrint(s);[127X[104X
    [4X[28XGerman uses strange characters: äöüß[128X[104X
    [4X[25Xgap>[125X [27XPrintObj(s);  Print( "\n" );[127X[104X
    [4X[28X"German uses strange characters: \303\244\303\266\303\274\303\237\n"[128X[104X
  [4X[32X[104X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27Xs := "\007";[127X[104X
    [4X[28X"\007"[128X[104X
    [4X[25Xgap>[125X [27XPrint(s); # rings bell in many terminals[127X[104X
  [4X[32X[104X
  
  [33X[0;0YNote  that  only  those  line  breaks  are printed by [2XPrint[102X ([14X6.3-4[114X) that are
  contained  in  the  string  ([10X\n[110X  characters,  see [14X27.2[114X),  as is shown in the
  example below.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27Xs1;[127X[104X
    [4X[28X"Hello world."[128X[104X
    [4X[25Xgap>[125X [27XPrint( s1 );[127X[104X
    [4X[28XHello world.gap> Print( s1, "\n" );[128X[104X
    [4X[28XHello world.[128X[104X
    [4X[25Xgap>[125X [27XPrint( s1, "\nnext line\n" );[127X[104X
    [4X[28XHello world.[128X[104X
    [4X[28Xnext line[128X[104X
  [4X[32X[104X
  
  
  [1X27.2 [33X[0;0YSpecial Characters[133X[101X
  
  [33X[0;0YThere  are  a number of [13Xspecial character sequences[113X that can be used between
  the  singlequotes  of  a  character literal or between the doublequotes of a
  string  literal  to  specify characters. They consist of two characters. The
  first  is  a backslash [10X\[110X. The second may be any character. If it is an octal
  digit (from [10X0[110X to [10X7[110X) there must be two more such digits. The meaning is given
  in the following list[133X
  
  [8X[10X\n[110X[108X
        [33X[0;6Y[13Xnewline  character[113X.  This  is  the  character  that,  at least on UNIX
        systems, separates lines in a text file. Printing of this character in
        a string has the effect of moving the cursor down one line and back to
        the beginning of the line.[133X
  
  [8X
  
  
  [10X\"[110X[108X
        [33X[0;6Y[13Xdoublequote  character[113X.  Inside a string a doublequote must be escaped
        by  the  backslash,  because it is otherwise interpreted as end of the
        string.[133X
  
  [8X
  
  
  [10X\'[110X[108X
        [33X[0;6Y[13Xsinglequote  character[113X.  Inside a character a singlequote must escaped
        by  the  backslash,  because it is otherwise interpreted as end of the
        character.[133X
  
  [8X
  
  
  [10X\\[110X[108X
        [33X[0;6Y[13Xbackslash  character[113X.  Inside  a string a backslash must be escaped by
        another  backslash,  because  it  is  otherwise  interpreted  as first
        character of an escape sequence.[133X
  
  [8X
  
  
  [10X\b[110X[108X
        [33X[0;6Y[13Xbackspace character[113X. Printing this character should have the effect of
        moving  the  cursor  back  one  character.  Whether it works or not is
        system dependent and should not be relied upon.[133X
  
  [8X
  
  
  [10X\r[110X[108X
        [33X[0;6Y[13Xcarriage  return  character[113X.  Printing  this character should have the
        effect  of  moving  the cursor back to the beginning of the same line.
        Whether this works or not is again system dependent.[133X
  
  [8X
  
  
  [10X\c[110X[108X
        [33X[0;6Y[13Xflush  character[113X.  This  character  is  not printed. Its purpose is to
        flush  the  output  queue.  Usually  [5XGAP[105X waits until it sees a [10Xnewline[110X
        before  it  prints a string. If you want to display a string that does
        not include this character use [10X\c[110X.[133X
  
  [8X
  
  
  [10X\XYZ[110X[108X
        [33X[0;6Ywith  [10XX[110X,  [10XY[110X, [10XZ[110X three octal digits. This is translated to the character
        corresponding to the number [10XX * 64 + Y * 8 + Z modulo 256[110X. This can be
        used to specify and store arbitrary binary data as a string in [5XGAP[105X.[133X
  
  [8X
  
  other[108X
        [33X[0;6YFor any other character the backslash is simply ignored.[133X
  
  [33X[0;0YAgain,  if  the  line  is displayed as result of an evaluation, those escape
  sequences are displayed in the same way that they are input.[133X
  
  [33X[0;0YOnly [2XPrint[102X ([14X6.3-4[114X), [2XPrintTo[102X ([14X9.7-3[114X), or [2XAppendTo[102X ([14X9.7-3[114X) send the characters
  directly to the output stream.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27X"This is one line.\nThis is another line.\n";[127X[104X
    [4X[28X"This is one line.\nThis is another line.\n"[128X[104X
    [4X[25Xgap>[125X [27XPrint( last );[127X[104X
    [4X[28XThis is one line.[128X[104X
    [4X[28XThis is another line.[128X[104X
  [4X[32X[104X
  
  [33X[0;0YNote  in  particular  that it is not allowed to enclose a [3Xnewline[103X inside the
  string.  You can use the special character sequence [10X\n[110X to write strings that
  include  [3Xnewline[103X characters. If, however, an input string is too long to fit
  on  a  single line it is possible to [13Xcontinue[113X it over several lines. In this
  case  the  last character of each input line, except the last line must be a
  backslash.  Both  backslash and [3Xnewline[103X are thrown away by [5XGAP[105X while reading
  the  string.  Note  that  the  same  continuation mechanism is available for
  identifiers and integers, see [14X6.2[114X.[133X
  
  
  [1X27.3 [33X[0;0YInternally Represented Strings[133X[101X
  
  [1X27.3-1 IsStringRep[101X
  
  [29X[2XIsStringRep[102X( [3Xobj[103X ) [32X Representation
  
  [33X[0;0Y[2XIsStringRep[102X  is  a  special  (internal)  representation  of  dense  lists of
  characters.   Dense   lists   of  characters  can  be  converted  into  this
  representation using [2XConvertToStringRep[102X ([14X27.3-2[114X). Note that calling [2XIsString[102X
  ([14X27.1-2[114X) does [13Xnot[113X change the representation.[133X
  
  [1X27.3-2 ConvertToStringRep[101X
  
  [29X[2XConvertToStringRep[102X( [3Xobj[103X ) [32X function
  
  [33X[0;0YIf   [3Xobj[103X   is  a  dense  internally  represented  list  of  characters  then
  [2XConvertToStringRep[102X  changes the representation to [2XIsStringRep[102X ([14X27.3-1[114X). This
  is  useful  in particular for converting the empty list [10X[][110X, which usually is
  in  [10XIsPlistRep[110X,  to  [2XIsStringRep[102X  ([14X27.3-1[114X).  If  [3Xobj[103X  is  not  a string then
  [2XConvertToStringRep[102X signals an error.[133X
  
  [1X27.3-3 CopyToStringRep[101X
  
  [29X[2XCopyToStringRep[102X( [3Xobj[103X ) [32X function
  
  [33X[0;0YIf   [3Xobj[103X   is  a  dense  internally  represented  list  of  characters  then
  [2XCopyToStringRep[102X  copies  [3Xobj[103X to a new object with representation [2XIsStringRep[102X
  ([14X27.3-1[114X). If [3Xobj[103X is not a string then [2XCopyToStringRep[102X signals an error.[133X
  
  [1X27.3-4 IsEmptyString[101X
  
  [29X[2XIsEmptyString[102X( [3Xstr[103X ) [32X function
  
  [33X[0;0Y[2XIsEmptyString[102X  returns [9Xtrue[109X if [3Xstr[103X is the empty string in the representation
  [2XIsStringRep[102X  ([14X27.3-1[114X),  and [9Xfalse[109X otherwise. Note that the empty list [10X[][110X and
  the  empty  string [10X""[110X have the same type, the recommended way to distinguish
  them  is  via  [2XIsEmptyString[102X.  For  formatted  printing, this distinction is
  sometimes necessary.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27Xl:= [];;  IsString( l );  IsEmptyString( l );  IsEmpty( l );[127X[104X
    [4X[28Xtrue[128X[104X
    [4X[28Xfalse[128X[104X
    [4X[28Xtrue[128X[104X
    [4X[25Xgap>[125X [27Xl;  ConvertToStringRep( l );  l;[127X[104X
    [4X[28X[  ][128X[104X
    [4X[28X""[128X[104X
    [4X[25Xgap>[125X [27XIsEmptyString( l );  IsEmptyString( "" );  IsEmptyString( "abc" );[127X[104X
    [4X[28Xtrue[128X[104X
    [4X[28Xtrue[128X[104X
    [4X[28Xfalse[128X[104X
    [4X[25Xgap>[125X [27Xll:= [ 'a', 'b' ];  IsStringRep( ll );  ConvertToStringRep( ll );[127X[104X
    [4X[28X"ab"[128X[104X
    [4X[28Xfalse[128X[104X
    [4X[25Xgap>[125X [27Xll;  IsStringRep( ll );[127X[104X
    [4X[28X"ab"[128X[104X
    [4X[28Xtrue[128X[104X
  [4X[32X[104X
  
  [1X27.3-5 EmptyString[101X
  
  [29X[2XEmptyString[102X( [3Xlen[103X ) [32X function
  [6XReturns:[106X  [33X[0;10Ya string[133X
  
  [29X[2XShrinkAllocationString[102X( [3Xstr[103X ) [32X function
  [6XReturns:[106X  [33X[0;10Ynothing[133X
  
  [33X[0;0YThe  function [2XEmptyString[102X returns an empty string in internal representation
  which has enough memory allocated for [3Xlen[103X characters. This can be useful for
  creating and filling a string with a known number of entries.[133X
  
  [33X[0;0YThe  function  [2XShrinkAllocationString[102X  gives back to [5XGAP[105Xs memory manager the
  physical   memory  which  is  allocated  for  the  string  [3Xstr[103X  in  internal
  representation but not needed by its current number of characters.[133X
  
  [33X[0;0YThese  functions  are  intended  for  saving  some of [5XGAP[105Xs memory in certain
  situations,  see  the  explanations  and  the  example  for  the  analogeous
  functions  [2XEmptyPlist[102X  ([14X21.9-1[114X) and [2XShrinkAllocationPlist[102X ([14X21.9-1[114X) for plain
  lists.[133X
  
  [1X27.3-6 CharsFamily[101X
  
  [29X[2XCharsFamily[102X[32X global variable
  
  [33X[0;0YEach  character lies in the family [2XCharsFamily[102X, each nonempty string lies in
  the  collections  family of this family. Note the subtle differences between
  the empty list [10X[][110X and the empty string [10X""[110X when both are printed.[133X
  
  
  [1X27.4 [33X[0;0YRecognizing Characters[133X[101X
  
  [1X27.4-1 IsDigitChar[101X
  
  [29X[2XIsDigitChar[102X( [3Xc[103X ) [32X function
  
  [33X[0;0Ychecks  whether  the  character  [3Xc[103X  is  a  digit, i.e., occurs in the string
  [10X"0123456789"[110X.[133X
  
  [1X27.4-2 IsLowerAlphaChar[101X
  
  [29X[2XIsLowerAlphaChar[102X( [3Xc[103X ) [32X function
  
  [33X[0;0Ychecks  whether the character [3Xc[103X is a lowercase alphabet letter, i.e., occurs
  in the string [10X"abcdefghijklmnopqrstuvwxyz"[110X.[133X
  
  [1X27.4-3 IsUpperAlphaChar[101X
  
  [29X[2XIsUpperAlphaChar[102X( [3Xc[103X ) [32X function
  
  [33X[0;0Ychecks whether the character [3Xc[103X is an uppercase alphabet letter, i.e., occurs
  in the string [10X"ABCDEFGHIJKLMNOPQRSTUVWXYZ"[110X.[133X
  
  [1X27.4-4 IsAlphaChar[101X
  
  [29X[2XIsAlphaChar[102X( [3Xc[103X ) [32X function
  
  [33X[0;0Ychecks  whether  the  character  [3Xc[103X  is  either  a  lowercase or an uppercase
  alphabet letter.[133X
  
  
  [1X27.5 [33X[0;0YComparisons of Strings[133X[101X
  
  [1X27.5-1 \=[101X
  
  [29X[2X\=[102X( [3Xstring1[103X, [3Xstring2[103X ) [32X method
  
  [33X[0;0YThe  equality operator [10X=[110X returns [9Xtrue[109X if the two strings [3Xstring1[103X and [3Xstring2[103X
  are  equal  and  [9Xfalse[109X otherwise. The inequality operator [10X<>[110X returns [9Xtrue[109X if
  the two strings [3Xstring1[103X and [3Xstring2[103X are not equal and [9Xfalse[109X otherwise.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27X"Hello world.\n" = "Hello world.\n";[127X[104X
    [4X[28Xtrue[128X[104X
    [4X[25Xgap>[125X [27X"Hello World.\n" = "Hello world.\n"; # comparison is case sensitive[127X[104X
    [4X[28Xfalse[128X[104X
    [4X[25Xgap>[125X [27X"Hello world." = "Hello world.\n";  # first string has no <newline>[127X[104X
    [4X[28Xfalse[128X[104X
    [4X[25Xgap>[125X [27X"Goodbye world.\n" = "Hello world.\n";[127X[104X
    [4X[28Xfalse[128X[104X
    [4X[25Xgap>[125X [27X[ 'a', 'b' ] = "ab";[127X[104X
    [4X[28Xtrue[128X[104X
  [4X[32X[104X
  
  [1X27.5-2 \<[101X
  
  [29X[2X\<[102X( [3Xstring1[103X, [3Xstring2[103X ) [32X method
  
  [33X[0;0YThe  ordering of strings is lexicographically according to the order implied
  by the underlying, system dependent, character set.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27X"Hello world.\n" < "Hello world.\n";  # the strings are equal[127X[104X
    [4X[28Xfalse[128X[104X
    [4X[25Xgap>[125X [27X# in ASCII capitals range before small letters:[127X[104X
    [4X[25Xgap>[125X [27X"Hello World." < "Hello world.";[127X[104X
    [4X[28Xtrue[128X[104X
    [4X[25Xgap>[125X [27X"Hello world." < "Hello world.\n";  # prefixes are always smaller[127X[104X
    [4X[28Xtrue[128X[104X
    [4X[25Xgap>[125X [27X# G comes before H, in ASCII at least:[127X[104X
    [4X[25Xgap>[125X [27X"Goodbye world.\n" < "Hello world.\n";[127X[104X
    [4X[28Xtrue[128X[104X
  [4X[32X[104X
  
  [33X[0;0YStrings can be compared via [10X<[110X with certain [5XGAP[105X objects that are not strings,
  see [14X4.12[114X for the details.[133X
  
  
  [1X27.6 [33X[0;0YOperations to Produce or Manipulate Strings[133X[101X
  
  [33X[0;0YFor the possibility to print [5XGAP[105X objects to strings, see [14X10.7[114X.[133X
  
  [1X27.6-1 DisplayString[101X
  
  [29X[2XDisplayString[102X( [3Xobj[103X ) [32X operation
  
  [33X[0;0YReturns  a  string  which could be used to display the object [3Xobj[103X in a nice,
  formatted  way which is easy to read (but might be difficult for machines to
  understand).  The  actual  format  used for this depends on the type of [3Xobj[103X.
  Each  method should include a newline character as last character. Note that
  no  method  for  [2XDisplayString[102X may delegate to any of the operations [2XDisplay[102X
  ([14X6.3-6[114X), [2XViewObj[102X ([14X6.3-5[114X) or [2XPrintObj[102X ([14X6.3-5[114X) to avoid circular delegations.[133X
  
  [1X27.6-2 DEFAULTDISPLAYSTRING[101X
  
  [29X[2XDEFAULTDISPLAYSTRING[102X[32X global variable
  
  [33X[0;0YThis is the default value for [2XDisplayString[102X ([14X27.6-1[114X).[133X
  
  [1X27.6-3 ViewString[101X
  
  [29X[2XViewString[102X( [3Xobj[103X ) [32X operation
  
  [33X[0;0Y[2XViewString[102X  returns a string which would be displayed by [2XViewObj[102X ([14X6.3-5[114X) for
  an  object.  Note  that  no method for [2XViewString[102X may delegate to any of the
  operations  [2XDisplay[102X  ([14X6.3-6[114X),  [2XViewObj[102X  ([14X6.3-5[114X),  [2XDisplayString[102X  ([14X27.6-1[114X) or
  [2XPrintObj[102X ([14X6.3-5[114X) to avoid circular delegations.[133X
  
  [1X27.6-4 DEFAULTVIEWSTRING[101X
  
  [29X[2XDEFAULTVIEWSTRING[102X[32X global variable
  
  [33X[0;0YThis is the default value for [2XViewString[102X ([14X27.6-3[114X).[133X
  
  [1X27.6-5 PrintString[101X
  
  [29X[2XPrintString[102X( [3Xobj[103X[, [3Xlength[103X] ) [32X operation
  
  [33X[0;0Y[2XPrintString[102X  returns  a  representation  of  [3Xobj[103X,  which may be an object of
  arbitrary  type,  as  a string. This string should approximate as closely as
  possible  the  character  sequence  you  see if you print [3Xobj[103X using [2XPrintObj[102X
  ([14X6.3-5[114X).[133X
  
  [33X[0;0YIf  [3Xlength[103X  is  given  it  must  be an integer. The absolute value gives the
  minimal length of the result. If the string representation of [3Xobj[103X takes less
  than that many characters it is filled with blanks. If [3Xlength[103X is positive it
  is filled on the left, if [3Xlength[103X is negative it is filled on the right.[133X
  
  [33X[0;0YIn  the  two  argument case, the string returned is a new mutable string (in
  particular  not  a part of any other object); it can be modified safely, and
  [2XMakeImmutable[102X ([14X12.6-4[114X) may be safely applied to it.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XPrintString(123);PrintString([1,2,3]);[127X[104X
    [4X[28X"123"[128X[104X
    [4X[28X"[ 1, 2, 3 ]"[128X[104X
  [4X[32X[104X
  
  [33X[0;0Y[2XPrintString[102X is entitled to put in additional control characters [10X\<[110X (ASCII 1)
  and [10X\>[110X (ASCII 2) that allow proper line breaks. See [2XStripLineBreakCharacters[102X
  ([14X27.6-7[114X) for a function to get rid of these control characters.[133X
  
  [1X27.6-6 String[101X
  
  [29X[2XString[102X( [3Xobj[103X[, [3Xlength[103X] ) [32X attribute
  
  [33X[0;0Y[2XString[102X  returns a representation of [3Xobj[103X, which may be an object of arbitrary
  type, as a string. This string should approximate as closely as possible the
  character sequence you see if you print [3Xobj[103X.[133X
  
  [33X[0;0YIf  [3Xlength[103X  is  given  it  must  be an integer. The absolute value gives the
  minimal length of the result. If the string representation of [3Xobj[103X takes less
  than that many characters it is filled with blanks. If [3Xlength[103X is positive it
  is filled on the left, if [3Xlength[103X is negative it is filled on the right.[133X
  
  [33X[0;0YIn  the  two  argument case, the string returned is a new mutable string (in
  particular  not  a part of any other object); it can be modified safely, and
  [2XMakeImmutable[102X ([14X12.6-4[114X) may be safely applied to it.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XString(123);String([1,2,3]);[127X[104X
    [4X[28X"123"[128X[104X
    [4X[28X"[ 1, 2, 3 ]"[128X[104X
  [4X[32X[104X
  
  [33X[0;0Y[2XString[102X  must  not  put  in additional control characters [10X\<[110X (ASCII 1) and [10X\>[110X
  (ASCII 2) that allow proper line breaks.[133X
  
  [1X27.6-7 StripLineBreakCharacters[101X
  
  [29X[2XStripLineBreakCharacters[102X( [3Xst[103X ) [32X function
  
  [33X[0;0YThis  function  takes  a  string  [3Xst[103X  as an argument and removes all control
  characters  [10X\<[110X  (ASCII  1)  and  [10X\>[110X  (ASCII 2) which are used by [2XPrintString[102X
  ([14X27.6-5[114X)  and  [2XPrintObj[102X ([14X6.3-5[114X) to ensure proper line breaking. A new string
  with these characters removed is returned.[133X
  
  [1X27.6-8 HexStringInt[101X
  
  [29X[2XHexStringInt[102X( [3Xint[103X ) [32X function
  
  [33X[0;0Yreturns  a  string which represents the integer [3Xint[103X with hexa-decimal digits
  (using  [10XA[110X  to [10XF[110X as digits [10X10[110X to [10X15[110X). The inverse translation can be achieved
  with [2XIntHexString[102X ([14X27.8-1[114X).[133X
  
  [1X27.6-9 StringPP[101X
  
  [29X[2XStringPP[102X( [3Xint[103X ) [32X function
  
  [33X[0;0Yreturns  a string representing the prime factor decomposition of the integer
  [3Xint[103X.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XStringPP(40320);[127X[104X
    [4X[28X"2^7*3^2*5*7"[128X[104X
  [4X[32X[104X
  
  [1X27.6-10 WordAlp[101X
  
  [29X[2XWordAlp[102X( [3Xalpha[103X, [3Xnr[103X ) [32X function
  
  [33X[0;0Yreturns a string that is the [3Xnr[103X-th word over the alphabet list [3Xalpha[103X, w.r.t.
  word  length  and lexicographical order. The empty word is [10XWordAlp( [3Xalpha[103X[10X, 0
  )[110X.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XList([0..5],i->WordAlp("abc",i));[127X[104X
    [4X[28X[ "", "a", "b", "c", "aa", "ab" ][128X[104X
  [4X[32X[104X
  
  [1X27.6-11 LowercaseString[101X
  
  [29X[2XLowercaseString[102X( [3Xstring[103X ) [32X function
  
  [33X[0;0Yreturns a lowercase version of the string [3Xstring[103X, that is, a string in which
  each uppercase alphabet character is replaced by the corresponding lowercase
  character.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XLowercaseString("This Is UpperCase");[127X[104X
    [4X[28X"this is uppercase"[128X[104X
  [4X[32X[104X
  
  [1X27.6-12 SplitString[101X
  
  [29X[2XSplitString[102X( [3Xstring[103X, [3Xseps[103X[, [3Xwspace[103X] ) [32X operation
  
  [33X[0;0YThis function accepts a string [3Xstring[103X and lists [3Xseps[103X and, optionally, [3Xwspace[103X
  of  characters.  Now [3Xstring[103X is split into substrings at each occurrence of a
  character  in  [3Xseps[103X  or  [3Xwspace[103X. The characters in [3Xwspace[103X are interpreted as
  white  space  characters.  Substrings of characters in [3Xwspace[103X are treated as
  one white space character and they are ignored at the beginning and end of a
  string.[133X
  
  [33X[0;0YBoth arguments [3Xseps[103X and [3Xwspace[103X can be single characters.[133X
  
  [33X[0;0YEach  string  in  the  resulting  list  of  substring  does  not contain any
  characters in [3Xseps[103X or [3Xwspace[103X.[133X
  
  [33X[0;0YA  character that occurs both in [3Xseps[103X and [3Xwspace[103X is treated as a white space
  character.[133X
  
  [33X[0;0YA  separator  at the end of a string is interpreted as a terminator; in this
  case, the separator does not produce a trailing empty string. Also see [2XChomp[102X
  ([14X27.6-18[114X).[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XSplitString( "substr1:substr2::substr4", ":" );[127X[104X
    [4X[28X[ "substr1", "substr2", "", "substr4" ][128X[104X
    [4X[25Xgap>[125X [27XSplitString( "a;b;c;d;", ";" );[127X[104X
    [4X[28X[ "a", "b", "c", "d" ][128X[104X
    [4X[25Xgap>[125X [27XSplitString( "/home//user//dir/", "", "/" );[127X[104X
    [4X[28X[ "home", "user", "dir" ][128X[104X
  [4X[32X[104X
  
  [1X27.6-13 ReplacedString[101X
  
  [29X[2XReplacedString[102X( [3Xstring[103X, [3Xold[103X, [3Xnew[103X ) [32X function
  
  [33X[0;0Yreplaces  occurrences  of the string [3Xold[103X in [3Xstring[103X by [3Xnew[103X, starting from the
  left and always replacing the first occurrence. To avoid infinite recursion,
  characters  which  have  been  replaced  already, are not subject to renewed
  replacement.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XReplacedString("abacab","a","zl");[127X[104X
    [4X[28X"zlbzlczlb"[128X[104X
    [4X[25Xgap>[125X [27XReplacedString("ababa", "aba","c");[127X[104X
    [4X[28X"cba"[128X[104X
    [4X[25Xgap>[125X [27XReplacedString("abacab","a","ba");[127X[104X
    [4X[28X"babbacbab"[128X[104X
  [4X[32X[104X
  
  [1X27.6-14 NormalizeWhitespace[101X
  
  [29X[2XNormalizeWhitespace[102X( [3Xstring[103X ) [32X function
  
  [33X[0;0YThis  function changes the string [3Xstring[103X in place. The characters [10X [110X (space),
  [10X\n[110X,  [10X\r[110X  and  [10X\t[110X  are  considered as [13Xwhite space[113X. Leading and trailing white
  space  characters in [3Xstring[103X are removed. Sequences of white space characters
  between other characters are replaced by a single space character.[133X
  
  [33X[0;0YSee [2XNormalizedWhitespace[102X ([14X27.6-15[114X) for a non-destructive version.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27Xs := "   x y \n\n\t\r  z\n   \n";[127X[104X
    [4X[28X"   x y \n\n\t\r  z\n   \n"[128X[104X
    [4X[25Xgap>[125X [27XNormalizeWhitespace(s);[127X[104X
    [4X[25Xgap>[125X [27Xs;[127X[104X
    [4X[28X"x y z"[128X[104X
  [4X[32X[104X
  
  [1X27.6-15 NormalizedWhitespace[101X
  
  [29X[2XNormalizedWhitespace[102X( [3Xstr[103X ) [32X function
  
  [33X[0;0YThis  function  returns  a  copy  of string [3Xstr[103X to which [2XNormalizeWhitespace[102X
  ([14X27.6-14[114X) was applied.[133X
  
  [1X27.6-16 RemoveCharacters[101X
  
  [29X[2XRemoveCharacters[102X( [3Xstring[103X, [3Xchars[103X ) [32X function
  
  [33X[0;0YBoth  arguments  must  be  strings.  This  function  efficiently removes all
  characters given in [3Xchars[103X from [3Xstring[103X.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27Xs := "ab c\ndef\n\ng    h i .\n";[127X[104X
    [4X[28X"ab c\ndef\n\ng    h i .\n"[128X[104X
    [4X[25Xgap>[125X [27XRemoveCharacters(s, " \n\t\r"); # remove all whitespace characters[127X[104X
    [4X[25Xgap>[125X [27Xs;[127X[104X
    [4X[28X"abcdefghi."[128X[104X
  [4X[32X[104X
  
  [1X27.6-17 JoinStringsWithSeparator[101X
  
  [29X[2XJoinStringsWithSeparator[102X( [3Xlist[103X[, [3Xsep[103X] ) [32X function
  
  [33X[0;0Yjoins [3Xlist[103X (a list of strings) after interpolating [3Xsep[103X (or [10X","[110X if the second
  argument  is omitted) between each adjacent pair of strings; [3Xsep[103X should be a
  string.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27Xlist := List([1..10], String);[127X[104X
    [4X[28X[ "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" ][128X[104X
    [4X[25Xgap>[125X [27XJoinStringsWithSeparator(list);[127X[104X
    [4X[28X"1,2,3,4,5,6,7,8,9,10"[128X[104X
    [4X[25Xgap>[125X [27XJoinStringsWithSeparator(["The", "quick", "brown", "fox"], " ");[127X[104X
    [4X[28X"The quick brown fox"[128X[104X
    [4X[25Xgap>[125X [27Xnew:= JoinStringsWithSeparator(["a", "b", "c", "d"], ",\n    ");[127X[104X
    [4X[28X"a,\n    b,\n    c,\n    d"[128X[104X
    [4X[25Xgap>[125X [27XPrint("    ", new, "\n");[127X[104X
    [4X[28X    a,[128X[104X
    [4X[28X    b,[128X[104X
    [4X[28X    c,[128X[104X
    [4X[28X    d[128X[104X
  [4X[32X[104X
  
  [1X27.6-18 Chomp[101X
  
  [29X[2XChomp[102X( [3Xstr[103X ) [32X function
  
  [33X[0;0YLike  the  similarly  named  Perl function, [2XChomp[102X removes a trailing newline
  character  (or carriage-return line-feed couplet) from a string argument [3Xstr[103X
  if  present  and returns the result. If [3Xstr[103X is not a string or does not have
  such  trailing  character(s)  it is returned unchanged. This latter property
  means  that  [2XChomp[102X  is  safe  to  use in cases where one is manipulating the
  result of another function which might sometimes return [9Xfail[109X.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XChomp("The quick brown fox jumps over the lazy dog.\n");[127X[104X
    [4X[28X"The quick brown fox jumps over the lazy dog."[128X[104X
    [4X[25Xgap>[125X [27XChomp("The quick brown fox jumps over the lazy dog.\r\n");[127X[104X
    [4X[28X"The quick brown fox jumps over the lazy dog."[128X[104X
    [4X[25Xgap>[125X [27XChomp("The quick brown fox jumps over the lazy dog.");[127X[104X
    [4X[28X"The quick brown fox jumps over the lazy dog."[128X[104X
    [4X[25Xgap>[125X [27XChomp(fail);[127X[104X
    [4X[28Xfail[128X[104X
    [4X[25Xgap>[125X [27XChomp(32);[127X[104X
    [4X[28X32[128X[104X
  [4X[32X[104X
  
  [33X[0;0Y[13XNote:[113X  [2XChomp[102X  only  removes  a  trailing newline character from [3Xstr[103X. If your
  string  contains several newline characters and you really want to split [3Xstr[103X
  into  lines  at the newline characters (and remove those newline characters)
  then you should use [2XSplitString[102X ([14X27.6-12[114X), e.g.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27Xstr := "The quick brown fox\njumps over the lazy dog.\n";[127X[104X
    [4X[28X"The quick brown fox\njumps over the lazy dog.\n"[128X[104X
    [4X[25Xgap>[125X [27XSplitString(str, "", "\n");[127X[104X
    [4X[28X[ "The quick brown fox", "jumps over the lazy dog." ][128X[104X
    [4X[25Xgap>[125X [27XChomp(str);[127X[104X
    [4X[28X"The quick brown fox\njumps over the lazy dog."[128X[104X
  [4X[32X[104X
  
  [33X[0;0YThe  following  two  functions convert basic strings to lists of numbers and
  vice versa. They are useful for examples of text encryption.[133X
  
  [1X27.6-19 NumbersString[101X
  
  [29X[2XNumbersString[102X( [3Xs[103X, [3Xm[103X[, [3Xtable[103X] ) [32X function
  
  [33X[0;0Y[2XNumbersString[102X  takes a string message [3Xs[103X and returns a list of integers, each
  not  exceeding  the integer [3Xm[103X that encode the message using the scheme [22XA=11[122X,
  [22XB=12[122X  and  so  on  (and  converting  lower case to upper case). If a list of
  characters is given in [3Xtable[103X, it is used instead for encoding).[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27Xl:=NumbersString("Twas brillig and the slithy toves",1000000);[127X[104X
    [4X[28X[ 303311, 291012, 281922, 221917, 101124, 141030, 181510, 292219, [128X[104X
    [4X[28X  301835, 103025, 321529 ][128X[104X
  [4X[32X[104X
  
  [1X27.6-20 StringNumbers[101X
  
  [29X[2XStringNumbers[102X( [3Xl[103X, [3Xm[103X[, [3Xtable[103X] ) [32X function
  
  [33X[0;0Y[2XStringNumbers[102X   takes   a   list  [3Xl[103X  of  integers  that  was  encoded  using
  [2XNumbersString[102X  ([14X27.6-19[114X)  and  the  size  integer  [3Xm[103X,  and returns a message
  string,  using  the  scheme [22XA=11[122X, [22XB=12[122X and so on. If a list of characters is
  given in [3Xtable[103X, it is used instead for decoding).[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XStringNumbers(l,1000000);[127X[104X
    [4X[28X"TWAS BRILLIG AND THE SLITHY TOVES"[128X[104X
  [4X[32X[104X
  
  
  [1X27.7 [33X[0;0YCharacter Conversion[133X[101X
  
  [33X[0;0YThe  following functions convert characters in their internal integer values
  and vice versa. Note that the number corresponding to a particular character
  might  depend  on  the  system  used. While most systems use an extension of
  ASCII,  in particular character values outside the range [10X[ 32 .. 126 ][110X might
  differ between architectures.[133X
  
  [1X27.7-1 IntChar[101X
  
  [29X[2XIntChar[102X( [3Xchar[103X ) [32X function
  
  [33X[0;0Yreturns an integer value in the range [10X[ 0 .. 255 ][110X that corresponds to [3Xchar[103X.[133X
  
  [1X27.7-2 CharInt[101X
  
  [29X[2XCharInt[102X( [3Xint[103X ) [32X function
  
  [33X[0;0Yreturns a character that corresponds to the integer value [3Xint[103X, which must be
  in the range [10X[ 0 .. 255 ][110X.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27Xc:=CharInt(65);[127X[104X
    [4X[28X'A'[128X[104X
    [4X[25Xgap>[125X [27XIntChar(c);[127X[104X
    [4X[28X65[128X[104X
  [4X[32X[104X
  
  [1X27.7-3 SIntChar[101X
  
  [29X[2XSIntChar[102X( [3Xchar[103X ) [32X function
  
  [33X[0;0Yreturns a signed integer value in the range [10X[ -128 .. 127 ][110X that corresponds
  to [3Xchar[103X.[133X
  
  [1X27.7-4 CharSInt[101X
  
  [29X[2XCharSInt[102X( [3Xint[103X ) [32X function
  
  [33X[0;0Yreturns a character which corresponds to the signed integer value [3Xint[103X, which
  must be in the range [10X[ -128 .. 127 ][110X.[133X
  
  [33X[0;0YThe  signed and unsigned integer functions behave the same for values in the
  range [10X[ 0 .. 127 ][110X.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XSIntChar(c);[127X[104X
    [4X[28X65[128X[104X
    [4X[25Xgap>[125X [27Xc:=CharSInt(-20);;[127X[104X
    [4X[25Xgap>[125X [27XSIntChar(c);[127X[104X
    [4X[28X-20[128X[104X
    [4X[25Xgap>[125X [27XIntChar(c);[127X[104X
    [4X[28X236[128X[104X
    [4X[25Xgap>[125X [27XSIntChar(CharInt(255));[127X[104X
    [4X[28X-1[128X[104X
  [4X[32X[104X
  
  
  [1X27.8 [33X[0;0YOperations to Evaluate Strings[133X[101X
  
  [1X27.8-1 Int[101X
  
  [29X[2XInt[102X( [3Xstr[103X ) [32X attribute
  [29X[2XRat[102X( [3Xstr[103X ) [32X attribute
  [29X[2XIntHexString[102X( [3Xstr[103X ) [32X function
  
  [33X[0;0Yreturn  either  an  integer  ([2XInt[102X  and [2XIntHexString[102X), or a rational ([2XRat[102X) as
  represented  by  the  string  [3Xstr[103X.  [2XInt[102X returns [9Xfail[109X if non-digit characters
  occur in [3Xstr[103X. For [2XRat[102X, the argument string may start with the sign character
  [10X-[110X,  followed  by  either  a sequence of digits or by two sequences of digits
  that  are separated by one of the characters [10X/[110X or [10X.[110X, where the latter stands
  for  a  decimal  dot.  (The methods only evaluate numbers but do [13Xnot[113X perform
  arithmetic!)[133X
  
  [33X[0;0Y[2XIntHexString[102X evaluates an integer written with hexa-decimal digits. Here the
  letters [10Xa[110X-[10Xf[110X or [10XA[110X-[10XF[110X are used as [13Xdigits[113X [22X10[122X to [22X15[122X. An error occurs when a wrong
  character  is  found in the string. This function can be used (together with
  [2XHexStringInt[102X  ([14X27.6-8[114X))  for  efficiently storing and reading large integers
  from  respectively  into [5XGAP[105X. Note that the translation between integers and
  their  hexa-decimal representation costs linear computation time in terms of
  the number of digits, while translation from and into decimal representation
  needs   substantial   computations.   If   [3Xstr[103X  is  not  in  compact  string
  representation  then  [2XConvertToStringRep[102X  ([14X27.3-2[114X)  is applied to it as side
  effect.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XInt("12345")+1;[127X[104X
    [4X[28X12346[128X[104X
    [4X[25Xgap>[125X [27XInt("123/45");[127X[104X
    [4X[28Xfail[128X[104X
    [4X[25Xgap>[125X [27XInt("1+2");[127X[104X
    [4X[28Xfail[128X[104X
    [4X[25Xgap>[125X [27XInt("-12");[127X[104X
    [4X[28X-12[128X[104X
    [4X[25Xgap>[125X [27XRat("123/45");[127X[104X
    [4X[28X41/15[128X[104X
    [4X[25Xgap>[125X [27XRat( "123.45" );[127X[104X
    [4X[28X2469/20[128X[104X
    [4X[25Xgap>[125X [27XIntHexString("-abcdef0123456789");[127X[104X
    [4X[28X-12379813738877118345[128X[104X
    [4X[25Xgap>[125X [27XHexStringInt(last);[127X[104X
    [4X[28X"-ABCDEF0123456789"[128X[104X
  [4X[32X[104X
  
  [1X27.8-2 Ordinal[101X
  
  [29X[2XOrdinal[102X( [3Xn[103X ) [32X function
  
  [33X[0;0Yreturns the ordinal of the integer [3Xn[103X as a string.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XOrdinal(2);  Ordinal(21);  Ordinal(33);  Ordinal(-33);[127X[104X
    [4X[28X"2nd"[128X[104X
    [4X[28X"21st"[128X[104X
    [4X[28X"33rd"[128X[104X
    [4X[28X"-33rd"[128X[104X
  [4X[32X[104X
  
  [1X27.8-3 EvalString[101X
  
  [29X[2XEvalString[102X( [3Xexpr[103X ) [32X function
  
  [33X[0;0Ypasses  the  string [3Xexpr[103X through an input text stream so that [5XGAP[105X interprets
  it, and returns the result.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27Xa:=10;[127X[104X
    [4X[28X10[128X[104X
    [4X[25Xgap>[125X [27XEvalString("a^2");[127X[104X
    [4X[28X100[128X[104X
  [4X[32X[104X
  
  [33X[0;0Y[2XEvalString[102X is intended for [13Xsingle[113X expressions. A sequence of commands may be
  interpreted   by   using   the   functions   [2XInputTextString[102X   ([14X10.7-1[114X)  and
  [2XReadAsFunction[102X ([14X10.3-2[114X) together; see [14X10.3[114X for an example.[133X
  
  [33X[0;0YIf  [2XEvalString[102X  is  used  inside  a function, then it doesn't know about the
  local  variables and the arguments of the function. A possible workaround is
  to  define global variables in advance, and then to assign the values of the
  local variables to the global ones, like in the example below.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27Xglobal_a := 0;;[127X[104X
    [4X[25Xgap>[125X [27Xglobal_b := 0;;[127X[104X
    [4X[25Xgap>[125X [27Xexample := function ( local_a )[127X[104X
    [4X[25X>[125X [27X    local  local_b;[127X[104X
    [4X[25X>[125X [27X    local_b := 5;[127X[104X
    [4X[25X>[125X [27X    global_a := local_a;[127X[104X
    [4X[25X>[125X [27X    global_b := local_b;[127X[104X
    [4X[25X>[125X [27X    return EvalString( "global_a * global_b" );[127X[104X
    [4X[25X>[125X [27Xend;;[127X[104X
    [4X[25Xgap>[125X [27Xexample( 2 );[127X[104X
    [4X[28X10[128X[104X
  [4X[32X[104X
  
  [1X27.8-4 CrcString[101X
  
  [29X[2XCrcString[102X( [3Xstr[103X ) [32X function
  [6XReturns:[106X  [33X[0;10Yan integer[133X
  
  [33X[0;0YThis  function  computes a cyclic redundancy check number from a string [3Xstr[103X.
  See also [2XCrcFile[102X ([14X9.7-7[114X).[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XCrcString("GAP example string");[127X[104X
    [4X[28X-50451670[128X[104X
  [4X[32X[104X
  
  
  [1X27.9 [33X[0;0YCalendar Arithmetic[133X[101X
  
  [33X[0;0YAll calendar functions use the Gregorian calendar.[133X
  
  [1X27.9-1 DaysInYear[101X
  
  [29X[2XDaysInYear[102X( [3Xyear[103X ) [32X function
  
  [33X[0;0Yreturns the number of days in the year [3Xyear[103X.[133X
  
  [1X27.9-2 DaysInMonth[101X
  
  [29X[2XDaysInMonth[102X( [3Xmonth[103X, [3Xyear[103X ) [32X function
  
  [33X[0;0Yreturns  the number of days in month number [3Xmonth[103X of [3Xyear[103X, and [9Xfail[109X if [10Xmonth[110X
  is not in the valid range.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XDaysInYear(1998);[127X[104X
    [4X[28X365[128X[104X
    [4X[25Xgap>[125X [27XDaysInMonth(3,1998);[127X[104X
    [4X[28X31[128X[104X
  [4X[32X[104X
  
  [1X27.9-3 DMYDay[101X
  
  [29X[2XDMYDay[102X( [3Xday[103X ) [32X function
  
  [33X[0;0Yconverts a number of days, starting 1-Jan-1970, to a list [10X[ day, month, year
  ][110X in Gregorian calendar counting.[133X
  
  [1X27.9-4 DayDMY[101X
  
  [29X[2XDayDMY[102X( [3Xdmy[103X ) [32X function
  
  [33X[0;0Yreturns  the  number of days from 01-Jan-1970 to the day given by [3Xdmy[103X, which
  must  be  a  list  of  the  form  [10X[ day, month, year ][110X in Gregorian calendar
  counting. The result is [9Xfail[109X on input outside valid ranges.[133X
  
  [33X[0;0YNote  that  this  makes not much sense for early dates like: before 1582 (no
  Gregorian  calendar  at  all),  or  before  1753  in  many  English speaking
  countries or before 1917 in Russia.[133X
  
  [1X27.9-5 WeekDay[101X
  
  [29X[2XWeekDay[102X( [3Xdate[103X ) [32X function
  
  [33X[0;0Yreturns  the  weekday  of a day given by [3Xdate[103X, which can be a number of days
  since 1-Jan-1970 or a list [10X[ day, month, year ][110X.[133X
  
  [1X27.9-6 StringDate[101X
  
  [29X[2XStringDate[102X( [3Xdate[103X ) [32X function
  
  [33X[0;0Yconverts  [3Xdate[103X  to  a  readable  string.  [3Xdate[103X can be a number of days since
  1-Jan-1970 or a list [10X[ day, month, year ][110X.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XDayDMY([1,1,1970]);DayDMY([2,1,1970]);[127X[104X
    [4X[28X0[128X[104X
    [4X[28X1[128X[104X
    [4X[25Xgap>[125X [27XDMYDay(12345);[127X[104X
    [4X[28X[ 20, 10, 2003 ][128X[104X
    [4X[25Xgap>[125X [27XWeekDay([11,3,1998]);[127X[104X
    [4X[28X"Wed"[128X[104X
    [4X[25Xgap>[125X [27XStringDate([11,3,1998]);[127X[104X
    [4X[28X"11-Mar-1998"[128X[104X
  [4X[32X[104X
  
  [1X27.9-7 HMSMSec[101X
  
  [29X[2XHMSMSec[102X( [3Xmsec[103X ) [32X function
  
  [33X[0;0Yconverts  a  number [3Xmsec[103X of milliseconds into a list [10X[ hour, min, sec, milli
  ][110X.[133X
  
  [1X27.9-8 SecHMSM[101X
  
  [29X[2XSecHMSM[102X( [3Xhmsm[103X ) [32X function
  
  [33X[0;0Yis the reverse of [2XHMSMSec[102X ([14X27.9-7[114X).[133X
  
  [1X27.9-9 StringTime[101X
  
  [29X[2XStringTime[102X( [3Xtime[103X ) [32X function
  
  [33X[0;0Yconverts [3Xtime[103X (given as a number of milliseconds or a list [10X[ hour, min, sec,
  milli ][110X) to a readable string.[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XHMSMSec(Factorial(10));[127X[104X
    [4X[28X[ 1, 0, 28, 800 ][128X[104X
    [4X[25Xgap>[125X [27XSecHMSM([1,10,5,13]);[127X[104X
    [4X[28X4205013[128X[104X
    [4X[25Xgap>[125X [27XStringTime([1,10,5,13]);[127X[104X
    [4X[28X" 1:10:05.013"[128X[104X
  [4X[32X[104X
  
  [1X27.9-10 SecondsDMYhms[101X
  
  [29X[2XSecondsDMYhms[102X( [3XDMYhms[103X ) [32X function
  
  [33X[0;0Yreturns  the number of seconds from 01-Jan-1970, 00:00:00, to the time given
  by  [3XDMYhms[103X,  which  must  be  a  list  of the form [10X[ day, month, year, hour,
  minute,  second  ][110X.  The remarks on the Gregorian calendar in the section on
  [2XDayDMY[102X ([14X27.9-4[114X) apply here as well. The last three arguments must lie in the
  appropriate ranges.[133X
  
  [1X27.9-11 DMYhmsSeconds[101X
  
  [29X[2XDMYhmsSeconds[102X( [3Xsecs[103X ) [32X function
  
  [33X[0;0YThis is the inverse function to [2XSecondsDMYhms[102X ([14X27.9-10[114X).[133X
  
  [4X[32X  Example  [32X[104X
    [4X[25Xgap>[125X [27XSecondsDMYhms([ 9, 9, 2001, 1, 46, 40 ]);[127X[104X
    [4X[28X1000000000[128X[104X
    [4X[25Xgap>[125X [27XDMYhmsSeconds(-1000000000);[127X[104X
    [4X[28X[ 24, 4, 1938, 22, 13, 20 ][128X[104X
  [4X[32X[104X
  
  
  [1X27.10 [33X[0;0YObtaining LaTeX Representations of Objects[133X[101X
  
  [33X[0;0YFor  the  purpose of generating LaTeX source code with [5XGAP[105X it is recommended
  to  add  new  functions  which  will  print the LaTeX source or return LaTeX
  strings for further processing.[133X
  
  [33X[0;0YAn  alternative  approach  could  be  based on methods for the default LaTeX
  representation  for  each  appropriate type of objects. However, there is no
  clear  notion  of  a  default  LaTeX  code  for any non-trivial mathematical
  object; moreover, different output may be required in different contexts.[133X
  
  [33X[0;0YWhile customisation of such an operation may require changes in a variety of
  methods  that  may be distributed all over the library, the user will have a
  clean  overview  of  the  whole  process  of  LaTeX code generation if it is
  contained  in  a single function. Furthermore, there may be kinds of objects
  which  are  not  detected by the method selection, or there may be a need in
  additional parameters specifying requirements for the output.[133X
  
  [33X[0;0YThis  is  why  having a special purpose function for each particular case is
  more suitable. [5XGAP[105X provides several functions that produce LaTeX strings for
  those  situations  where this is nontrivial and reasonable. A useful example
  is [2XLaTeXStringDecompositionMatrix[102X ([14X71.11-5[114X) from the [5XGAP[105X library, others can
  be  found  entering [10X?LaTeX[110X at the [5XGAP[105X prompt. Package authors are encouraged
  to  add  an  index  entry  [10XLaTeX[110X  to  the  documentation of all LaTeX string
  producing  functions. This way, entering [10X?LaTeX[110X will give an overview of all
  documented functionality in this direction.[133X
  
