V10/cmd/spitbol/spitv35.man








                             *      *      *





                        M A C R O   S P I T B O L
                        M A C R O   S P I T B O L

                        -------------------------



                    PROGRAM REFERENCE MANUAL (Rev. G)

                    ---------------------------------



                     VAX/VMS Version 3.5 (BCAB-2132)

                     -------------------------------





                  Copyright   (c)   1980    by    DEWAR
                  INFORMATION    SYSTEMS   CORPORATION.
                  This   manual   may   be   reporduced
                  provided  that this Dewar Information
                  Systems    Copyright    Notice     is
                  incorporated.



                  VAX,   VMS,  DECwriter  and  PDP  are
                  registered trademarks of the  Digital
                  Equipment Corporation.




                  DEWAR INFORMATION SYSTEMS CORPORATION
                           221 West Lake Street
                      Oak Park, Illinois USA  60302

                              (312) 524-1644








































           Please replace this page with the Table of Contents
           Please replace this page with the Table of Contents
                               (At the end)
                               (At the end)































    This  report  is  parallel  to  the  University of Leeds Technical
    Report Number 94, "Macro Spitbol - Decsystem 10 Version,"  McCann,
    Holden  and Dewar, Dec. 1976.  Differences will be found primarily
    in Section 12.


                             Revision History
                             ________ _______

    This document has been revised as follows :

    Dec 1976        to correspond with        SPITBOL Version 3.0
    Mar 1978        to correspond with        SPITBOL Version 3.3
    Sep 1978        to correspond with        SPITBOL Version 3.4
    Feb 1979        to correspond with        SPITBOL Version 3.5



    VAX/VMS MACRO SPITBOL Version BCAB-2132 is designed to operate  on
    the  VAX 11/780 and VAX 11/750 computers running the VMS operating
    system version 2.0, 2.1, 2.2, 2.3 or 2.4.







































         MACRO SPITBOL V3.5
                                                   PAGE 1 - [1]
         Introduction



                          *-------------------*
                            [1]  Introduction
                          | [1]  Introduction |
                          *-------------------*

    MACRO SPITBOL  is  an  implementation  of  the  SNOBOL4   computer
    language  which  was  coded  during 1974/75. In speed and external
    style  it resembles the earlier SPITBOL  implementations  for  the
    IBM 360   and  UNIVAC 1100  series  computers  but  internally  it
    differs  considerably  from  these  since  the  source   code   is
    converted  to  a reverse polish string which is then used to drive
    interpretive routines.  MACRO SPITBOL is  available  with  a  high
    degree  of  compatibility  on  a  range of computers running under
    widely differing operating  systems.   This  report  reflects  the
    above   fact   by  providing  in  its  first  nine  sections  such
    documentation  and  information  for  users  as  is  substantially
    machine   independent,  with  a  final  section  giving  essential
    information peculiar to each  particular  implementation.   It  is
    assumed  that  the  reader  is familiar with the standard version,
    referred to simply as SNOBOL4 in the remainder of the  report  and
    described   in   the   essential   reference   book  "The  SNOBOL4
    Programming Language" by Griswold,  Poage  and  Polonsky,  Addison
    Wesley,  1971.   Version  3.4  of SNOBOL4 is the reference version
    for comparison.  There are  several  minor  incompatibilities  and
    some  features  are  not implemented.  There are several additions
    to the language in this implementation.































         MACRO SPITBOL V3.5
                                                   PAGE 2 - [1]
         Introduction


    In  general  an  attempt  has   been   made   to   retain   upward
    compatibility  wherever  possible.   Most  SNOBOL4  programs which
    operate correctly using  SNOBOL4  should  operate  correctly  when
    compiled  and  executed  using MACRO SPITBOL.  For brevity, in the
    remainder of the report MACRO SPITBOL will be referred  to  simply
    as SPITBOL.


    SPITBOL was initially designed and implemented by:

    Professor Robert B. K. Dewar,
    Courant Institute of Mathematical Sciences,
    251 Mercer Street,
    NEW YORK, N.Y. 10012.
    U.S.A.

    It has been further developed and is now maintained by:

    Dr.  Anthony P. McCann,
    Department of Computer Studies,
    University of Leeds,
    LEEDS, LS2 9JT,
    England.


    The VAX/VMS Version is the work of and is maintained by:

    Steven G. Duff
    c/o Dewar Information Systems Corporation
    221 West Lake Street
    Oak Park, Illinois  60302

    which  should  be  contacted to report problems or for information
    on distribution.

    The implementor gratefully acknowledges the assistance of  Thagard
    Research  in  providing  development  facilities  for  the VAX/VMS
    Version of SPITBOL.



















         MACRO SPITBOL V3.5
                                                   PAGE 3 - [2]
         Summary of Differences



                     *-----------------------------*
                       [2]  Summary of Differences
                     | [2]  Summary of Differences |
                     *-----------------------------*

    The  principal  differences  between  SPITBOL  and   SNOBOL4   are
    summarised here.


 2.1  Features not Implemented
 2.1  Features not Implemented
 _____________ ___ ___________


     1.  The  capability  to  redefine  standard  system functions and
         predefined operators.  This restriction permits compile  time
         pre-evaluation  of  a wider range of expressions and patterns
         than would otherwise  be  possible.   It  affects  the  OPSYN
         function (see Section 5 for details).

     2.  The VALUE  and BACKSPACE functions.

     3.  The  keywords  &STFCOUNT  and  &FULLSCAN  .   The  heuristics
         associated with the QUICKSCAN mode of  pattern  matching  are
         complex  and for many programs do not result in a significant
         increase  in speed.  Accordingly only  FULLSCAN  matching  is
         provided  and  no  heuristics  are  applied.   In  particular
         deferred expressions are not assumed to match  at  least  one
         character.

     4.  The BLOCK datatype as in SNOBOL4B .

     5.  The  variable  PUNCH has no predefined association to a punch
         stream.   If  required,  the  programmer  should  include   a
         statement such as OUTPUT(.PUNCH,3) in his program.

     6.  SPITBOL does not permit exponentiation of two real numbers.

     7.  For  small  machines,  versions  of SPITBOL in which all real
         arithmetic capability is omitted are available - see  Section
         12.

     8.  Some  implementations  may  omit  a  few features.  A list is
         given in Section 12.















         MACRO SPITBOL V3.5
                                                   PAGE 4 - [2.2]
         Summary of Differences



 2.2  Features Implemented Differently
 2.2  Features Implemented Differently
 _____________ ___________ ___________

    Some of the differences here may necessitate program changes.


     1.  In SPITBOL the value of  &ANCHOR  is  obtained  only  at  the
         start  of the match.  In SNOBOL4, changing the value during a
         match can lead to unexpected results.

     2.  The pattern valued variables ABORT, ARB, BAL,  FAIL,   FENCE,
         REM,  SUCCEED  are write protected so that attempts to assign
         to them will fail.

     3.  The same stack is used for pattern matching and for  function
         calls.   Thus  the  diagnostic issued for an infinite pattern
         recursion is simply the standard stack overflow message.

     4.  Recovery from execution errors (see function SETEXIT ).

     5.  Input/Output.  In particular, FORTRAN I/O  is  not  provided.
         Dynamic  association  to  files is possible through the third
         argument and statement failure is possible if a  file  cannot
         be found as in
              INPUT(.IN,3,'INFIL')                :F(NOFILE)

     6.  The  TABLE function is implemented so that table elements can
         be rapidly accessed by the efficient  technique  of  hashing.
         In  order  to  set  a  suitable size for the hash table it is
         important to choose a reasonable value for  the  argument  of
         TABLE.   Use of an inappropriate value will not cause program
         failure but may delay access to elements or waste memory.

     7.  SPITBOL allows  some  datatype  conversions  not  allowed  in
         SNOBOL4.   For  example  a real value may be used in patterns
         and is converted to a string.  In  general  objects  will  be
         converted to an appropriate datatype if at all possible.

     8.  The  unary  .  (name)  operator applied to a natural variable
         yields  a NAME rather than a  STRING.   Since  this  NAME  is
         converted  to  a STRING when necessary, the difference is not
         normally noticed.  The only points at which   the  difference
         will  be  apparent  is  in  use  of  the  IDENT,  DIFFER  and
         DATATYPE functions  and when used as a TABLE subscript.

     9.  SPITBOL  permits  leading  and  trailing  blanks  on  numeric
         strings which are to be converted to  NUMERIC .

    10.  Several  of  the  built-in  functions are slightly different.
         They are identified by a * on their names in Section 5.

    11.  The count  of  statements  executed  includes  labelled  null
         statements and  the END statement.




         MACRO SPITBOL V3.5
                                                   PAGE 5 - [2.2]
         Summary of Differences

    12.  Constant  sub-expressions  and  patterns are pre-evaluated at
         compile time.  This  may  occasionally  result  in  execution
         errors   (e.g.   integer   overflow)  being  reported  during
         compilation.  Significant speed increases may be obtained  by
         ensuring  that in-line patterns are constant so that they may
         be  pre-evaluated.   Patterns  built  from   pattern   valued
         variables  (e.g.  ARB)  and  pattern  functions with constant
         arguments (e.g. ANY(*ARG), RTAB(0)) are themselves constant.

    13.  A compact and fast garbage collector is used which  needs  to
         distinguish   between  small  integers  and memory addresses.
         This effectively restricts the maximum size  of  any  SPITBOL
         object  (string,  array, table, code or expression block)  to
         be less than a value subsequently  referred  to  as  MXLEN  .
         This   is   in  practice  little  restriction  on  most  host
         computers.  Where, because of implementation needs, it  might
         prove  restrictive,  a  run time option is generally provided
         for setting this value to suit  a  user's  requirements  (see
         Section  12.  where  an  indication  of  the  default initial
         setting of MXLEN is also given).  Since the  value  of  MXLEN
         is  used  to initialise &MAXLNGTH , printing &MAXLNGTH during
         execution gives its exact value.   A  user  may  subsequently
         assign  a  smaller value to this keyword but values exceeding
         that of MXLEN may not be assigned to it.

    14.  A value of zero for &TRIM does  not  necessarily  imply  that
         trailing  blanks  will  be added to records in which they are
         not originally present - see Section 12.



 2.3  Additional Features
 2.3  Additional Features
 _______________ ________

    The following SPITBOL features are not found in SNOBOL4.


     1.  The  functions APPEND, BREAKX, CHAR, BUFFER,    EJECT,  EXIT,
         HOST,    INSERT,    LEQ,  LGE,        LLE,  LLT,  LNE,  LPAD,
         REVERSE, RPAD,      RSORT,  SETEXIT,  SORT,  SUBSTR   .   The
         sorting  functions,  the  extended  break pattern BREAKX, and
         the output formatting functions LPAD and RPAD are  especially
         useful.  See Section 5 for details of all these functions.

     2.  The keywords &ERRTEXT and &PROFILE.

     3.  The  symbolic  dump  optionally  includes elements of arrays,
         tables  and programmer defined datatypes. (See DUMP ).

     4.  An access trace mode is provided in  addition  to  the  other
         standard modes.  (See TRACE ).

     5.  A selection or alternative feature is provided.






         MACRO SPITBOL V3.5
                                                   PAGE 6 - [2.3]
         Summary of Differences

     6.  The second argument of CONVERT may be 'NUMERIC'.

     7.  The  assignment symbol , = , is treated as an ordinary binary
         operator  and the binary operator , ? , is  given  a  defined
         meaning as a pattern matching operator.

     8.  If  running  SPITBOL from an on-line terminal, options may be
         selected  to reduce the amount of  listing  information  sent
         to  the  terminal  or  to restrict this to compilation errors
         only. (See Section 12 for details).

     9.  Reflecting the fact that many current computer systems   have
         good  online  terminal  capabilities,  the  name  TERMINAL is
         available with pre-association for  input  and  output  to  a
         terminal on such systems - see Section 12.
         T     TERMINAL = EVAL(TERMINAL)     :S(T)
         acts  as a desk calculator.  TERMINAL may be detached but may
         not   then   be   re-associated.    If   this   feature    is
         unimplemented, TERMINAL acts as an ordinary variable.

    10.  Several  additional  control  cards  may  be  used  to select
         various compile time and run time options.

    11.  An   extended   character   set   is   available   in    some
         implementations.   Where  lower  case  letters  are  provided
         names such as "INPUT" and "input"  are  distinct.   In  gotos
         :f  and :s mean the same as :F and :S.  The Tab character, if
         available,  is  syntactically  identical  with  blank.    See
         Section 12.

    12.  The  assignment  &STLIMIT = -1 inhibits all checks on numbers
         of statements executed.

    13.  Built-in functions are available for sorting the elements  of
         tables and arrays.

    14.  A  additional datatype called a BUFFER is available.  Buffers
         are  character  arrays  with  a  fixed  allocation   and   an
         adjustable   size   which  may  vary  between  zero  and  the
         allocated size at any time.   Three  new  functions,  INSERT,
         APPEND  and BUFFER have been added to support the buffer type
         specifically,  and the CONVERT,  PROTOTYPE,  SIZE,  DATATYPE,
         SUBSTR,  COPY and pattern matching and replacement operations
         have been enhanced to provide support for buffers.














         MACRO SPITBOL V3.5
                                                   PAGE 7 - [2.4]
         Summary of Differences



 2.4  Syntax Differences
 2.4  Syntax Differences
 ___________ ___________

    This section describes differences in syntax between  SPITBOL  and
    SNOBOL4.  such  differences  should  not generally affect existing
    SNOBOL4 programs.


     1.  Reference  to  elements  of  arrays  which   are   themselves
         elements  of   arrays  is  possible  without  using  the ITEM
         function.  Thus the following are equivalent -
           A<J><K> = B<J><K>;       ITEM(A<J>,K) = ITEM(B<J>,K)

     2.  The compiler permits real  constants  to  be  followed  by  a
         FORTRAN style exponent E+xxx.

     3.  A  selection  or  alternative  construction  may  be  written
         anywhere that a value is permitted.  It consists of a  series
         of   expressions   separated   by   commas  and  enclosed  in
         parentheses:
           (e1,e2,e3,....,en)
         The semantics is to evaluate the  expressions  from  left  to
         right  until one succeeds and then use its value.  Failure is
         signalled if all evaluations fail.   This  feature  trivially
         provides  an  "or"  function for predicates and also has many
         other uses as shown by the following examples:
           A     = (EQ(B,3),GT(B,20)) B + 1
           NEXT  = (INPUT,'%EOF')
           MAXAB = (GT(A,B) A,B)
         The   alternative   structure   provides   an    IF-THEN-ELSE
         capability,  and  as  such  is  a useful programming feature.
         Note incidentally that the semantics of ordinary  parentheses
         is  a  correct  degenerate  case  of an alternative structure
         with one alternative.

     4.  The array brackets [] may be used instead of <>  if  desired.
         Thus X[I,J] and X<I,J> are equivalent.

     5.  By  treating  =  as  a  right  associative operator of lowest
         priority, multiple assignments within a single statement  may
         be  coded.   The  value  returned by an assignment is that of
         its right hand side.  After obeying
           A[I = INPUT] = INPUT
         I is the index of the element of the array  into  which  data
         has been read.

     6.  ?  is  defined  to  be an explicit pattern matching operator.
         It is left associative and has priority lower  than  that  of
         all  operators  except  =  .   It  returns  as  its value the
         substring matched from its left argument (a  string)  by  its
         right argument (a pattern).  Thus
           'ABCD' ? LEN(3) $ OUTPUT ? LEN(1) REM $ OUTPUT
         causes printing of
           ABC
           BC


         MACRO SPITBOL V3.5
                                                   PAGE 8 - [2.4]
         Summary of Differences



























































         MACRO SPITBOL V3.5
                                                   PAGE 9 - [3]
         Datatypes and Conversion



                    *-------------------------------*
                      [3]  Datatypes and Conversion
                    | [3]  Datatypes and Conversion |
                    *-------------------------------*

    This  section  details  the datatypes available in SPITBOL and the
    conversions which may be performed amongst them.


 3.1  Available Datatypes
 3.1  Available Datatypes
 ______________ _________


     1.  STRING
         Strings range  in  length  from  0  (null  string)  to  MXLEN
         characters   (subject  to  the  setting  of  &MAXLNGTH).  Any
         characters from the hardware set of the computer used to  run
         SPITBOL can appear in a string.

     2.  INTEGER
         Integers  are  generally  stored  in  the hardware complement
         form for the computer used to run SPITBOL and usually  occupy
         a single word.  See Section 12 for range.

     3.  REAL
         Available  if  floating  point  hardware  is  available  (sec
         10.2.4).  Stored according to the usual hardware  conventions
         of the computer on which SPITBOL is run.

     4.  ARRAY
         Arrays  may  not  exceed  MXLEN words in total size. 10 to 15
         words must be allowed for housekeeping information.

     5.  TABLE
         A table may have up to MXLEN elements.   Any  SPITBOL  object
         may  be  used  as  the name of a table element, including the
         null string.  See Section 5 for details.

     6.  PATTERN
         Pattern  structures  may  be  arbitrarily  large  within  the
         limits imposed by total available memory.

     7.  NAME
         A  name  can  be  obtained  from  any variable.  Note that in
         SPITBOL , the name operator (unary dot) applied to a  natural
         variable  yields  a  name,  not  a string as is the case with
         SNOBOL4.  Use  of  names  as  arguments  to  the  indirection
         operator  (unary  $)  is  much  faster than the use of string
         arguments.   Names  can  also  be  used   advantageously   in
         statements such as  INPUT(.IN)








         MACRO SPITBOL V3.5
                                                   PAGE 10 - [3.1]
         Datatypes and Conversion


     8.  EXPRESSION
         Any   expression  may  be  deferred  by  using  the  unary  *
         operator.

     9.  CODE
         A string representing a valid  program  can  be  compiled  at
         execution  time.   The  resulting CODE object may be executed
         in the same manner as the original program.

    10.  BUFFER
         The buffer type does not  exist  in  SNOBOL4;   it  has  been
         introduced  into  MACRO  SPITBOL  primarily to provide a more
         efficient mechanism for working with large strings.

         Buffers are packed character  arrays  created  with  a  fixed
         allocation  defining  the  maximum  number of characters they
         can ever contain.  Buffers are helpful in manipulating  large
         strings  efficiently.  The reason is that in-situ replacement
         of buffer  contents  is  possible  using  APPEND,  INSERT  or
         pattern  replacement, while any modification to a string must
         be achieved internally by first making a copy of the string.

         A buffer is like an array  in  that  it  cannot  be  extended
         beyond  its  allocation size.  The origin of the first buffer
         character is always one.   Buffer  creation  is  accomplished
         directly   with  the  BUFFER  function,  or  indirectly  with
         CONVERT.  In addition, every buffer  has  a  dynamic  defined
         size that can vary between zero and the maximum allocation.

         Once  a  buffer  has been created,  characters can be written
         into  specific  segments  using   the   INSERT   and   APPEND
         functions, or using pattern replacement.

         As  with  other aggregate types, two buffers are IDENTical if
         and only if they are the same object.

         Most standard functions will convert buffers to strings  when
         required.   Exceptions  to this are SUBSTR, which can be used
         to directly produce a string  from  a  section  of  a  buffer
         without  the  need  for  an intermediate conversion and SIZE,
         which  will  give  the  current  defined  size  of  a  buffer
         directly.   The  pattern  matching  and  pattern  replacement
         operations of the language will also accept a buffer name  as
         a  subject.   Pattern  matching  is  done  directly  from the
         buffer, and pattern replacement is  done  directly  into  the
         buffer as an INSERT function on the substring matched.

         In  addition,  PROTOTYPE  gives  the  prototype  string for a
         buffer, which is the integer allocation size  of  the  buffer
         object.   COPY  can be used to create a duplicate of a buffer
         to work with.  DATATYPE will, of course,  return  the  string
         "BUFFER" for any buffer object.





         MACRO SPITBOL V3.5
                                                   PAGE 11 - [3.2]
         Datatypes and Conversion



 3.2  Possible Datatype Conversions
 3.2  Possible Datatype Conversions
 _____________ ________ ___________

    As  far  as possible SPITBOL converts from one datatype to another
    as required.  The following  table  shows  which  conversions  are
    possible.    Blank  entries  indicate  that  the  conversions  are
    impossible, A indicates that conversion is always possible, and  U
    indicates  conversion  is usually possible, depending on the value
    involved.

                          CONVERT TO:

                       S I R A T P N E C B
                     +--------------------
                    S! A U U     A A U U U
                    I! A A A     A A A   A
                    R! A U A     A A A   A
            CONVERT A!       A U
             FROM:  T!       A A
                    P!           A
                    N! U U U     U A U U U
                    E!               A
                    C!                 A
                    B!                   A

            S       STRING
            I       INTEGER
            R       REAL
            A       ARRAY
            T       TABLE
            P       PATTERN
            N       NAME
            E       EXPRESSION
            C       CODE
            B       BUFFER






















         MACRO SPITBOL V3.5
                                                   PAGE 12 - [3.3]
         Datatypes and Conversion



 3.3  Conversion Details
 3.3  Conversion Details
 _______________ _______

    This section gives detailed descriptions for each of the  possible
    conversions.


     1.  STRING --> INTEGER

         Leading  and  trailing blanks are ignored.  A leading sign is
         optional.  The sign, if  present,  must  immediately  precede
         the  digits.   A  null  or  all  blank string is converted to
         zero.

     2.  STRING --> REAL

         Leading and trailing blanks are ignored.  A leading  sign  if
         present,  must  immediately  precede  the number.  The number
         itself may be written in standard FORTRAN  type  format  with
         an  optional  exponent.   The  conversion is always accurate,
         the last bit  being  correctly  rounded.   A  null  or  blank
         string is converted to 0.0 .

     3.  STRING --> PATTERN

         A pattern is created which will match the string value.

     4.  STRING --> NAME

         The  result is the name of the natural variable which has the
         given string as its name.  This is identical  to  the  result
         of  applying  the  unary  dot  operator  to  the  variable in
         question.  The null string cannot be converted to a name.

     5.  STRING --> EXPRESSION

         The string must represent a legal  SPITBOL  expression.   The
         compiler  is  used  to convert the string into its equivalent
         expression and the result can be used anywhere an  expression
         is permitted.

     6.  STRING --> CODE

         The  string  must represent a legal SPITBOL program, complete
         with labels, and using  semicolons  to  separate  statements.
         The  compiler  is  used to convert the string into executable
         code.  The resulting code can be executed by transferring  to
         it  with  a  direct  GOTO  or by a normal transfer to a label
         within the code.

     7.  STRING --> BUFFER






         MACRO SPITBOL V3.5
                                                   PAGE 13 - [3.3]
         Datatypes and Conversion

         A buffer is created with an  allocation  size  equal  to  the
         size  of  the string, and the string value is copied into the
         buffer.  The null string cannot be converted to a buffer.























































         MACRO SPITBOL V3.5
                                                   PAGE 14 - [3.3]
         Datatypes and Conversion


     8.  INTEGER --> STRING

         The result has no leading  or  trailing  blanks  and  leading
         zeros  are  suppressed.  A minus sign is prefixed to negative
         values.  Zero is converted to "0".

     9.  INTEGER --> REAL

         A real number is obtained by adding a zero  fractional  part.
         Note  that  it  is  possible  to  lose  significance  in this
         conversion if the mantissa of  the  real  representation  has
         fewer digits than are available for an integer.

    10.  INTEGER --> PATTERN

         First  convert   to  a  STRING  and  then  treat as STRING to
         PATTERN.

    11.  INTEGER --> NAME

         First convert to STRING and then treat as STRING to NAME.

    12.  INTEGER --> EXPRESSION

         The result is an EXPRESSION which when evaluated  yields  the
         INTEGER as its value.

    13.  INTEGER --> BUFFER

         The  integer  is  first  converted  to a STRING which is then
         converted to a buffer.

    14.  REAL --> STRING

         The real  number  is  converted  to  its  standard  character
         representation.   Fixed  type  format  is  used  if possible,
         otherwise  an  exponent  (using  E)   is   supplied.    Seven
         significant  digits  are  generated, the last being correctly
         rounded for all  cases.   Trailing  insignificant  zeros  are
         suppressed after rounding has taken place.

    15.  REAL --> INTEGER

         This  conversion is only possible if the REAL is in the range
         permitted  for  integers.   in  this  case,  the  result   is
         obtained by truncating the fractional part.

    16.  REAL --> PATTERN

         First convert to STRING and then treat as STRING to PATTERN.

    17.  REAL --> NAME





         MACRO SPITBOL V3.5
                                                   PAGE 15 - [3.3]
         Datatypes and Conversion

         First convert to STRING and then treat as STRING to NAME.

    18.  REAL --> EXPRESSION

         The  result  is an expression which when evaluated yields the
         REAL as its value.

    19.  REAL --> BUFFER

         First convert to STRING, then treat as STRING to BUFFER.

    20.  ARRAY --> TABLE

         The array must be two dimensional with a second dimension  of
         2   or  an  error  occurs.   For  each  value  of  the  first
         subscript, J , a table entry using the (J,1)  entry  as  name
         and  the  (J,2)  entry  as value is created.  The table built
         has a number of hash headers (see TABLE in Section  5)  equal
         to the first dimension.

    21.  TABLE --> ARRAY

         The  table  must  have at least one element which is non-null
         otherwise statement failure occurs.  The array  generated  is
         two  dimensional with the first dimension equal to the number
         of non-null entries in the table and the second dimension  is
         two.   For  each entry, the (J,1) element in the array is the
         the name and the (J,2) element is the value.

    22.  NAME --> STRING

         A NAME can be converted to a STRING only if it  is  the  name
         of   a   natural  variable.   The  resulting  string  is  the
         character name of the variable.

    23.  NAME --> INTEGER, REAL, PATTERN, EXPRESSION, CODE, BUFFER

         The NAME is first converted to a  STRING  (if  possible)  and
         then the conversion proceeds as described for STRING.



















         MACRO SPITBOL V3.5
                                                   PAGE 16 - [4]
         Operators



                            *----------------*
                              [4]  Operators
                            | [4]  Operators |
                            *----------------*

    SPITBOL  operators  are  listed  without any detailed descriptions
    since  they  correspond,  with  a  few  exceptions  noted  in  the
    description of differences, to those of SNOBOL4.


 4.1  Unary Operators
 4.1  Unary Operators
 __________ _________

    Unary  operators  all  have  equal  priority which is greater than
    that of any binary operator.

    OPERATOR                DESCRIPTION

    ?                Interrogation - null if operand succeeds
    &                Keyword
    +                Indicates postive numeric operand
    -                Negates numeric operand
    *                Defers evaluation of expression
    $                Indirection
    .                Returns a name
    ~                Negates failure or success of its operand
    @                Assigns cursor position to its operand

         Unused unary operator symbols are   ! % / # =





























         MACRO SPITBOL V3.5
                                                   PAGE 17 - [4.2]
         Operators



 4.2  Binary Operators
 4.2  Binary Operators
 ___________ _________

    Several of the associativites and priorities differ from those  of
    SNOBOL4.

    OP.     ASSOCY. PRIO.           DEFINITION

    =       right   0       Assignment
    ?       left    1       Pattern match
    |       right   3       Pattern alternation
    blank   right   4       Concatenation or pattern match
    +       left    6       Arithmetic addition
    -       left    6       Arithmetic subtraction
    /       left    8       Arithmetic division
    *       left    9       Arithmetic multiplication
    $       left    12      Immediate pattern assignment
    .       left    12      Conditional pattern assignment

    &       left    2       Undefined
    @       right   5       Undefined
    ~       left    7       Undefined
    %       left    10      Undefined
    _       right   13      Undefined

































         MACRO SPITBOL V3.5
                                                   PAGE 18 - [5]
         Functions



                            *----------------*
                              [5]  Functions
                            | [5]  Functions |
                            *----------------*

    This  section  defines  the  built-in  functions  of  SPITBOL, the
    descriptions being given in alphabetical order.   In  most  cases,
    the  arguments  are  pre-converted  to  some  particular datatype.
    This is indicated in the function header by the notation:
      FUNCTION(STRING,INTEGER,....)
    If  the  corresponding  argument  cannot  be  converted   to   the
    indicated  datatype,  an  error  occurs.   Sometimes  the range of
    arguments  permitted  is  restricted,  in  which  case   arguments
    outside  the  range  cause an error.  The usage "ARGUMENT" implies
    that the argument can be of any datatype. "NUMERIC"  implies  that
    either REAL or INTEGER arguments are acceptable.

    In  functions  such as ARRAY, DATA, DEFINE with a string prototype
    argument, the string should not contain non-significant blanks.


 5.1  ANY -- Pattern to Match Selected Character
 5.1  ANY -- Pattern to Match Selected Character
 ________ __ _______ __ _____ ________ _________

    ANY(STRING) or ANY(EXPRESSION)

    This function  returns   a  pattern  which  will  match  a  single
    character  selected from the characters in the argument string.  A
    null argument is not permitted.   If  an  expression  argument  is
    used,  then  the  expression  is evaluated during pattern matching
    and must yield a non-null string result.


 5.2  APPEND * -- Append string to buffer
 5.2  APPEND * -- Append string to buffer
 ___________ _ __ ______ ______ __ ______

    APPEND(BUFFER,STRING)

    APPEND is used to append a string to the contents of  an  existing
    buffer.     APPEND    is    defined    to    be    identical    to
    INSERT(BUFFER,SIZE(BUFFER)+1,0,STRING).  The first  argument  must
    be a buffer type or an error occurs.


 5.3  APPLY * -- Apply function
 5.3  APPLY * -- Apply function
 __________ _ __ _____ ________

    APPLY(NAME,ARG,ARG,...)

    The  first argument is the name of a function to be applied to the
    (possibly null) list  of  arguments  following.   Unlike  SNOBOL4,
    SPITBOL  does  not  require  the  number of arguments to match the
    function definition, extra arguments  being  ignored  and  missing
    arguments being supplied as null strings.






         MACRO SPITBOL V3.5
                                                   PAGE 19 - [5.4]
         Functions



 5.4  ARBNO -- Pattern for Iterated Match
 5.4  ARBNO -- Pattern for Iterated Match
 __________ __ _______ ___ ________ _____

    ARBNO(PATTERN)

    This  function  returns  a  pattern  which will match an arbitrary
    number of occurrences of  the  pattern  argument,  including  zero
    occurrences (this resulting in matching of the null string).


 5.5  ARG * -- Obtain Argument Name
 5.5  ARG * -- Obtain Argument Name
 ________ _ __ ______ ________ ____

    ARG(NAME,INTEGER)

    The  first  argument  represents  the  name  of  a  function.  The
    integer is the index of a formal argument to this  function.   The
    NAME  of the selected argument is returned (this is converted to a
    string on output).  ARG fails if the integer is out  of  range  of
    the number of formal arguments.


 5.6  ARRAY -- Generate Array Structure
 5.6  ARRAY -- Generate Array Structure
 __________ __ ________ _____ _________

    ARRAY(STRING,ARG) or ARRAY(INTEGER,ARG)

    The  string  represents  the protoype of an array to be allocated.
    This is in the form
       "LBD1:HBD1,LBD2:HBD2,...."
    where  LBD1,HBD1  etc.   are  integers  specifying  low  and  high
    bounds.   The  low  bound  (LBD) may be omitted for some or all of
    the dimensions, in which case the colon may also be omitted and  a
    low  bound of 1 is assumed.  The second argument (of any datatype)
    is the initial value of all the elements in the array.  If  it  is
    omitted,  the  initial  value of all the elements will be the null
    string.  The second form of the call may be  used  to  create  one
    dimensional  arrays  (vectors)  with  a  low  bound  of 1. SPITBOL
    optimises accesses to elements of vectors.


 5.7  BREAK -- Construct Scanning Pattern
 5.7  BREAK -- Construct Scanning Pattern
 __________ __ _________ ________ _______

    BREAK(STRING) or BREAK(EXPRESSION)

    This function returns a pattern which will match any string up  to
    the  point  preceding  any  character which occurs in the argument
    string.  A null argument  is  not  permitted.   If  an  expression
    argument  is given, the resulting pattern causes the expression to
    be  evaluated  during  pattern  matching.   In  this   case,   the
    evaluated result must be a non-null string.








         MACRO SPITBOL V3.5
                                                   PAGE 20 - [5.8]
         Functions



 5.8  BUFFER * -- Create buffer object
 5.8  BUFFER * -- Create buffer object
 ___________ _ __ ______ ______ ______

    BUFFER(INTEGER,STRING)

    This  function  creates  a buffer-type object (see the description
    in the datatype section).   The  first  argument  is  the  integer
    allocation  for  the  buffer  and  the second argument defines the
    initial contents of the buffer.  The defined size  of  the  buffer
    is  initialized  to  SIZE(STRING).  The allocation must be between
    between 1 and &MAXLNGTH, and the size of the string must  be  less
    than or equal to the allocated size, or an error will occur.


 5.9  BREAKX * -- Construct Scanning Pattern
 5.9  BREAKX * -- Construct Scanning Pattern
 ___________ _ __ _________ ________ _______

    BREAKX(STRING) or BREAKX(EXPRESSION)

    BREAKX  returns  a  pattern  whose  initial match is the same as a
    corresponding  BREAK  pattern.   However,  BREAKX   has   implicit
    alternatives  which  on  subsequent  match failure permit scanning
    past the first break character found and  up  to  the  next  break
    character.   Note  that BREAKX may be used to  replace ARB in many
    situations where BREAK cannot be used  easily.   For  example  the
    following replacement can be made -
       ARB ('CAT' ! 'DOG')  -->  BREAKX('CD') ('CAT' ! 'DOG')
    In   the  case  of  an  expression  argument,  the  expression  is
    evaluated during  pattern  matching  and  must  yield  a  non-null
    string.   Note  that  evaluation of the expression is not repeated
    on rematch attempts by extension.



























         MACRO SPITBOL V3.5
                                                   PAGE 21 - [5.10]
         Functions



 5.10  CHAR * -- Convert Character Code to String
 5.10  CHAR * -- Convert Character Code to String
 __________ _ __ _______ _________ ____ __ ______

    CHAR(INTEGER)

    The CHAR function returns a one-character  string  containing  the
    character  with  the  internal character code corresponding to the
    given   argument.    The   string    returned    is    necessarily
    machine-dependent.  In  general however, A = CHAR(N) is equivalent
    to:
       &ALPHABET (LEN(N) LEN(1) . A)

    If the given argument is not a non-negative integer in  the  range
    of the host machine character set, an error is issued.


 5.11  CLEAR * -- Clear Variable Storage
 5.11  CLEAR * -- Clear Variable Storage
 ___________ _ __ _____ ________ _______

    CLEAR(STRING)

    This  function  causes  the values of variables to be set to null.
    In the simple case, where the argument is  omitted  or  null,  the
    action  is  the  same as in SNOBOL4 (i.e. all variables cleared to
    null).  An extension is available in SPITBOL.  The first  argument
    may  be  a  string  which is a list of variable names separated by
    commas.  These represent the names of variables whose  values  are
    to be left unchanged.  For example -
       CLEAR('ABC,CDE,EFG')
    would  cause the value of all variables except ABC, CDE, EFG to be
    set to the null string.


 5.12  CODE * -- Compile Code
 5.12  CODE * -- Compile Code
 __________ _ __ _______ ____

    CODE(STRING)

    The effect of this function is to convert  the  argument  to  type
    CODE  as  described in the section on type conversion.  The STRING
    must represent a valid SPITBOL program complete  with  labels  and
    using  semicolons  (;)  to  separate statements.  The call to CODE
    fails if syntactic errors are found.  In this case it is  possible
    to inspect &ERRTEXT to find the error message.  e.g.
           C = CODE(CD)     :F<CODE(' OUTPUT = &ERRTEXT')>
    SETEXIT  may  also  be  used  to  intercept these errors.  Another
    extension over  SNOBOL4  is  that  the  code  string  may  contain
    embedded  control  cards  (notably  -LIST  to cause listing of the
    code) and comments delimited by semicolons.










         MACRO SPITBOL V3.5
                                                   PAGE 22 - [5.13]
         Functions



 5.13  COLLECT -- Initiate Storage Regeneration
 5.13  COLLECT -- Initiate Storage Regeneration
 _____________ __ ________ _______ ____________

    COLLECT(INTEGER)

    The COLLECT function forces a garbage collection  which  retrieves
    unused  storage  and returns it to the block of available storage.
    The integer argument represents a minimum number of  words  to  be
    made  available.   If  this  amount of storage cannot be obtained,
    the COLLECT function fails.  On successful return, the  result  is
    the   number   of   words   actually   obtained.    Although   the
    implementation of COLLECT is the same as in  SNOBOL4,  the  values
    obtained  will  be  quite different due to different internal data
    representations.  Furthermore,  the  organization  of  SPITBOL  is
    such  that  forcing  garbage  collections to occur before they are
    required increases execution time.


 5.14  CONVERT * -- Convert Datatypes
 5.14  CONVERT * -- Convert Datatypes
 _____________ _ __ _______ _________

    CONVERT(ARGUMENT,STRING)

    The returned result is obtained by converting the  first  argument
    to  the type indicated by the string name of the datatype given as
    the second argument.  The permitted conversions are  described  in
    the  section  on  type  conversion.  Any conversions which are not
    permitted cause failure of the CONVERT call.  The second  argument
    may  be  'NUMERIC'  ,  in  which case the argument is converted to
    INTEGER or REAL according to its form.


 5.15  COPY * -- Copy Structure
 5.15  COPY * -- Copy Structure
 __________ _ __ ____ _________

    COPY(ARGUMENT)

    The COPY function returns a distinct copy of the object  presented
    as  its argument.  This is only useful for arrays, tables, buffers
    and program defined datatypes.  Note that SPITBOL permits  copying
    of TABLES unlike SNOBOL4.


















         MACRO SPITBOL V3.5
                                                   PAGE 23 - [5.16]
         Functions



 5.16  DATA -- Create Datatype
 5.16  DATA -- Create Datatype
 __________ __ ______ ________

    DATA(STRING)

    The  argument  to  DATA  is  a  prototype  for  a  program defined
    datatype in the form  of  a  function  call  with  arguments  e.g.
    DATA('CMPLX(RE,IM)').   The  function  name  in  the string is the
    name of the new datatype.  The argument names in  the  string  are
    the  names  of  field selector functions used to access the fields
    of  the  new  datatype.   Increased  efficiency  is  obtained   by
    avoiding   the   use   of  duplicate  field  names  for  different
    datatypes, although such multiple use is not forbidden.


 5.17  DATATYPE * -- Obtain Datatype
 5.17  DATATYPE * -- Obtain Datatype
 ______________ _ __ ______ ________

    DATATYPE(ARGUMENT)

    DATATYPE returns the formal identification of the datatype of  its
    argument.


 5.18  DATE * -- Obtain Date
 5.18  DATE * -- Obtain Date
 __________ _ __ ______ ____

    DATE()

    DATE  returns  a  string giving the current date and possibly also
    clock-on-the-wall-time (see Section 12.)


 5.19  DEFINE -- Define a Function
 5.19  DEFINE -- Define a Function
 ____________ __ ______ _ ________

    DEFINE(STRING) or DEFINE(STRING,NAME)

    The DEFINE function is used to create  program  defined  functions
    according  to  the prototype supplied as the argument.  The second
    argument if  supplied,  names  the  label  at  the  entry  to  the
    function.


 5.20  DETACH -- Detach I/O Association
 5.20  DETACH -- Detach I/O Association
 ____________ __ ______ ___ ___________

    DETACH(NAME)

    NAME  is the name of a variable which has previously been input or
    output associated   by appearing as the first  argument  of  INPUT
    or  OUTPUT.   DETACH  cancels  the association of the variable but
    does not affect the file to which it was associated.








         MACRO SPITBOL V3.5
                                                   PAGE 24 - [5.21]
         Functions



 5.21  DIFFER * -- Test for Arguments Differing
 5.21  DIFFER * -- Test for Arguments Differing
 ____________ _ __ ____ ___ _________ _________

    DIFFER(ARGUMENT,ARGUMENT)

    DIFFER is a predicate function which fails if  its  two  arguments
    are identical objects.  In SPITBOL
       DIFFER(.ABC,'ABC')
    succeeds  since  .ABC  is  a  NAME.  DIFFER and IDENT are the only
    functions in  which  the  different  implementation  of  the  name
    operator (unary dot) may give rise to problems.

    DIFFER also works on object of type BUFFER (see IDENT).


 5.22  DUMP * -- Dump Storage
 5.22  DUMP * -- Dump Storage
 __________ _ __ ____ _______

    DUMP(INTEGER)

    The  DUMP  function  causes  a  dump  of  current values to occur.
    After the dump is complete, execution  continues  unaffected  (the
    DUMP  function  returns  the  null  string). If the argument is 1,
    then the dump includes values of  all  non-constant  keywords  and
    all  non-null  natural  variables.  If the argument is 2, then the
    dump also  includes  values  of  all   non-null  array  and  table
    elements  and  non-null field values of program defined datatypes.
    The format of the latter  dump  is  self  explanatory  and  avoids
    printing  any  structure  more  than  once.  A call to DUMP with a
    zero argument is ignored.  This  allows  use  of  a  switch  value
    which  can  be turned on and off globally.  A call to DUMP with an
    argument greater than 2 produces a core dump in  the  same  format
    as  that produced by a system abnormal end and should therefore be
    used with discretion.


 5.23  DUPL * -- Duplicate String or Pattern
 5.23  DUPL * -- Duplicate String or Pattern
 __________ _ __ _________ ______ __ _______

    DUPL(STRING,INTEGER) or DUPL(PATTERN,INTEGER)

    DUPL returns a result obtained by duplicating the  first  argument
    the  number  of  times  indicated by the second.  A null string is
    returned if INTEGER is zero and statement failure occurs if it  is
    negative.


 5.24  EJECT * -- Eject to new page
 5.24  EJECT * -- Eject to new page
 ___________ _ __ _____ __ ___ ____

    EJECT(INTEGER) or EJECT(STRING)

    The  argument must have previously appeared as the second argument
    of a call of  OUTPUT to identify an output channel.  An  eject  to
    the  top  of  the  next page of the output file occurs.  A null or
    absent argument causes an eject on the standard output file.




         MACRO SPITBOL V3.5
                                                   PAGE 25 - [5.25]
         Functions



 5.25  ENDFILE * -- Close a File
 5.25  ENDFILE * -- Close a File
 _____________ _ __ _____ _ ____

    ENDFILE(INTEGER) or ENDFILE(STRING)

    The argument must have previously appeared as the second  argument
    of  a  call  of    INPUT  or  OUTPUT  to  identify an input/output
    channel.  The file attached to the channel is  closed,  associated
    storage  is  released  and  all variables associated with the file
    are detached.  Thus ENDFILE should be used only  when  no  further
    use  is  to  be  made of the file.  If the file is to be reread or
    rewritten,  use  REWIND  (if  the  implementation  supports   this
    function - see Section 12).


 5.26  EQ -- Test for Equal
 5.26  EQ -- Test for Equal
 ________ __ ____ ___ _____

    EQ(NUMERIC,NUMERIC)

    EQ  is  a  predicate  function which succeeds if its two arguments
    are equal.


 5.27  EVAL * -- Evaluate Expression
 5.27  EVAL * -- Evaluate Expression
 __________ _ __ ________ __________

    EVAL(EXPRESSION)

    EVAL returns the result of  evaluating  its  expression  argument.
    Note  that  a  string  can  be  converted  into  an  expression by
    compiling it into CODE.  Thus EVAL in SPITBOL is  compatible  with
    SNOBOL4  and  handles strings in the same way.  If an error occurs
    in evaluating the argument,  &ERRTEXT is set and EVAL  fails.   To
    avoid  such  errors  passing   unnoticed,  it  may  be well to use
    SETEXIT to intercept them,  or use a FAIL  goto,  or  evaluate  in
    -NOFAIL  mode.


 5.28  EXIT * -- Exit to Save Load Module or to JCL
 5.28  EXIT * -- Exit to Save Load Module or to JCL
 __________ _ __ ____ __ ____ ____ ______ __ __ ___

    EXIT(INTEGER) or EXIT(STRING)

    This  function  resembles that introduced by Gimpel in SITBOL.  It
    permits the saving of a core image at any point in  the  execution
    of  a  SPITBOL  program  to  produce  a   load module  and in some
    implementations it may be permissible to exit  from  SPITBOL  into
    another  program.   For  an  often  executed program use of a load
    module saves translation  and  initialisation  time.    A  garbage
    collection  is  performed  in  order to compact store before it is
    saved.  If initialising code is  label  free,  it  is  collectable
    after  it  has  been  executed,  giving  a further opportunity for
    economy.  The argument, N, may have the following values -






         MACRO SPITBOL V3.5
                                                   PAGE 26 - [5.28]
         Functions



     1.  N > 0   Save the whole core  image  (includes  all  the  pure
         SPITBOL  code  and  unused  stack space, so is wasteful). The
         resulting load  module  is  free-standing  and  is  not  made
         obsolete by changes to SPITBOL.

     2.  N  =  0   Interrupt program execution and return to JCL level
         so  that  user  can  issue  JCL  commands  and  then   resume
         execution if wished.  Does not save a core image.

     3.  N  <  0  Save the impure areas of memory only so that program
         can be restarted by loading pure SPITBOL  code  +  the  saved
         areas.   The  resulting load modules are considerably smaller
         than for the case N = 1, but are made obsolete  and  must  be
         regenerated as new versions of SPITBOL are released.

     4.  N  =  "string".   If  this feature is available, (see Section
         12), then SPITBOL execution is  terminated  and  the  program
         named by "string" is entered.


    EXIT  returns  the null string and may occur in the program at any
    position syntactically valid for a function  call.   No  mechanism
    is  provided  for automatic re-attaching of files which are in use
    at the time an EXIT call terminates a run.  Hence EXIT  calls  are
    most  commonly  placed  after  initialising  code  and  before the
    opening of input/output files for the program proper.  In  general
    no  standard input file is available when a load module is run, so
    references  to  variable  INPUT  will  fail  unless  it  has  been
    detached  or  a  file is explicitly associated to it.  The absence
    of a standard output file may create problems  (in  reporting  run
    time  errors  in  particular).  SPITBOL  implementors will usually
    provide  a  means  of  attaching  such  a  file  at   load   time.
    Alternatively a user may prefer to include a statement

         OUTPUT(.OUTPUT,,'FILENAME')

    Failing  these  possibilities,  either  a default output file name
    should be allocated or execution should end with a  special  error
    code  if  printing  to  a non-existent standard file is attempted.
    Section  12  gives  details  for  this  implementation.    Certain
    listing options may be selected by choice of the argument value.
      N  =  +1  or  -1. The output file will be given a heading and in
    some implementations it  may  be  possible  to  re-specify  record
    length  (only  to  a  smaller  value  than during compilation) and
    other options.
      N = +2 or -2. Heading omitted but  re-specification  of  options
    may be possible.
      N = +3 or -3. Heading omitted and no option re-specification.








         MACRO SPITBOL V3.5
                                                   PAGE 27 - [5.29]
         Functions



 5.29  FENCE * -- Generate Fenced Pattern
 5.29  FENCE * -- Generate Fenced Pattern
 ___________ _ __ ________ ______ _______

    FENCE(PATTERN)

    FENCE(pattern)  returns  a  pattern value which is the same as the
    given pattern, except that alternatives  within  the  pattern  are
    only  seen  by  the  scanner  when  it  is  moving  in the forward
    direction.    Pattern   backup   will    always    pass    through
                                                                   not
    FENCE(pattern).  Note that backup through FENCE(pattern) does  ___
    cause  the  match to abort, as does the &FENCE pattern, it is that
    alternatives within the Fenced pattern are not examined  when  the
    scanner  is  backing  up.  For  example, this pattern will match a
    string of text up to the next comma, or if there is no  comma,  to
    the  end  of  the  string.   The text is put in STR, and the match
    will only succeed if STR is non-null.
            P = FENCE( BREAK(',') | REM ) $ STR  *DIFFER(STR)
    Without the FENCE, failure of  the  DIFFER(STR)  would  cause  the
    scanner  to try the REM alternative regardless of whether or not a
    comma is found.

    FENCE is not available in all implementations.  See Section 12.


 5.30  FIELD * -- Get Field Name
 5.30  FIELD * -- Get Field Name
 ___________ _ __ ___ _____ ____

    FIELD(NAME,INTEGER)

    FIELD returns the NAME  of  the  selected  field  of  the  program
    defined  datatype whose name is the first argument.  If the second
    argument is out of range (less than 1, or greater than the  number
    of fields), the FIELD function fails.


 5.31  GE -- Test for Greater or Equal
 5.31  GE -- Test for Greater or Equal
 ________ __ ____ ___ _______ __ _____

    GE(NUMERIC,NUMERIC)

    GE  is  a  predicate function which succeeds if the first argument
    is greater than or equal to the second.


 5.32  GT -- Test for Greater
 5.32  GT -- Test for Greater
 ________ __ ____ ___ _______

    GT(NUMERIC,NUMERIC)

    GT is a predicate function which succeeds if  the  first  argument
    is greater than the second.









         MACRO SPITBOL V3.5
                                                   PAGE 28 - [5.33]
         Functions

 5.33  HOST * -- Obtain Information about Host Computer
 5.33  HOST * -- Obtain Information about Host Computer
 __________ _ __ ______ ___________ _____ ____ ________

    HOST(ARGUMENT,ARGUMENT,ARGUMENT)

    SPITBOL  runs on different mainframes with differing file formats,
    file naming conventions etc.  which makes  it  desirable  in  some
    programs  to  know  on  what machine the program is running.  HOST
    called with null arguments returns a string of the form
       "<COMPUTER NAME>:<OPERATING SYSTEM NAME>:<SITE NAME>"
    which  satisfies  most  requirements  of  this   kind.    At   the
    discretion  of  the SPITBOL implementor, non-null arguments may be
    used to specify other features specific to the host.  See  Section
    12 for details.


 5.34  IDENT * -- Test for Identical
 5.34  IDENT * -- Test for Identical
 ___________ _ __ ____ ___ _________

    IDENT(ARGUMENT,ARGUMENT)

    IDENT  is a predicate function which succeeds if its two arguments
    are identical.  In SPITBOL,
       IDENT(.ABC,'ABC')
    fails since .ABC is a NAME in SPITBOL.  Also, two values  of  type
    BUFFER  will  be IDENTical if and only if they are the same buffer
    object.  Apart from this, IDENT is compatible with SNOBOL4.

































         MACRO SPITBOL V3.5
                                                   PAGE 29 - [5.35]
         Functions



 5.35  INPUT * -- Set Input Association
 5.35  INPUT * -- Set Input Association
 ___________ _ __ ___ _____ ___________

    INPUT(NAME,INTEGER,STRING) or INPUT(NAME,STRING,STRING)

    Rather than give a separate description of OUTPUT which  would  be
    almost  exactly  parallel with that for INPUT, a joint description
    is given  here.   Some  machine  dependency  is  likely  in  these
    functions   -   see  Section  12  for  details  relating  to  this
    implementation.

    The first argument is the name  of  a  variable  which  is  to  be
    input/output  associated  and  is required, whereas the others are
    optional.  The second argument  identifies  a  channel  which  may
    subsequently   be  used  to  refer  to  the  association.   It  is
    recommended that,  as  in  SNOBOL4,  the  second  argument  be  an
    integer  but  the  use  of  a more general string is not excluded.
    Different  channel  identifiers   are   required   for   accessing
    different  files.   The  second  argument  may be omitted in which
    case association is to the standard input  or  output  file.   The
    chief  divergence between SNOBOL4 and SPITBOL is in the use of the
    third argument, where SPITBOL permits the very useful  feature  of
    dynamic  file  assignment.  The general form of the third argument
    is a string

        <f>,R<r>,C<c>,I<i>,X<x>...      where

    <f> is an optional file name which is placed first;

    ,   is a delimiter used to mark  off  remaining  items  which  are
        optional and may occur in any order;

    <r> is  the  maximum  record  length  in  characters  for the file
        (default values are documented in Section 12);

    <c> is a carriage control  character  or  string  needed  in  some
        implementations;

    <i> is   additional   channel   identification   needed   in  some
        implementations  in  the  absence  of  <f>  to  associate  the
        variable  with  a file attached by job control commands at the
        start of a SPITBOL run;

    <x> symbolises   additional   fields    needed    in    particular
        implementations.

    If  <f>  is  non-null,  when  the  statement is obeyed file <f> is
    opened and assigned to the channel  corresponding  to  the  second
    argument  and  normally  this  assignment should be performed once
    only.  If several variables are  to  be  associated  to  the  same
    channel,  <f>  should  be  omitted  from  all but the first of the
    INPUT/OUTPUT calls.





         MACRO SPITBOL V3.5
                                                   PAGE 30 - [5.35]
         Functions

    Alternatively <f> can be omitted from all INPUT/OUTPUT  statements
    relating  to  a  channel  provided  the  necessary assignments are
    performed  by  suitable  job  control  commands  before  execution
    starts.  Thus -
       INPUT(.IN,2,'INFILE');    OUTPUT(.OU,7,'OUF')
       INPUT(.IN,2);             OUTPUT(.OU,7)
    will  have the same effect if in the latter case INFILE , OUF have
    been suitably attached by JCL commands.  A call in  which  <f>  is
    omitted  but  some  other  item  is present in the third argument,
    alters the association of the channel  in  respect  of  that  item
    only.   E.g.  INPUT(.X,,',R72')  sets the maximum record length to
    72 characters.

    Error  messages  are  given  for   syntactically   invalid   third
    arguments  but  in  the  case  where  the  file corresponding to a
    syntactically valid file name  cannot  be  found,  then  statement
    failure  occurs  and  may  be  tested  for  in  the usual way by a
    conditional goto.  For the sake of portability and  compatibility,
    programmers  are  strongly  urged  to use integer second arguments
    (as in SNOBOL4) and short alphanumeric file  names  in  the  third
    argument.   Further  details, particular to an implementation, are
    given in Section 12.


 5.36  INSERT * -- Insert string in buffer
 5.36  INSERT * -- Insert string in buffer
 ____________ _ __ ______ ______ __ ______

    INSERT(BUFFER,INTEGER,INTEGER,STRING)

    The function INSERT is defined to return null, but  has  the  side
    effect  of  replacing  characters (pos, pos+1, ..., pos+length) in
    the designated BUFFER with the characters  of  STRING.   "Pos"  is
    given  by  the first INTEGER argument, and "length" by the second.
    Note that if "length"  is  not  equal  to  SIZE(string)  then  the
    trailing  contents  of  the  buffer  following  the  section to be
    replaced will have  to  be  moved  by  INSERT  to  accomodate  the
    STRING.

    If  the  inserted  string  cannot  fit,  or if the insertion would
    leave a 'gap' of undefined characters  in  the  buffer,  then  the
    INSERT call fails.

    If  the first argument is not a buffer type, then an error occurs.
    (No conversion is attempted since it would be pointless).















         MACRO SPITBOL V3.5
                                                   PAGE 31 - [5.37]
         Functions



 5.37  INTEGER * -- Test for Integer
 5.37  INTEGER * -- Test for Integer
 _____________ _ __ ____ ___ _______

    INTEGER(NUMERIC)

    INTEGER is a predicate function which succeeds if its argument  is
    integral.   It  fails  if  the  argument  cannot  be  converted to
    numeric or has a non-integral value.


 5.38  ITEM -- Select Array or Table Element
 5.38  ITEM -- Select Array or Table Element
 __________ __ ______ _____ __ _____ _______

    ITEM(ARRAY,INTEGER,INTEGER,....) or  ITEM(TABLE,ARGUMENT)

    ITEM returns the selected array or table element  by  name.   Note
    that  the use of ITEM is never necessary in SPITBOL because of the
    extended syntax for array references.


 5.39  LE -- Test for Less or Equal
 5.39  LE -- Test for Less or Equal
 ________ __ ____ ___ ____ __ _____

    LE(NUMERIC,NUMERIC)

    LE is a predicate function which succeeds if  its  first  argument
    is less than or equal to the second argument.
































         MACRO SPITBOL V3.5
                                                   PAGE 32 - [5.40]
         Functions



 5.40  LEN -- Generate Specified Length Pattern
 5.40  LEN -- Generate Specified Length Pattern
 _________ __ ________ _________ ______ _______

    LEN(INTEGER) or LEN(EXPRESSION)

    LEN   generates  a  pattern  which  will  match  any  sequence  of
    characters of length  given  by  the  argument  which  must  be  a
    non-negative  integer.   If  the  argument is an expression, it is
    evaluated during pattern matching and must  yield  a  non-negative
    integer.


 5.41  LEQ * -- Test for Lexically Equal
 5.41  LEQ * -- Test for Lexically Equal
 _________ _ __ ____ ___ _________ _____

    LEQ(STRING,STRING)

    LEQ  is  a predicate which succeeds if its arguments are lexically
    equal.   LEQ  differs  from  IDENT  in  that  its  arguments   are
    converted to strings so that both the following succeed
       LEQ(10,'10')             LEQ(.ABC,'ABC')


 5.42  LGE * -- Test for Lexically Greater or Equal
 5.42  LGE * -- Test for Lexically Greater or Equal
 _________ _ __ ____ ___ _________ _______ __ _____

    LGE(STRING,STRING)

    LGE  is  a  predicate  which  succeeds  if  the  first argument is
    lexically greater than or equal to the second argument.


 5.43  LGT * -- Test for Lexically Greater
 5.43  LGT * -- Test for Lexically Greater
 _________ _ __ ____ ___ _________ _______

    LGT(STRING,STRING)

    LGT is a  predicate  which  succeeds  if  the  first  argument  is
    lexically greater than the second argument.


 5.44  LLE * -- Test for Lexically Less or Equal
 5.44  LLE * -- Test for Lexically Less or Equal
 _________ _ __ ____ ___ _________ ____ __ _____

    LLE(STRING,STRING)

    LLE  is  a  predicate  which  succeeds  if  the  first argument is
    lexically less than or equal to the second argument.













         MACRO SPITBOL V3.5
                                                   PAGE 33 - [5.45]
         Functions



 5.45  LLT * -- Test for Lexically Less
 5.45  LLT * -- Test for Lexically Less
 _________ _ __ ____ ___ _________ ____

    LLT(STRING,STRING)

    LLT is a  predicate  which  succeeds  if  the  first  argument  is
    lexically less than the second argument.


 5.46  LNE * -- Test for Lexically Not Equal
 5.46  LNE * -- Test for Lexically Not Equal
 _________ _ __ ____ ___ _________ ___ _____

    LNE(STRING,STRING)

    LNE  is  a predicate which succeeds if its arguments are lexically
    unequal.  LNE differs  from  DIFFER  in  that  its  arguments  are
    converted to strings so that both the following fail
       LNE(10,'10')                 LNE(.ABC,'ABC')


 5.47  LOAD -- Load External Function
 5.47  LOAD -- Load External Function
 __________ __ ____ ________ ________

    LOAD(STRING,STRING)

    LOAD  is  used  to  make  external  functions available to SPITBOL
    programs.  The first STRING is a prototype of the form:

       "function-name(type,type,...)result-type"

    The  indicated  types  can  be  any  of  "INTEGER",   "REAL"   (if
    implemented)  or  "STRING" in which case the value is converted to
    the designated type before being passed  to  (returned  from)  the
    external  function.  Any other name for a type leaves the value in
    an unconverted form.

    The second argument to LOAD is a library name where  the  function
    is to be found.

    LOAD  is  highly  implementation  specific and is not available in
    all implementations.  See Section 12 for details.


 5.48  LOCAL * -- Get Name of Local
 5.48  LOCAL * -- Get Name of Local
 ___________ _ __ ___ ____ __ _____

    LOCAL(NAME,INTEGER)

    The value returned is the NAME  of  the  indicated  local  of  the
    function  whose  name is given by the first argument.  LOCAL fails
    if the second argument is out of range (less than  1,  or  greater
    than the number of locals).








         MACRO SPITBOL V3.5
                                                   PAGE 34 - [5.49]
         Functions



 5.49  LPAD * -- Left Pad
 5.49  LPAD * -- Left Pad
 __________ _ __ ____ ___

    LPAD(STRING,INTEGER,STRING)

    LPAD  returns  the  result  obtained  by  padding  out  the  first
    argument on the  left  to  the  length  specified  by  the  second
    argument,  using  the  pad character supplied by the one character
    string third argument.  If the third argument is null or  omitted,
    a  blank  is  used as the pad character.  If the first argument is
    already long enough or too long, it is  returned  unchanged,  this
    always  being the case if the second argument is negative or zero.
    LPAD is useful for constructing columnar output.


 5.50  LT -- Test for Less
 5.50  LT -- Test for Less
 ________ __ ____ ___ ____

    LT(NUMERIC,NUMERIC)

    LT is a predicate function which succeeds if  its  first  argument
    is less than the second.


 5.51  NE -- Test for Not Equal
 5.51  NE -- Test for Not Equal
 ________ __ ____ ___ ___ _____

    NE(NUMERIC,NUMERIC)

    NE  is  a  predicate  function which succeeds if its two arguments
    are unequal.


 5.52  NOTANY -- Build Character Select Pattern
 5.52  NOTANY -- Build Character Select Pattern
 ____________ __ _____ _________ ______ _______

    NOTANY(STRING) or NOTANY(EXPRESSION)

    NOTANY returns a pattern which will match any single character  in
    the  subject  string,  provided  it  does  not occur in the string
    argument.  A null argument is not permitted.  If the  argument  is
    an  expression,  it  is evaluated during pattern matching and must
    yield a non-null string.

















         MACRO SPITBOL V3.5
                                                   PAGE 35 - [5.53]
         Functions



 5.53  OPSYN * -- Equate Functions and Operators
 5.53  OPSYN * -- Equate Functions and Operators
 ___________ _ __ ______ _________ ___ _________

    OPSYN(NAME,NAME,INTEGER)

    In contrast with SNOBOL4, the second argument must  always  be  an
    already  defined  function name.  If the third argument is omitted
    or zero, the first argument must  be  a  function  name.   If  the
    third  argument  is 1 or 2 , the first argument must be resp.  one
    of the undefined unary or binary  operators  (sec  4.1).   In  all
    three  cases,  subsequent  use  of  the  first argument results in
    calling of the function corresponding to the second argument  with
    the  appropriate  arguments.   Note that names of system functions
    or operators cannot appear as the first argument.


 5.54  OUTPUT * -- Set Output Association
 5.54  OUTPUT * -- Set Output Association
 ____________ _ __ ___ ______ ___________

    OUTPUT(NAME,INTEGER,STRING) or OUTPUT(NAME,STRING,STRING)

    This function has  similar  arguments  and  behaves  similarly  to
    INPUT, which should be consulted for a detailed description (2).


 5.55  POS -- Define Positioning Pattern
 5.55  POS -- Define Positioning Pattern
 _________ __ ______ ___________ _______

    POS(INTEGER) or POS(EXPRESSION)

    POS  returns  a pattern which matches the null string provided the
    value  of  the  cursor  is  equal  to  the  non-negative   integer
    argument.   If  the  argument  is  an  expression, it is evaluated
    during pattern matching and must yield a non-negative integer.

























         MACRO SPITBOL V3.5
                                                   PAGE 36 - [5.56]
         Functions



 5.56  PROTOTYPE -- Retrieve Prototype
 5.56  PROTOTYPE -- Retrieve Prototype
 _______________ __ ________ _________

    PROTOTYPE(ARRAY) or PROTOTYPE(TABLE)

    PROTOTYPE returns the first argument used in the ARRAY,  TABLE  or
    BUFFER function call which created the argument.


 5.57  REMDR -- Remainder
 5.57  REMDR -- Remainder
 ___________ __ _________

    REMDR(INTEGER,INTEGER)

    REMDR  returns the remainder of dividing the first argument by the
    second.  This has the same sign as the first argument.


 5.58  REPLACE -- Translate Characters
 5.58  REPLACE -- Translate Characters
 _____________ __ _________ __________

    REPLACE(STRING,STRING,STRING)

    REPLACE  returns  the  result  of  applying  the   transformations
    represented  by  the  second  and  third  arguments  to  the first
    argument.  REPLACE fails if the second  and  third  arguments  are
    unequal in length or null.


 5.59  REVERSE * -- Reverse String
 5.59  REVERSE * -- Reverse String
 _____________ _ __ _______ ______

    REVERSE(STRING)

    REVERSE returns the result of reversing its argument.  Thus
       REVERSE('ABC')            produces          'CBA'


 5.60  REWIND -- Reposition File
 5.60  REWIND -- Reposition File
 ____________ __ __________ ____

    REWIND(INTEGER) or REWIND(STRING)

    The  argument must have previously appeared as the second argument
    of a call of   INPUT or OUTPUT.  The file attached to the  channel
    is  repositioned  so  that the next read or write operation starts
    at the first record of the file.   Existing  associations  to  the
    file   are   unaffected.   REWIND  may  not  be  provided  in  all
    implementations - see Section 12.












         MACRO SPITBOL V3.5
                                                   PAGE 37 - [5.61]
         Functions



 5.61  RPAD * -- Right Pad
 5.61  RPAD * -- Right Pad
 __________ _ __ _____ ___

    RPAD(STRING,INTEGER,STRING)

    RPAD  returns  the  result  obtained  by  padding  out  the  first
    argument  on  the  right  to  the  length  specified by the second
    argument, using the pad character supplied by  the  one  character
    string  third argument.  If the third argument is null or omitted,
    a blank is used as the pad character.  If the  first  argument  is
    already  long  enough  or too long, it is returned unchanged, this
    always being the case if the second argument is negative or  zero.
    RPAD is useful for constructing columnar output.


 5.62  RPOS -- Define Positioning Pattern
 5.62  RPOS -- Define Positioning Pattern
 __________ __ ______ ___________ _______

    RPOS(INTEGER) or RPOS(EXPRESSION)

    RPOS  returns a pattern which matches the null string provided the
    indicated number  of  characters  remain  to  be  matched  in  the
    subject   string.   If  the  argument  is  an  expression,  it  is
    evaluated during pattern matching and must  yield  a  non-negative
    integer.


 5.63  RSORT -- Reverse Sort
 5.63  RSORT -- Reverse Sort
 ___________ __ _______ ____

    RSORT(ARRAY or TABLE,INTEGER or NAME)

    Performs  a sort in descending (reverse) order of key on the first
    argument.  Consult SORT for details.


 5.64  RTAB -- Create Tabbing Pattern
 5.64  RTAB -- Create Tabbing Pattern
 __________ __ ______ _______ _______

    RTAB(INTEGER) or RTAB(EXPRESSION)

    RTAB returns a pattern which matches from the current location  up
    to  the  point  where the indicated number of characters remain to
    be matched.  The argument must be a non-negative integer.  If  the
    argument   is  an  expression,  it  is  evaluated  during  pattern
    matching and must yield a non-negative integer.














         MACRO SPITBOL V3.5
                                                   PAGE 38 - [5.65]
         Functions



 5.65  SETEXIT * -- Set Error Exit
 5.65  SETEXIT * -- Set Error Exit
 _____________ _ __ ___ _____ ____

    SETEXIT(NAME) or SETEXIT()

    SETEXIT allows interception of  execution  errors,  including  any
    detected  during calls of CODE and EVAL .  The argument is a label
    to  which  control  is  passed  if  a  subsequent  error   occurs,
    providing  that  the  value  of the keyword &ERRLIMIT is non-zero.
    The value of &ERRLIMIT is decremented when the error trap  occurs.
    A  SETEXIT  call with a null argument causes cancellation of error
    intercepts.  A subsequent error will terminate execution as  usual
    with  an  error  message.   The  result returned by SETEXIT is the
    previous intercept setting (i.e.  a  label  name  or  null  if  no
    intercept  was  set).  This  can  be  used to save and restore the
    SETEXIT conditions recursively.  The  error  routine  may  inspect
    the  error code and text   in &ERRTYPE and &ERRTEXT , and take one
    of the actions -


     1.  Terminate execution by transferring  to  the  special  system
         label,   ABORT  .   This causes error processing to resume as
         though no error intercept had been set.

     2.  Branch to the special system label CONTINUE  .   This  causes
         execution  to  resume by branching to the failure exit of the
         statement in error.

     3.  Continue execution elsewhere by branching to another  section
         of  the  program.   If  the error occurred inside a function,
         execution is still 'down a level'.

     4.  Branch  to  label  RETURN  ,  FRETURN  ,   NRETURN   provided
         &FNCLEVEL  is  non-zero.   This  avoids possible difficulties
         with 3.

    The occurrence of  an  error  cancels  the  intercept.   An  error
    routine  must  reissue  a SETEXIT call if error interception is to
    continue.


















         MACRO SPITBOL V3.5
                                                   PAGE 39 - [5.66]
         Functions



 5.66  SIZE -- Get String or Buffer Size
 5.66  SIZE -- Get String or Buffer Size
 __________ __ ___ ______ __ ______ ____

    SIZE(STRING or BUFFER)

    SIZE returns an  integer  count  of  the  defined  length  of  its
    argument.


 5.67  SORT * -- Sort
 5.67  SORT * -- Sort
 __________ _ __ ____

    SORT(ARRAY or TABLE,INTEGER or NAME)

    This  routine  sorts  the  contents  of  the ARRAY or  TABLE first
    argument in ascending order of key.  It differs from   RSORT  only
    in  that  the  latter  sorts  in  descending order of key.  If the
    first  argument  is  an  ARRAY  it  must  be  of   one   dimension
    (subsequently  referred  to  as  a  VECTOR ), or two dimensions (a
    MATRIX ).  Where the argument is a TABLE  ,  it  is  converted  by
    SORT  to an array of 2 dimensions, the first column containing the
    reference or key item and the second the  value,  in  exactly  the
    same  way as  results from a call to CONVERT . This is then sorted
    just as any other two dimensional array.  In all cases, the  items
    to  be  sorted  may  be  of mixed dataypes and the sorting is done
    primarily on datatype of key, using lexical ordering  of  datatype
    names,  and secondarily on value.  Thus items of similar datatypes
    become contiguously grouped in sorted order.  The  only  deviation
    from  this  rule  is that mixed  INTEGER and REAL (NUMERIC ) items
    are sorted as a single group and strings which  can  be  converted
    to  NUMERIC  are  compared  numerically  against NUMERIC keys.  In
    particular the NULL string is regarded as 0 or 0.0  in  comparison
    with  them.   Note  that  compared  numerically,  100  >  "20" but
    compared lexically "100" < "20".  A second argument, if  specified
    for  an  ARRAY  or  TABLE,  must  be an integer corresponding to a
    column index (1 or 2 for a TABLE). The keys are  then  taken  from
    this  column,  and  during the sort, complete rows are permuted to
    the order determined by key values.  If  the  second  argument  is
    omitted,  the  default  column  used  is that corresponding to the
    smallest  value  of  the   second   index   (e.g   -2   in   M   =
    ARRAY('10,-2:+2')).   The  sorting  method  used  is  stable  with
    respect to non-interchange of items having  equal  keys,  so  that
    repeated  sorting  on  successive  columns may be used to effect a
    total ordering.

    In the case of a VECTOR, the optional second argument may  be  the
    NAME   of a field of a programmer defined datatype created by DATA
    . In this case, if any of the values in the  VECTOR  are  of  this
    type,  the  contents  of the field corresponding to NAME  are used
    as the key.  If the second argument is  omitted,  the  sorting  is
    carried out by using the values the VECTOR contains as keys.







         MACRO SPITBOL V3.5
                                                   PAGE 40 - [5.67]
         Functions

    The  sort  method  used is Heapsort (see for instance Horowitz and
    Sahni, "Fundamentals of Data Structures",  Pitman  1977)  modified
    so  that  no  interchanging of equal keys occurs.  It is efficient
    in usage of both space and time, the time taken to  sort  N  items
    being  proportional  to  N * log(N).   The  aggregate  obtained is
    always a sorted copy of the original.  No extra store is used  for
    the  sort  except  in  the case of a TABLE, where space sufficient
    for conversion to an ARRAY is taken.  Examples of calls are
    *  Assume USERS is an ARRAY of programmer defined datatypes
    *  of the type created by       DATA('COMPUSER(NAME,TYME)')
          SUS = RSORT(SORT(USERS,.NAME),.TYME)
    which creates an array sorted  primarily  by  tyme  in  descending
    order  and secondarily by name in alphabetic order.
          MATX = SORT(SORT(SORT(MATX,3),2))
    which sorts MATX respectively by columns 3, 2, 1.
          V = SORT(V)
    which sorts V  by its elements.


 5.68  SPAN -- Create Spanning Pattern
 5.68  SPAN -- Create Spanning Pattern
 __________ __ ______ ________ _______

    SPAN(STRING) or SPAN(EXPRESSION)

    SPAN  creates  a  pattern  which, starting from the current cursor
    position, will match the longest non-null sequence  of  characters
    drawn  from  the  character  set  contained  in the argument.  The
    argument is not permitted to be  null.   If  the  argument  is  an
    expression,  it  is  evaluated  during  pattern  matching and must
    yield a non-null string.


 5.69  STOPTR * -- Stop Trace
 5.69  STOPTR * -- Stop Trace
 ____________ _ __ ____ _____

    STOPTR(NAME,STRING)

    STOPTR  terminates  tracing  for  the  name  given  by  the  first
    argument.   The  second  argument  designates the respect in which
    the trace is to be stopped and consists  of  one  of  the  strings
    listed under the description of TRACE.



















         MACRO SPITBOL V3.5
                                                   PAGE 41 - [5.70]
         Functions



 5.70  SUBSTR * -- Extract Substring
 5.70  SUBSTR * -- Extract Substring
 ____________ _ __ _______ _________

    SUBSTR(STRING or BUFFER,INTEGER,INTEGER)

    Extracts   a  substring  from  the  first  argument.   The  second
    argument specifies the first character (1 = start of  string)  and
    the  third  argument  gives  the number of characters.  An omitted
    third argument specifies all remaining characters of  the  string.
    Improper substrings cause statement failure.

    Note  that  no  conversion  to  string  is needed in the case of a
    BUFFER argument, the substring  is  extracted  directly  from  the
    buffer making SUBSTR quite efficient when working with buffers.


 5.71  TAB -- Create Tabbing Pattern
 5.71  TAB -- Create Tabbing Pattern
 _________ __ ______ _______ _______

    TAB(INTEGER) or TAB(EXPRESSION)

    TAB  returns  a pattern which matches from the current location up
    to the point where the indicated number of  characters  have  been
    matched.   The  argument  must  be a non-negative integer.  If the
    argument  is  an  expression,  it  is  evaluated  during   pattern
    matching and must yield a non-negative integer.


 5.72  TABLE * -- Create Table
 5.72  TABLE * -- Create Table
 ___________ _ __ ______ _____

    TABLE(INTEGER,,ARG)

    The  TABLE  function  creates  an associative table as in SNOBOL4.
    However in SPITBOL, the table is implemented internally  using  an
    efficient   hashing algorithm.  The integer argument is the number
    of hash headers used.  If it is omitted, 11 is  used  by  default.
    If  N  is  the number of entries in the table, and H is the number
    of hash headers, the average number of probes  to  find  an  entry
    rises  from  about 1.0 for small N, to N/2H if N is large compared
    with H.  Since the overhead for hash headers is small compared  to
    the  size of a table element, a useful guide is to use as argument
    an estimate of the number of entries to be stored  in  the  table.
    Any  second  argument  (permitted  for  SNOBOL4  compatibility) is
    always ignored.  The optional third argument is a value  which  it
    is  desired  to  have  returned  instead of the default NULL, when
    table look-up is performed using a key which has not been  entered
    into  the  TABLE.   This  is similar in effect to the usage of the
    second argument of ARRAY.  In contrast  with  SNOBOL4,  where  the
    first  reference  to an entry automatically creates a table entry,
    in  SPITBOL  an  entry  is  inserted  in  a  table  only  when  an
    assignment   is   explicitly  made.   Thus  table  look-up  for  a
    currently missing key does not create an entry for  that  key  and
    may be freely used.





         MACRO SPITBOL V3.5
                                                   PAGE 42 - [5.73]
         Functions



 5.73  TIME -- Get Timer Value
 5.73  TIME -- Get Timer Value
 __________ __ ___ _____ _____

    TIME()

    TIME  returns the integer number of milliseconds of processor time
    since the start of execution.


 5.74  TRACE * -- Initiate Trace
 5.74  TRACE * -- Initiate Trace
 ___________ _ __ ________ _____


    The TRACE function, which is quite invaluable as a debugging  aid,
    initiates  a  trace  of  the item whose name is given by the first
    argument.  The second argument specifies the sense  of  the  trace
    as follows -


            'A' or 'ACCESS'               access
            'V' or 'VALUE' or null        value
            'K' or 'KEYWORD'              keyword
            'L' or 'LABEL'                label
            'F' or 'FUNCTION'             function call and return
            'C' or 'CALL'                 function call
            'R' or 'RETURN'               function return

    The  access trace mode introduced in SPITBOL consists of producing
    trace output each  time  an  access  traced  item  is  referenced.
    Attempts  to trace a function before a DEFINE statement for it has
    been executed will fail.  If &STLIMIT  is  negative,  STCOUNT  may
    not  be  traced.  To give a visual impression of depth of nesting,
    a letter "I" is included in the trace output for  each  additional
    level of function call.


 5.75  TRIM -- Trim Trailing Blanks
 5.75  TRIM -- Trim Trailing Blanks
 __________ __ ____ ________ ______

    TRIM(STRING)

    TRIM  returns  the  result  of  trimming  trailing blanks from the
    argument string.


 5.76  UNLOAD * -- Unload Function
 5.76  UNLOAD * -- Unload Function
 ____________ _ __ ______ ________

    UNLOAD(NAME)

    NAME is the name of an external function which is to be  unloaded.
    The  names  of  user defined functions may also appear in calls to
    UNLOAD in which case the function becomes undefined.







         MACRO SPITBOL V3.5
                                                   PAGE 43 - [6]
         Keywords



                            *---------------*
                              [6]  Keywords
                            | [6]  Keywords |
                            *---------------*

    The following is a list of the keywords  implemented  in  SPITBOL.
    The  notation  (R)  after  the name indicates that the keyword may
    only be read so that attempts to assign to it will  result  in  an
    error.   With  the  exception  of  &STLIMIT,  values  assigned  to
    numeric keywords  must be in the range 0 to MXLEN .


     1.  &ABEND : Normally set to zero.  If it is set  to  a  non-zero
         value  at  the  end of execution,  an ABEND dump may be given
         if supported by the implementation.

     2.  &ABORT (R) :  Contains the pattern ABORT .

     3.  &ALPHABET (R) : Contains the full character set of  the  host
         computer in natural collating sequence.

     4.  &ANCHOR  :  Set to one for anchored pattern matching mode and
         to zero for  unanchored  mode.   Initial  value  is  zero  to
         correspond  with  SNOBOL4.   However  unanchored  matching is
         needed only rarely and is liable  to  be  very  expensive  in
         runtime  unless  carefully  used,  so  in  general it is good
         practice to start programs with the statement
             &ANCHOR = 1

     5.  &ARB (R) :  Contains the pattern ARB .

     6.  &BAL (R) :  Contains the pattern BAL .

     7.  &CODE  :  Initially  zero.   In  implementations  where   the
         concept   makes  sense,  values  found  to  be  in  &CODE  at
         termination are used as ending codes (Section 12).

     8.  &DUMP : The standard value is zero.  If the value is zero  at
         the  end  of  execution,  then  no symbolic dump is given.  A
         value of one gives a dump including values  of  keywords  and
         natural  variables.   If  the value is two, the dump includes
         non-null array, table and program defined  datatype  elements
         as  well.  The dump format is self explanatory and deals with
         the case of branched  structures  including  circular  lists.
         If  the  value exceeds two, an  ABEND dump may be produced as
         well if the implementation supports this.











         MACRO SPITBOL V3.5
                                                   PAGE 44 - [6]
         Keywords


     9.  &ERRLIMIT :  The  maximum  number  of  errors  which  can  be
         trapped  using  the  SETEXIT function. &ERRLIMIT is initially
         zero and when set non-zero by assignment, it  is  decremented
         each  time  a  SETEXIT trap occurs.  SETEXIT has no effect on
         normal error processing if &ERRLIMIT is zero.

    10.  &ERRTEXT : If an  execution  error  occurs,  then  the  error
         message  text  corresponding to the error code is stored as a
         string in &ERRTEXT.  It is possible to  assign  a  string  to
         &ERRTEXT  which  is then used in a subsequent error report if
         &ERRTYPE is assigned  a  value  out  of  the  range  used  by
         SPITBOL  itself.  Such an assignment does not signal an error
         as is the case with &ERRTYPE.

    11.  &ERRTYPE : If an execution error occurs, then the error  code
         is  stored  as  an  integer  in  &ERRTYPE.  &ERRTYPE  may  be
         assigned  a  value  in  which  case  an  immediate  error  is
         signalled.   This may be useful in reporting program detected
         errors.  Error codes used by  SPITBOL  all  fall  below  300.
         Values  in  &ERRTEXT and &ERRTYPE are useful in SETEXIT error
         intercept routines.

    12.  &FAIL (R) :  Contains the pattern FAIL .

    13.  &FENCE (R) :  Contains the pattern FENCE .

    14.  &FNCLEVEL (R) : Contains the current function nesting  level.

    15.  &FTRACE  :  The  standard  value  is  zero.   If  it  is  set
         positive, each function  call  and  return  is  traced.   The
         value  of &FTRACE is decremented  for each trace line printed
         until the value reaches zero again.

    16.  &INPUT : Set to one for normal  input  (standard  value).  If
         set to zero, all input associations are ignored.

    17.  &LASTNO  (R)  :  Contains  the  number  of the last statement
         executed.

    18.  &MAXLNGTH : Contains the  maximum  permitted  string  length.
         At  the  start  of execution its value is that given by MXLEN
         (Section 12). It may be set to  smaller values but not  to  a
         value exceeding MXLEN .

    19.  &OUTPUT  :  Set to one for normal output (standard value). If
         set to zero, all output associations are ignored.

    20.  &PROFILE :  When  set  to  zero  (the   default),   statement
         profiling  is disabled.  When set to one, statement profiling
         is enabled.  When statement  profiling  is  enabled,  SPITBOL
         keeps  track  of   the  count of each statement executed, and
         the  amount  of  central  processor  time   accumulated   for
         executing  each  statement.   If  profiling is enabled at any
         time during an execution, the accumulated profile is  printed
         on  the  standard output channel when the program terminates.


         MACRO SPITBOL V3.5
                                                   PAGE 45 - [6]
         Keywords

         The profile also indicates the  average  time  for  executing
         each statement.

         If  &PROFILE  is  set  to  two,  it  acts  as in the case for
         &PROFILE=1, except that function calls  are  charged  to  the
         statements which contain them.

         &PROFILE  is  not  available  in all implementations, and for
         some machines where processor  time  is  not  available,  the
         time  indicated may be wall time.  In all cases, the enabling
         of the profile adds additional time to the execution, so  the
         times indicated should be viewed as relative.

    21.  &REM (R) :  Contains the pattern REM .

    22.  &RTNTYPE  (R)  :  Contains  'RETURN',  'FRETURN' or 'NRETURN'
         depending on  the  type  of  function  return  most  recently
         executed.

    23.  &STCOUNT  :  Contains  a  count  of  the number of statements
         executed unless &STLIMIT is negative.

    24.  &STLIMIT : The maximum number of statements permitted  to  be
         executed.    Initially   50000  and  with  an  implementation
         dependent maximum (Section 12)  beyond  which  it  cannot  be
         set.    To  inhibit  this  check  on  numbers  of  statements
         executed, assign a negative value to the keyword.  Thus
                 &STLIMIT = -1
         is equivalent to &STLIMIT = "infinity". This will  result  in
         a  marginal  execution  speed  up  since  count  updating and
         checking is omitted.  The value of  &STCOUNT  remains  frozen
         at  the  value reached when &STLIMIT was set negative and the
         number of statements executed is omitted from  the  execution
         statistics.   Tracing  of  STCOUNT becomes no longer possible
         since its value is not incremented.

    25.  &STNO (R) : The number of the current statement.

    26.  &SUCCEED (R) :  Contains the pattern SUCCEED .

    27.  &TRACE : Initial value of zero suppresses trace  output.   If
         assigned  a positive value, trace output is generated and for
         each line printed &TRACE is  decremented  by  one  until  the
         value reaches zero again.

    28.  &TRIM  :  Set  to zero for normal input mode (default value).
         If  the  value  is  set  non-zero,  all  input  records   are
         automatically  trimmed  (trailing  blanks  are removed).  For
         operating systems  having  file  formats  in  which  variable
         length   records  may  have  trailing  blanks  suppressed,  a
         setting of zero does not imply that  padding  to  a  standard
         size  occurs,  merely  that  any  trailing  blanks  which are
         actually present will be preserved.  For  most  applications,
         initialising the value to 1 is to be recommended.




         MACRO SPITBOL V3.5
                                                   PAGE 46 - [7]
         Program Listing and Control Cards



                *----------------------------------------*
                  [7]  Program Listing and Control Cards
                | [7]  Program Listing and Control Cards |
                *----------------------------------------*

    Normally  a  listing  of  the  source program is produced in which
    statements are prefixed with a  statement  number.   This  listing
    usually  starts  with  a  heading identifying the SPITBOL version,
    and giving date  and  time  of  run.   Where  this  is  considered
    inappropriate  it  may  be  suppressed  (Section  12). Many of the
    control cards to be  described  permit  choice  of  other  listing
    options.   Control  cards are identified by a minus sign in column
    one.  They may occur anywhere in a source program and take  effect
    when  they  are encountered.  Most of them are special features of
    SPITBOL and are not available in  SNOBOL4.   The  full  names  are
    given  for  each  of  them, but they may be abbreviated since only
    the first four characters are significant to the compiler.


 7.1  Listing Control Cards
 7.1  Listing Control Cards
 ____________ _______ _____

    Listing control cards are used to  alter  the  appearance  of  the
    listing.   They  have no other effect on compilation or execution.
    Listing control cards always occur individually.




 7.1.1  -EJECT
 7.1.1  -EJECT

    The -EJECT control card  causes  the  compilation  listing  to  be
    skipped  to  the  top  of  the  next  page.  The current title and
    subtitle (if any) are printed at the top of the page.




 7.1.2  -SPACE
 7.1.2  -SPACE

    The -SPACE control  card  causes  spaces  to  be  skipped  on  the
    current  page.  If -SPACE occurs with no operand, then one line is
    skipped.  Alternatively, an  unsigned  integer  can  be  given  in
    columns  8-72  which represents the number of lines to be skipped.
    If there is insufficient space on the current  page,  -SPACE  acts
    like  -EJECT  and  the  listing  is  spaced to the top of the next
    page.











         MACRO SPITBOL V3.5
                                                   PAGE 47 - [7.1.3]
         Program Listing and Control Cards

 7.1.3  -TITLE
 7.1.3  -TITLE

    This card supplies a title for the source  program  listing.   The
    text  of  the title is taken from columns 8-72 of the -TITLE card.
    The subtitle is cleared to blanks, and an eject to the  next  page
    occurs next time a line is listed.


 7.1.4  -STITL
 7.1.4  -STITL

    The  -STITL  card  is  used  to  supply  a subtitle for the source
    program listing.  The text of the subtitle is taken  from  columns
    8-72  of  the -STITL card.  An eject occurs to the top of the next
    page next time a line is listed and the  current  title  (if  any)
    and  the  newly  supplied subtitle are printed.  If both title and
    subtitle are to be changed, then the -TITLE  card  should  precede
    the -STITL card.









































         MACRO SPITBOL V3.5
                                                   PAGE 48 - [7.2]
         Program Listing and Control Cards



 7.2  Option Control Cards
 7.2  Option Control Cards
 ___________ _______ _____

    The  option  control  cards  allow  selection  of various compiler
    options.  In each case, there are two modes and a pair of  control
    cards  which  permit  repeated flipping back and forth of the mode
    within a program.  Several control options  may  be  specified  on
    the  same  control  card  by  separating  the  names  with commas,
    leaving no intervening blanks.  For example
    -FAIL,LIST,PRINT
    In the list below, the default option is named first.




 7.2.1  -LIST -NOLIST
 7.2.1  -LIST -NOLIST

    The -NOLIST option causes  suppression  of  the  normal  statement
    listing.   This  may  be  useful  for  established program, or for
    terminal  output.   If  compilation  errors  are   detected,   the
    offending  statements are printed regardless of the setting of the
    list mode.  Some implementations provide  a  run  time  option  to
    select  NOLIST  mode  initially without the need to insert -NOLIST
    into the program being run (Section 12).




 7.2.2  -NOPRINT -PRINT
 7.2.2  -NOPRINT -PRINT

    Normally control cards are not printed.  The -PRINT option  causes
    them  to  be listed, provided the -LIST option is in effect.  This
    option may be useful if serialization is used for updating.




 7.2.3  -SINGLE -DOUBLE
 7.2.3  -SINGLE -DOUBLE

    The compilation listing is normally singly  spaced.   The  -DOUBLE
    option  causes  double  spacing  to  be  used,  with  a blank line
    folowing each listed line.















         MACRO SPITBOL V3.5
                                                   PAGE 49 - [7.2.4]
         Program Listing and Control Cards



 7.2.4  -INXXX
 7.2.4  -INXXX

    XXX in the above stands for an integer indicating  the  number  of
    characters  to  be  read  from  each  record of the SPITBOL source
    file.  The normal default is for  the  compiler  to  read  SPITBOL
    statements  from  columns  1-72  of  the  input  image.  Longer or
    shorter input  records  may  be  read  by  specifying  alternative
    values  for  XXX.  If any value other than 72 is in use at the end
    of translation, it is used as the maximum record length  for  data
    read  from  the  standard  input  file.  For historical reasons, a
    -IN72 card in effect at the end of compilation is taken  to  imply
    a  maximum  record length of 80 for execution time data.  There is
    however no need to restrict records to lengths of 72 or 80.




 7.2.5  -ERRORS -NOERRORS
 7.2.5  -ERRORS -NOERRORS

    Normally execution is allowed even when compilation errors  occur.
    If  it  is  wished  to inhibit execution if compilation errors are
    detected then the -NOERRORS option should be selected.




 7.2.6  -FAIL -NOFAIL
 7.2.6  -FAIL -NOFAIL

    In SNOBOL4 and in SPITBOL with the -FAIL mode set, a failure in  a
    statement  with  no  conditional  goto  is ignored and the program
    execution resumes with  the  next  statement  in  sequence.   This
    convention  often leads to errors going undetected, particuarly in
    the case of array references with  out  of  bound  subscripts  and
    pattern  matches  which  the user anticipates will always succeed.
    The -NOFAIL  option  changes  this  convention.   If  a  statement
    lacking  a  conditional goto is compiled under the -NOFAIL option,
    then if a failure occurs when  the  statement  is  executed,  this
    produces  an execution error with a suitable message.  This option
    is especially useful for student jobs and other  situations  where
    many small programs are being debugged.




 7.2.7  -EXECUTE -NOEXECUTE
 7.2.7  -EXECUTE -NOEXECUTE

    Normally   execution  is  initiated  following  compilation.   The
    -NOEXECUTE  option,  if  in  force  at  the  end  of  compilation,
    inhibits  execution.   A  run  time option may be provided for the
    same purpose (Section 12).






         MACRO SPITBOL V3.5
                                                   PAGE 50 - [8]
         Errors



                             *-------------*
                               [8]  Errors
                             | [8]  Errors |
                             *-------------*


 8.1  Compilation Error Messages
 8.1  Compilation Error Messages
 ________________ _____ ________

    When the compiler detects an error, the offending line is  printed
    with  a  marker  under  the  point at which the error was actually
    detected  and  an  error  code  and  self-explanatory  message  is
    printed.    Processing   of  the  statement  is  discontinued  and
    compilation continues with the next  statement.   Execution  of  a
    program  containing  errors is not suppressed unless the -NOERRORS
    option has  been  set.   If  an  attempt  is  made  to  execute  a
    statement  found  erroneous  by  the  compiler, an execution error
    occurs.


 8.2  Execution Error Messages
 8.2  Execution Error Messages
 ______________ _____ ________

    Extensive error checking is performed at run time.  When an  error
    is  detected,  execution is terminated with an error message which
    refers to the number of  the  erroneous  statement.   However,  as
    described  in  Section  5,  it  is  possible  to  avoid  automatic
    execution  termination  and  to   obtain   user   error   handling
    facilities by means of the SETEXIT function.

    In  addition  to  the  errors  listed here, the implementation may
    have additional system errors.  See Section 12.


 8.3  Error Codes and Messages
 8.3  Error Codes and Messages
 __________ _____ ___ ________

    The following list details all error messages with  the  exception
    of any which may be particular to certain implementations.

    Code                       Message
    ____                       _______

      1   Addition left operand is not numeric
      2   Addition right operand is not numeric
      3   Addition caused integer overflow
      4   Affirmation operand is not numeric
      5   Alternation right operand is not pattern
      6   Alternation left operand is not pattern
      7   Compilation error encountered during execution
      8   Concatenation left opnd is not string or pattern
      9   Concatenation right opd is not string or pattern
     10   Complementation operand is not numeric
     11   Complementation caused integer overflow
     12   Division left operand is not numeric
     13   Division right operand is not numeric
     14   Division caused integer overflow
     15   Exponentiation right operand is not numeric
     16   Exponentiation left operand is not numeric


         MACRO SPITBOL V3.5
                                                   PAGE 51 - [8.3]
         Errors

     17   Exponentiation caused integer overflow
     18   Exponentiation result is undefined
     19   Exponentiation right operand is negative
     20   Goto evaluation failure
     21   Function called by name returned a value
     22   Undefined function called
     23   Goto operand is not a natural variable
     24   Goto operand in direct goto is not code
     25   Immediate assignment left operand is not pattern
     26   Multiplication left operand is not numeric
     27   Multiplication right operand is not numeric
     28   Multiplication caused integer overflow
     29   Undefined operator referenced
     30   Pattern assignment left operand is not pattern
     31   Pattern replacement right operand is not string
     32   Subtraction left operand is not numeric
     33   Subtraction right operand is not numeric
     34   Subtraction caused integer overflow
     35   Unexpected failure in -NOFAIL mode
     36   Goto ABORT with no preceding error
     37   Goto CONTINUE with no preceding error
     38   Goto undefined label
     39   External function argument is not string
     40   External function argument is not integer
     41   FIELD function argument is wrong datatype
     42   Attempt to change value of protected variable
     43   ANY evaluated argument is not string
     44   BREAK evaluated argument is not string
     45   BREAKX evaluated argument is not string
     46   Expression does not evaluate to pattern
     47   LEN evaluated argument is not integer
     48   LEN evaluated argument is negative or too large
     49   NOTANY evaluated argument is not string
     50   POS evaluated argument is not integer
     51   POS evaluated argument is negative or too large
     52   RPOS evaluated argument is not integer
     53   RPOS evaluated argument is negative or too large
     54   RTAB evaluated argument is not integer
     55   RTAB evaluated argument is negative or too large
     56   SPAN evaluated argument is not string
     57   TAB evaluated argument is not integer
     58   TAB evaluated argument is negative or too large
     59   ANY argument is not string or expression
     60   APPLY first arg is not natural variable name
     61   ARBNO argument is not pattern
     62   ARG second argument is not integer
     63   ARG first argument is not program function name
     64   ARRAY first argument is not integer or string
     65   ARRAY first argument lower bound is not integer
     66   ARRAY first argument upper bound is not integer
     67   ARRAY dimension is zero,negative or out of range
     68   ARRAY size exceeds maximum permitted
     69   BREAK argument is not string or expression
     70   BREAKX argument is not string or expression
     71   CLEAR argument is not string
     72   CLEAR argument has null variable name


         MACRO SPITBOL V3.5
                                                   PAGE 52 - [8.3]
         Errors

     73   COLLECT argument is not integer
     74   CONVERT second argument is not string
     75   DATA argument is not string
     76   DATA argument is null
     77   DATA argument is missing a left paren
     78   DATA argument has null datatype name
     79   DATA argument is missing a right paren
     80   DATA argument has null field name
     81   DEFINE first argument is not string
     82   DEFINE first argument is null
     83   DEFINE first argument is missing a left paren
     84   DEFINE first argument has null function name
     85   Null arg name or missing ) in DEFINE first arg.
     86   DEFINE function entry point is not defined label
     87   DETACH argument is not appropriate name
     88   DUMP argument is not integer
     89   DUMP argument is negative or too large
     90   DUPL second argument is not integer
     91   DUPL first argument is not string or pattern
     92   EJECT argument is not a suitable name
     93   EJECT file does not exist
     94   EJECT file does not permit page eject
     95   EJECT caused non-recoverable output error
     96   ENDFILE argument is not a suitable name
     97   ENDFILE argument is null
     98   ENDFILE file does not exist
     99   ENDFILE file does not permit endfile
    100   ENDFILE caused non-recoverable output error
    101   EQ first argument is not numeric
    102   EQ second argument is not numeric
    103   EVAL argument is not expression
    104   EXIT argument is not suitable integer or string
    105   EXIT action not available in this implementation
    106   EXIT action caused irrecoverable error
    107   FIELD second argument is not integer
    108   FIELD first argument is not datatype name
    109   GE first argument is not numeric
    110   GE second argument is not numeric
    111   GT first argument is not numeric
    112   GT second argument is not numeric
    113   INPUT third argument is not a string
    114   Inappropriate second argument for INPUT
    115   Inappropriate first argument for INPUT
    116   Inappropriate file specification for INPUT
    117   INPUT file cannot be read
    118   LE first argument is not numeric
    119   LE second argument is not numeric
    120   LEN argument is not integer or expression
    121   LEN argument is negative or too large
    122   LEQ first argument is not string
    123   LEQ second argument is not string
    124   LGE first argument is not string
    125   LGE second argument is not string
    126   LGT first argument is not string
    127   LGT second argument is not string
    128   LLE first argument is not string


         MACRO SPITBOL V3.5
                                                   PAGE 53 - [8.3]
         Errors

    129   LLE second argument is not string
    130   LLT first argument is not string
    131   LLT second argument is not string
    132   LNE first argument is not string
    133   LNE second argument is not string
    134   LOCAL second argument is not integer
    135   LOCAL first arg is not a program function name
    136   LOAD second argument is not string
    137   LOAD first argument is not string
    138   LOAD first argument is null
    139   LOAD first argument is missing a left paren
    140   LOAD first argument has null function name
    141   LOAD first argument is missing a right paren
    142   LOAD function does not exist
    143   LOAD function caused input error during load
    144   LPAD third argument not a string
    145   LPAD second argument is not integer
    146   LPAD first argument is not string
    147   LT first argument is not numeric
    148   LT second argument is not numeric
    149   NE first argument is not numeric
    150   NE second argument is not numeric
    151   NOTANY argument is not string or expression
    152   OPSYN third argument is not integer
    153   OPSYN third argument is negative or too large
    154   OPSYN second arg is not natural variable name
    155   OPSYN first arg is not natural variable name
    156   OPSYN first arg is not correct operator name
    157   OUTPUT third argument is not a string
    158   Inappropriate second argument for OUTPUT
    159   Inappropriate first argument for OUTPUT
    160   Inappropriate file specification for OUTPUT
    161   OUTPUT file cannot be written to
    162   POS argument is not integer or expression
    163   POS argument is negative or too large
    164   PROTOTYPE argument is not table or array
    165   REMDR second argument is not integer
    166   REMDR first argument is not integer
    167   REMDR caused integer overflow
    168   REPLACE third argument is not string
    169   REPLACE second argument is not string
    170   REPLACE first argument is not string
    171   Null or unequally long 2nd, 3rd args to REPLACE
    172   REWIND argument is not a suitable name
    173   REWIND argument is null
    174   REWIND file does not exist
    175   REWIND file does not permit rewind
    176   REWIND caused non-recoverable error
    177   REVERSE argument is not string
    178   RPAD third argument is not string
    179   RPAD second argument is not integer
    180   RPAD first argument is not string
    181   RTAB argument is not integer or expression
    182   RTAB argument is negative or too large
    183   TAB argument is not integer or expression
    184   TAB argument is negative or too large


         MACRO SPITBOL V3.5
                                                   PAGE 54 - [8.3]
         Errors

    185   RPOS argument is not integer or expression
    186   RPOS argument is negative or too large
    187   SETEXIT argument is not label name or null
    188   SPAN argument is not string or expression
    189   SIZE argument is not string
    190   STOPTR first argument is not appropriate name
    191   STOPTR second argument is not trace type
    192   SUBSTR third argument is not integer
    193   SUBSTR second argument is not integer
    194   SUBSTR first argument is not string
    195   TABLE argument is not integer
    196   TABLE argument is out of range
    197   TRACE fourth arg is not function name or null
    198   TRACE first argument is not appropriate name
    199   TRACE second argument is not trace type
    200   TRIM argument is not string
    201   UNLOAD argument is not natural variable name
    202   Input from file caused non-recoverable error
    203   Input file record has incorrect format
    204   Memory overflow
    205   String length exceeds value of MAXLNGTH keyword
    206   Output caused file overflow
    207   Output caused non-recoverable error
    208   Keyword value assigned is not integer
    209   Keyword in assignment is protected
    210   Keyword value assigned is negative or too large
    211   Value assigned to keyword ERRTEXT not a string
    212   Syntax error.  Value used where name is required
    213   Syntax error.  Statement is too complicated.
    214   Syntax error.  Bad label or misplaced continuation line
    215   Syntax error.  Undefined or erroneous entry label
    216   Syntax error.  Missing END line
    217   Syntax error.  Duplicate label
    218   Syntax error.  Duplicated goto field
    219   Syntax error.  Empty goto field
    220   Syntax error.  Missing operator
    221   Syntax error.  Missing operand
    222   Syntax error.  Invalid use of left bracket
    223   Syntax error.  Invalid use of comma
    224   Syntax error.  Unbalanced right parenthesis
    225   Syntax error.  Unbalanced right bracket
    226   Syntax error.  Missing right paren
    227   Syntax error.  Right paren missing from goto
    228   Syntax error.  Right bracket missing from goto
    229   Syntax error.  Missing right array bracket
    230   Syntax error.  Illegal character
    231   Syntax error.  Invalid numeric item
    232   Syntax error.  Unmatched string quote
    233   Syntax error.  Invalid use of operator
    234   Syntax error.  Goto field incorrect
    235   Subscripted operand is not table or array
    236   Array referenced with wrong number of subscripts
    237   Table referenced with more than one subscript
    238   Array subscript is not integer
    239   Indirection operand is not name
    240   Pattern match right operand is not pattern


         MACRO SPITBOL V3.5
                                                   PAGE 55 - [8.3]
         Errors

    241   Pattern match left operand is not string
    242   Function return from level zero
    243   Function result in NRETURN is not name
    244   Statement count exceeds value of STLIMIT keyword
    245   Translation/execution time expired
    246   Stack overflow
    247   Invalid control card
    248   Attempted redefinition of system function
    249   Expression evaluated by name returned value
    250   Insufficient memory to complete dump
    251   Keyword operand is not name of defined keyword
    252   Error on printing to interactive channel
    253   Print limit exceeded on standard output channel
    254   Erroneous argument to HOST
    255   Error during execution of HOST
    256   SORT/RSORT 1st arg not suitable ARRAY or TABLE
    257   Erroneous 2nd arg in SORT/RSORT of vector
    258   SORT/RSORT 2nd arg out of range or non-integer
    259   FENCE function argument is not pattern
    261   Addition caused real overflow
    262   Division caused real overflow
    263   Multiplication caused real overflow
    264   Subtraction caused real overflow
    265   External function argument is not real
    266   Exponentiation caused real overflow
    267   Exponentiation right operand is real not integer
    268   Inconsistent value assigned to profile keyword
    269   BUFFER first argument is not integer
    270   BUFFER second argument is not string or buffer
    271   BUFFER initial value too big for allocation
    272   BUFFER first argument is not positive
    273   Buffer size is too big
    274   Requested buffer allocation exceeds MXLEN
    275   APPEND first argument is not buffer
    276   APPEND second argument is not string
    277   INSERT third argument not integer
    278   INSERT second argument not integer
    279   INSERT first argument not buffer
    280   INSERT fourth argument not a string
    281   CHAR argument not integer
    282   CHAR argument not in range

















         MACRO SPITBOL V3.5
                                                   PAGE 56 - [9]
         Programming Notes



                        *------------------------*
                          [9]  Programming Notes
                        | [9]  Programming Notes |
                        *------------------------*

    The  internal organization of SPITBOL is quite different from that
    of  SNOBOL4.   Consequently  the   relative   speed   of   various
    operations  differs.   This  section attempts to give some idea of
    how to obtain high efficiency in SPITBOL programs.


 9.1  Space Considerations
 9.1  Space Considerations
 __________ ______________

    The ANY, NOTANY, BREAK, BREAKX, SPAN functions use  translate  and
    test  tables  for  arguments  longer  than one character.  A table
    allocated for this purpose will be M words long by  N  bits  wide,
    where  M  is  64, 128 or 256 (machine dependent) and N is the word
    length in bits of the host computer.  For  each  function  call  a
    bit  column  is  used so that a single table suffices for N calls.
    With a constant  argument,  the  table  entry  is  precomputed  at
    compile  time  thus avoiding erosion of space by repeated calls in
    a run time loop.   Single  character  arguments  incur  no   space
    overhead .

    Integers  and reals have an overhead of one word above that needed
    by the usual hardware representation.

    Multidimensional arrays have a  space  overhead  of  8 + 2D  words
    where  D is the number of dimensions.  One dimensional arrays with
    a low bound of 1 (vectors ) are  treated  specially  and  have  an
    overhead of only three words.

    The  space  needed  for  non-null elements of tables is 4 words in
    addition to space  for  the  element  itself.   Each  table   hash
    header  is  one  word.   Thus  the  number  of headers can be made
    reasonably large without using  much  additional  space.   Program
    defined  datatypes  require  3 + F words, where F is the number of
    fields.  They are thus quite  compact  and  can  be  used  freely.
    Each  variable  block requires 8 words plus space for the variable
    name, the characters of  which  are  packed  several  to  a  word,
    usually  using  6,  7 or 8 bits for each character.  This space is
    constant irrespective of whether the name has a single  use     or
    is  used  multiply as a label, function, variable etc.  This space
    is never reclaimed once  it  has  been   allocated.   It  is  thus
    inefficient  to   use  variables  to build tables with the unary $
    operator.  Instead use the TABLE datatype.  The interpretive  code
    produced  by  the  compiler is held in code blocks  and is subject
    to garbage collection when no longer  accessible.   Advantage  can
    be  taken  of  this by writing label-free initialising code at the
    head of a program.  Even if labels are present it is  possible  to
    make  initialising  code   collectable  by the artifice of calling
    CODE with a string argument in which the labels are redeclared.





         MACRO SPITBOL V3.5
                                                   PAGE 57 - [9.1]
         Programming Notes


    Considerable amounts of store  are  used  in  repeatedly  building
    patterns.    They  should  either  be  pre-assigned  to  variables
    outside program loops  or  alternatively  if  written  in-line  in
    loops,  should  be  constant  so  that  they may be precomputed at
    compile time in order to avoid this overhead.

    Setting &TRIM non-zero  ensures  that  memory  is  not  wasted  in
    storing trailing blanks in strings.

    The   COLLECT  function  can  be  used  to  obtain  very  detailed
    information of memory utilization for various structures.

    Modifications to a string type require that the string  be  copied
    internally  first.   This  means  that space must be available for
    two copies of the string to  co-exist  in  memory  simultaneously.
    If  the  string  is  large  this  can lead to unanticipated memory
    usage.  For example, consider the input loop:
        LOOP CORPUS = CORPUS INPUT  :S(LOOP)
    As this reads more and more lines, CORPUS grows larger, and  large
    amounts  of  memory  (and  processor  time)  are spent copying the
    'old' value of CORPUS before INPUT is appended to it.  The  buffer
    type  is  helpful in avoiding this situation,  since modifications
    to buffers  (via  APPEND,  INSERT  and  pattern  replacement)  are
    performed directly on the existing buffer contents.


 9.2  Speed Considerations
 9.2  Speed Considerations
 __________ ______________

    To  a  greater  extent  than  is the case with SNOBOL4, there is a
    loss of efficiency in  encoding  complex  structures  as  strings.
    Use  arrays,  tables,  buffers and program defined datatypes where
    possible since all of these are highly efficient in SPITBOL.   The
    fast  associative  lookup  (hashing) feature of the TABLE makes it
    a particularly recommended feature  to  be  exploited  in  a  wide
    range of applications.

    Programmers  frequently  do  not  appreciate that execution speeds
    may be reduced  by  an  order  of  magnitude  if  poorly  designed
    patterns  fruitlessly  scan  data  in   unanchored mode.  With the
    pattern  matching  primitives  of  SPITBOL,  it   is   rare   that
    unanchored  matching  is  necessary and since anchored matching is
    much less expensive it is worth  acquiring the habit of  initially
    setting  &ANCHOR  non-zero.   If unanchored matching is needed for
    some purpose, take care that it is not unduly wasteful  with  data
    for which match failure is common.

    The  binary  $ pattern assignment is rather faster than the binary
    . pattern assignment and may be used freely.  SPITBOL  precomputes
    constant  expressions  before execution.  No efficiency is lost by
    writing pre-evaluable patterns  in-line  rather  than  predefining
    them.    Use of the unary * to defer computation is useful in some
    cases.  For example, consider the in-line matches -
        X ANY('PQR') BAL PAT 'X' RPOS(0)
        X ANY('PQR') BAL *PAT 'X' RPOS(0)
    The  second  form  is  more  efficient,  since  the  compiler  can


         MACRO SPITBOL V3.5
                                                   PAGE 58 - [9.2]
         Programming Notes

    precompute  the  entire  pattern  where  PAT  occurs as a deferred
    expression.

    The ANY, NOTANY, BREAK, BREAKX, SPAN,  RSORT, SORT  functions  are
    fast and highly recommended.

    ARB  and  ARBNO  are  slow  and can very often be avoided by using
    other  constructions.   Time  for  datatype  conversions  may   be
    significant.    Where  efficiency  is  important,  avoid  repeated
    unnecessary conversions.

    The SETEXIT error intercepts are fast and may be used for  program
    control as well as for debugging.

    Tracing  or  I/O  associating  a variable substantially slows down
    references to it but there is no residual access  penalty  if  the
    trace or I/O associations  are removed by STOPTR or DETACH.

    The  unary  $  (indirect) operator applied to a string argument in
    SPITBOL corresponds to a hash search of existing  variables.   The
    process  of  applying $ to a NAME (including the name of a natural
    variable),  is  much  faster,  which  is  why   unary  dot   (name
    operator)  returns  a NAME instead of a string.  It is thus better
    to use names rather than strings in applications such  as  passing
    variable names or labels indirectly as in
        F(.X)            rather than
        F("X") .

    Use  of the REPLACE function is optimised when, on repeated calls,
    the second and third arguments are found to  be  unchanged,  since
    in this case the previously constructed replace table is re-used.

    The  buffer  type  is  recommended for containing and manipulating
    large strings.   Pattern  replacement  can  be  specified  with  a
    buffer  name as the subject; the replacement is done on the buffer
    contents corresponding  to  the  substring  matched  as  with  the
    INSERT function.


 9.3  Other Notes
 9.3  Other Notes
 __________ _____

    The pattern match
       &ALPHABET LEN(N) LEN(1) $ CHAR
    is  useful  to  put  into  "CHAR"  the  Nth  character of the host
    machine character set.


    The interrogation operator, unary ? , is useful to  annihilate  an
    expression  which  is  evaluated  for its side effects rather than
    for its value.  For example
       S BREAK(*DELIM) $ K *?(TABLE<K> = TABLE<K> + 1)







         MACRO SPITBOL V3.5
                                                   PAGE 59 - [10]
         Specimen Programs



                        *------------------------*
                          [10] Specimen Programs
                        | [10] Specimen Programs |
                        *------------------------*

    Specimen programs of several  different  types  are  listed.   The
    first  one  is  especially  simple and uses no special facilities.
    The second and third are a little more ambitious and make  use  of
    program  defined  datatypes  and  tables  respectively.  Program 4
    serves no function apart from showing some of the  techniques  for
    producing  trace  output  and  providing  user handling of errors.
    The  job  control  commands  needed  to  run  these  programs  are
    implementation dependent and hence are listed in Section 12.







 10.1  Program 1
 10.1  Program 1
 _____________ _

    This  program reads data appended to its end and scans each record
    to count the number of vowels  it  contains.   A  listing  of  all
    records  constituting  the  program  and data is shown and this is
    followed by a copy of  the  output  produced  on  compilation  and
    execution.   The  -NOLIST  card  indicates  that no listing of the
    program is required.   Note  the  use  of  the  SPITBOL  selection
    feature  in  the  statement labelled NOMORE and the plus used as a
    statement continuation symbol in column 1 of the next  card.   The
    data  for  the  run   follows  the  END label of the program.  The
    output includes  the version number of the SPITBOL compiler  which
    will  be  updated  as  new  versions are introduced.  Compile time
    statistics, output  from  the  program  execution  and  statistics
    relating to the run are listed.






















         MACRO SPITBOL V3.5
                                                   PAGE 60 - [10.1]
         Specimen Programs

  -NOLIST
  -TITLE  P R O G R A M   1
  *
  *    PROGRAM TO COUNT THE VOWELS IN LINES OF TEXT
  *
            &ANCHOR  = &TRIM = 1
            VOWELS   = BREAK('AEIOU') LEN(1)
  *
  *    LOOP TO READ NEXT LINE OF INPUT
  *
  INP       INP      = COPY = INPUT                     :F(END)
            N        = 0
  *
  *    LOOP TO SEARCH FOR VOWELS
  *
  FINDVWLS  INP VOWELS =                                :F(NOMORE)
            N        = N + 1                            :(FINDVWLS)
  *
  *    ALL VOWELS HAVE BEEN FOUND
  *
  NOMORE    OUTPUT   = RPAD(N,2) (EQ(N,1) ' VOWEL ' , ' VOWELS')
  +           ' FOUND IN "' COPY '"'                    :(INP)
  END
  QWERTY
  1900 AND DECSYSTEM-10 SPITBOL
  THE SLITHY TOVES DID GYRE AND GIMBLE IN THE WABE
  12 * 2 = 24




  STORE USED     1360
  STORE LEFT     4477
  COMP ERRORS    0
  REGENERATIONS  0
  COMP TIME-MSEC 160


  1  VOWEL  FOUND IN "QWERTY"
  5  VOWELS FOUND IN "1900 AND DECSYSTEM-10 SPITBOL"
  13 VOWELS FOUND IN "THE SLITHY TOVES DID GYRE AND GIMBLE IN THE WABE"
  0  VOWELS FOUND IN "12 * 2 = 24"


  NORMAL END
  IN STATEMENT   8
  STMTS EXECUTED 58
  RUN TIME-MSEC  100
  MCSEC / STMT   1724
  REGENERATIONS  0








         MACRO SPITBOL V3.5
                                                   PAGE 61 - [10.2]
         Specimen Programs



 10.2  Program 2
 10.2  Program 2
 _____________ _

    This  is  a  somewhat  more  complex  program for sorting a set of
    records.  There is no -NOLIST card present and  so  a  listing  of
    the  program  is  produced  by the compiler with statement numbers
    placed on the left.  The output includes the sorted list and  then
    following  the  execution  statistics is a dump resulting from the
    assignment to keyword &DUMP in statement 2.  This illustrates  the
    excellent  diagnostic  assistance  available  should a program not
    behave as  expected.   The  structure  of  the  trees  is  readily
    discernible   in   the  dump  of  the  NODEs  of  which  they  are
    constituted.   (Note  that  this  program  could  also  have  been
    written using the SORT feature.)


  P R O G R A M   2                                               PAGE 1

          *    PROGRAM TO SORT A SET OF RECORDS ON A KEY USING A TREE SORTING
          *    TECHNIQUE.
          *
          *    DATATYPE WITH THE NECESSARY 4 FIELDS
          *
  1                 DATA('NODE(KEY,DAT,PRED,SUCC)')
  2                 &DUMP    = 2; &ANCHOR = &TRIM = 1
          *
          *    ROUTINE TO ADD "DATA" TO A TREE SORTED BY "KEY".
          *    "ROOT" IS PASSED BY REFERENCE (IT IS A SPITBOL NAME)
          *    AND POINTS TO THE TREE TO BE USED.
          *
  4                 DEFINE('ADNODE(KEY,DATA,ROOT)PTR')          :(ADNEND)
          *
          *    CREATE TREE INITIALLY IF NOT YET IN EXISTENCE
          *
  5       ADNODE    $ROOT    = IDENT($ROOT) NODE(KEY,DATA)      :S(RETURN)
  6                 PTR      = $ROOT
          *
          *    SEARCH TO FIND INSERTION POINT IN TREE
          *
  7       SEARCH    LLE(KEY,KEY(PTR))                           :S(BEFORE)
          *
          *    HERE IF NODE FOLLOWS THAT IN TREE
          *
  8       AFTER     PTR      = DIFFER(SUCC(PTR)) SUCC(PTR)      :S(SEARCH)
  9                 SUCC(PTR) = NODE(KEY,DATA)                  :S(RETURN)
          *
          *    HERE IF KEY PRECEDES THAT IN TREE
          *
  10      BEFORE    PTR      = DIFFER(PRED(PTR)) PRED(PTR)      :S(SEARCH)
  11                PRED(PTR) = NODE(KEY,DATA)                  :(RETURN)
  12      ADNEND






         MACRO SPITBOL V3.5
                                                   PAGE 62 - [10.2]
         Specimen Programs

          *
          *    ROUTINE TO PRINT A SORTED BINARY TREE
          *
  13                DEFINE('PRINTREE(TREE)')                    :(ENDPRT)
  14      PRINTREE  DIFFER(PRED(TREE)) PRINTREE(PRED(TREE))
  15                OUTPUT   = KEY(TREE) '  ' DAT(TREE)
  16                DIFFER(SUCC(TREE)) PRINTREE(SUCC(TREE))     :(RETURN)
  17      ENDPRT
          *
          *    RECORDS OF WHICH
          *    '1609   GALILEO :   TELESCOPE'
          *    IS TYPICAL ARE TO BE SORTED BY DATE AND BY INVENTOR.
          *    SPLIT OUT THE RECORDS AND ADD TO TWO SORTED TREES.
          *
  18      SORT      INP      = INPUT                            :F(PRINT)
  19                INP LEN(4) $ DATE SPAN(' ') (BREAK(':') ':') $ INVR
          .               SPAN(' ') REM $ INVN
  20                ADNODE(DATE,RPAD(INVR,16) INVN,.DATREE)
  21                ADNODE(RPAD(INVR,16),DATE '  ' INVN,.INVRTREE) :(SORT)
          *
          *    JOB DONE APART FROM PRINTING THE SORTED TREES
          *
  22      PRINT     OUTPUT   = 'INVENTIONS SORTED BY DATE'; OUTPUT =
  24                PRINTREE(DATREE) ; OUTPUT =
  26                OUTPUT   = 'INVENTIONS SORTED BY INVENTOR'; OUTPUT =
  28                PRINTREE(INVRTREE)
  29      END


  INVENTIONS SORTED BY DATE

  1609  GALILEO :         TELESCOPE
  1835  TALBOT W F :      PHOTOGRAPHY
  1876  BELL A G :        TELEPHONE
  1896  DIESEL R :        DIESEL ENGINE
  1896  MARCONI G :       RADIO
  1903  WRIGHT O & W :    POWERED FLIGHT

  INVENTIONS SORTED BY INVENTOR

  BELL A G :        1876  TELEPHONE
  DIESEL R :        1896  DIESEL ENGINE
  GALILEO :         1609  TELESCOPE
  MARCONI G :       1896  RADIO
  TALBOT W F :      1835  PHOTOGRAPHY
  WRIGHT O & W :    1903  POWERED FLIGHT


  NORMAL END
  IN STATEMENT   29
  STMTS EXECUTED 146
  RUN TIME-MSEC  160
  MCSEC / STMT   1095
  REGENERATIONS  0




         MACRO SPITBOL V3.5
                                                   PAGE 63 - [10.2]
         Specimen Programs

    DUMP OF NATURAL VARIABLES

  DATE = '1896'
  DATREE = NODE `1
  INP = '1896    DIESEL R :          DIESEL ENGINE'
  INPUT = '1896    DIESEL R :          DIESEL ENGINE'
  INVN = 'DIESEL ENGINE'
  INVR = 'DIESEL R :'
  INVRTREE = NODE `2
  OUTPUT = 'WRIGHT O & W :    1903  POWERED FLIGHT'
  REM = PATTERN


  DUMP OF KEYWORD VALUES

  &ANCHOR = 1
  &CODE = 0
  &DUMP = 2
  &ERRLIMIT = 0
  &ERRTEXT = ''
  &ERRTYPE = 0
  &FNCLEVEL = 0
  &FTRACE = 0
  &INPUT = 1
  &LASTNO = 28
  &MAXLNGTH = 3104
  &OUTPUT = 1
  &RTNTYPE = 'RETURN'
  &STCOUNT = 146
  &STLIMIT = 50000
  &STNO = 29
  &TRACE = 0
  &TRIM = 1


  NODE `1
  KEY(DATREE) = '1876'
  DAT(DATREE) = 'BELL A G :      TELEPHONE'
  PRED(DATREE) = NODE `5
  SUCC(DATREE) = NODE `3

  NODE `2
  KEY(INVRTREE) = 'BELL A G :      '
  DAT(INVRTREE) = '1876  TELEPHONE'
  SUCC(INVRTREE) = NODE `4

  NODE `3
  KEY(NODE `3) = '1896'
  DAT(NODE `3) = 'MARCONI G :     RADIO'
  PRED(NODE `3) = NODE `11
  SUCC(NODE `3) = NODE `7







         MACRO SPITBOL V3.5
                                                   PAGE 64 - [10.2]
         Specimen Programs

  NODE `4
  KEY(NODE `4) = 'MARCONI G :     '
  DAT(NODE `4) = '1896  RADIO'
  PRED(NODE `4) = NODE `6
  SUCC(NODE `4) = NODE `8

  NODE `5
  KEY(NODE `5) = '1609'
  DAT(NODE `5) = 'GALILEO :       TELESCOPE'
  SUCC(NODE `5) = NODE `9

  NODE `6
  KEY(NODE `6) = 'GALILEO :       '
  DAT(NODE `6) = '1609  TELESCOPE'
  PRED(NODE `6) = NODE `12

  NODE `7
  KEY(NODE `7) = '1903'
  DAT(NODE `7) = 'WRIGHT O & W :  POWERED FLIGHT'

  NODE `8
  KEY(NODE `8) = 'WRIGHT O & W :  '
  DAT(NODE `8) = '1903  POWERED FLIGHT'
  PRED(NODE `8) = NODE `10

  NODE `9
  KEY(NODE `9) = '1835'
  DAT(NODE `9) = 'TALBOT W F :    PHOTOGRAPHY'

  NODE `10
  KEY(NODE `10) = 'TALBOT W F :    '
  DAT(NODE `10) = '1835  PHOTOGRAPHY'

  NODE `11
  KEY(NODE `11) = '1896'
  DAT(NODE `11) = 'DIESEL R :      DIESEL ENGINE'

  NODE `12
  KEY(NODE `12) = 'DIESEL R :      '
  DAT(NODE `12) = '1896  DIESEL ENGINE'


















         MACRO SPITBOL V3.5
                                                   PAGE 65 - [10.3]
         Specimen Programs



 10.3  Program 3
 10.3  Program 3
 _____________ _

    This  program reads a set of keywords and then processes a file in
    order to count the number of occurrences of the  keywords  in  the
    text  held  in the file.  Notice the simple method of making input
    and output associations to the various input and output  files  in
    statements  2,  3  and  4.   A  table  created  in  statement 7 is
    initialised with the keywords at statement 8.   The  pattern  used
    to  break out words is written out of line since this ensures that
    matching in the inner loop at label WORDLOOP executes  at  maximum
    speed.   In a similar application where an in-line pattern must be
    used (e.g. if the string value  of  PUNCTUATION  were  subject  to
    change  during  execution),  then  the  statement  would  best  be
    written using deferred expressions as

      WORDLOOP INP BREAK(*PUNCTUATION) . WORD SPAN(*PUNCTUATION) =

    since,  being  constant,  the  pattern  can  be  pre-evaluated  at
    compile  time.   This saves repeatedly building the pattern in the
    loop, leaving only the necessary processing of the current  string
    in  PUNCTUATION  as  additional  work to be done compared with the
    version in  the  program.   The  searching  for  and  counting  of
    keywords  in statement 11  is done using the inherently efficient,
    system-provided hashing capability  of  the  TABLE  datatype.   To
    economise  in  table  lookups,  the  table  entry is assigned to a
    temporary variable in statement 10  whilst  a  check  is  made  to
    ensure  that  it  is non-null.  The call of CONVERT used to access
    non-null entries in the table does not sort the keys,  so  that  a
    separate  sorting process would be necessary if sorted output were
    required.  A listing of the filed output is given.


























         MACRO SPITBOL V3.5
                                                   PAGE 66 - [10.3]
         Specimen Programs

    Contents of file KEYWDS
    ________ __ ____ ______

    BREEZE
    DAY
    MOON
    OCEAN
    SEA
    SHIP
    SUN
    THE
    TWAS
    WATER

    Contents of file KEYTXT
    ________ __ ____ ______

    THE FAIR BREEZE BLEW, THE WHITE FOAM FLEW,
    THE FURROW FOLLOWED FREE:
    WE WERE THE FIRST THAT EVER BURST
    INTO THAT SILENT SEA.

    DOWN DROPT THE BREEZE, THE SAILS DROPT DOWN,
    'TWAS SAD AS SAD COULD BE;
    AND WE DID SPEAK ONLY TO BREAK
    THE SILENCE OF THE SEA!

    DAY AFTER DAY, DAY AFTER DAY,
    WE STUCK, NOR BREATH NOR MOTION;
    AS IDLE AS A PAINTED SHIP
    UPON A PAINTED OCEAN.

    WATER, WATER, EVERY WHERE,
    AND ALL THE BOARDS DID SHRINK;
    WATER, WATER, EVERY WHERE,
    NOR ANY DROP TO DRINK.

            SAMUEL TAYLOR COLERIDGE


    Contents of file KEYOUT at end of run
    ________ __ ____ ______ __ ___ __ ___

         KEYWORD    NUMBER OF OCCURRENCES
         -------    --------------------

             SUN .  .  .  .  . 0
            MOON .  .  .  .  . 0
            SHIP .  .  .  .  . 1
            TWAS .  .  .  .  . 1
             DAY .  .  .  .  . 4
             SEA .  .  .  .  . 2
             THE .  .  .  .  . 9
          BREEZE .  .  .  .  . 2
           OCEAN .  .  .  .  . 1
           WATER .  .  .  .  . 4





         MACRO SPITBOL V3.5
                                                   PAGE 67 - [10.3]
         Specimen Programs


  P R O G R A M   3                                               PAGE 1

          -PRINT
          -IN80
          *    PROGRAM TO COUNT THE OCCURRENCES OF KEYWORDS IN A PIECE
          *    OF TEXT.  THE SEARCH FOR KEYWORDS IS EFFICIENTLY PERFORMED
          *    BY HASHING INTO A TABLE.
          *
  1                 &ANCHOR = &TRIM = 1
  2                 INPUT(.KEYS,1,'KEYWDS')                     :F(NOFILE)
  3                 INPUT(.INPUT,2,'KEYTXT')                    :F(NOFILE)
  4                 OUTPUT(.OUT,3,)
  5                 PUNCTUATION = " .,;:'!"
  6                 WORDPAT  = BREAK(PUNCTUATION) $ WORD SPAN(PUNCTUATION)
  7                 KEYTABLE = TABLE(31)
          *
          *    LOOP IN WHICH KEYWORDS ARE READ IN AND HASHED INTO KEYTABLE
          *
  8       KEYLOOP   KEYTABLE<KEYS> = 0                          :S(KEYLOOP)
          *
          *    A SPACE IS ADDED TO LINES OF TEXT TO ENSURE MATCH SUCCESS
          *
  9       READLOOP  INP      = INPUT ' '                        :F(CONVERT)
          *
          *    INDIVIDUAL WORDS ARE EXTRACTED BY PATTERN MATCHING
          *
  10      WORDLOOP  INP WORDPAT =
  11                KEYTABLE<WORD> = DIFFER(ENTRY = KEYTABLE<WORD>) ENTRY + 1
  12                DIFFER(INP)                       :S(WORDLOOP)F(READLOOP)
          *
          *    FAILURE POINT
          *
  13      NOFILE    OUTPUT  = 'MISSING INPUT FILE'              :(END)
  14      CONVFL    OUTPUT  = 'NO KEYWORDS FOUND'               :(END)
          *
          *    EXTRACT THE ENTRIES FROM THE TABLE INTO AN ARRAY
          *
  15      CONVERT   A        = CONVERT(KEYTABLE,'ARRAY')        :F(CONVFL)
  16                OUT      = '     KEYWORD    NUMBER OF OCCURRENCES'
  17                OUT      = '     -------    ---------------------'
  18                OUT      =
          *
          *    PRINT THE ENTRIES
          *
  19                 I        = 1
  20      PRINT    OUT   = LPAD(A[I,1],13) DUPL(' . ',5) A[I,2] :F(END)
  21                I        = I + 1                            :(PRINT)
  22      END









         MACRO SPITBOL V3.5
                                                   PAGE 68 - [10.4]
         Specimen Programs



 10.4  Program 4
 10.4  Program 4
 _____________ _

    This program  is  included  merely  to  show  how  errors  may  be
    handled,  use  of  the  -NOFAIL  option  and  the  nature of trace
    output.


    Statement 1 sets the keyword &TRACE to permit printing  of  up  to
    40  lines of trace output and the next two statements indicate the
    items to be traced.  In statement 4 a limit of 10 is  set  on  the
    number  of  errors  to be intercepted and processed by the program
    itself, whilst the destination label in  the  event  of  an  error
    occurring  is  identified  in  the  next statement.  The next line
    contains a syntax error which results in the printing of an  error
    message.   Following  statement  14 is a -NOFAIL control card, the
    effect of which  is  to  cause  generation  of  special  code  for
    subsequent  statements  containing  no conditional goto so that if
    such a  statement  does,  contrary  to  the  implied  expectation,
    actually  fail,  an  error  message  is  produced.  This can be of
    great diagnostic value.   The  output  from  the  run  illustrates
    various  points.   Execution  of  the program was not inhibited by
    the compilation error.  The number of any statement where a  trace
    association  is active is embedded in asterisks and printed on the
    left so that starting with statement 4, we can trace the  flow  of
    control  through the program on account of the trace intercept set
    on the keyword &STCOUNT.  It will be  seen  that  the  compilation
    error  in  statement 6 results in an execution error and that this
    in turn causes a transfer of control to statement  18  where  user
    processing  of  the error message is provided.  At statement 7 the
    ACCESS trace of the INPUT variable produces lines of trace  output
    indicating  the  value  which  it  currently  holds.   The jump to
    statement 10 followed by the STOPTR statement results  in  turning
    off  the  &STCOUNT trace.   An attempt to jump to the non-existent
    label L100 produces a failure,  followed  immediately  by  another
    when  an  attempt is made to form the sum 3 + 'L200'.  The loop at
    statements 16 and 17 reads 10 elements into the array A  and  then
    as  the  array  is  accessed outside its bounds, a statement error
    occurs which is converted  to  a  run  time  failure  because  the
    statement  was  compiled  in  -NOFAIL mode.  Had this not been the
    case the loop could have run for many seconds before  the  integer
    value  in I finally overflowed.  A correct program of course would
    have had a conditional goto such as

                              :F(ARRAY.FULL.OR.DATA.USED.UP)

    in statement 16.  The  failure  terminates  execution  because  at
    statement  13  the  limit  on the number of errors to be tolerated
    was reset to zero.








         MACRO SPITBOL V3.5
                                                   PAGE 69 - [10.4]
         Specimen Programs

    P R O G R A M   4                                              PAGE 1

          -PRINT
          *
          *    PROGRAM TO DEMONSTRATE TRACING AND ERROR HANDLING
          *
  1                 &TRACE   = &ANCHOR = &TRIM = 40
  2                 TRACE(.INPUT,'ACCESS')
  3                 TRACE(.STCOUNT,'K')
  4                 &ERRLIMIT = 10
  5                 SETEXIT(.ERROR)
  6                 STATEMENT , WHICH SHOULD FAIL TO COMPILE
                              ^
  ERROR 223 -- SYNTAX ERROR.  INVALID USE OF COMMA

  7       LOOP                                             :S($INPUT)F(FAIL)
  8       L1        OUTPUT   = '"L1"'                           :(LOOP)
  9       L2        OUTPUT   = '"L2"'                           :(LOOP)
  10      STOPTR    OUTPUT   = 'STOPTR'
  11                STOPTR(.STCOUNT,'K')                        :(LOOP)
  12      FAIL      X        = 3 + INPUT
  13                &ERRLIMIT =
  14                A        = ARRAY(10);     I = 1
          -NOFAIL
  16      READ      A<I>     = INPUT
  17                I        = I + 1                            :(READ)
          *
          *    ERROR INTERCEPT ROUTINE
          *
  18      ERROR     OUTPUT   = 'ERROR NO.  '  &ERRTYPE '  IN STATEMENT'
          .            &LASTNO
  19                OUTPUT   = 'REASON FOR FAILURE :- '  &ERRTEXT
  20                OUTPUT   =
  21                SETEXIT(.ERROR)                             :(CONTINUE)
  22      END


  STORE USED     1279
  STORE LEFT     4558
  COMP ERRORS    1
  REGENERATIONS  0
  COMP TIME-MSEC 400
















         MACRO SPITBOL V3.5
                                                   PAGE 70 - [10.4]
         Specimen Programs

  ****4*******  &STCOUNT = 4
  ****5*******  &STCOUNT = 5
  ****6*******  &STCOUNT = 6
  ****18******  &STCOUNT = 7
  ERROR NO.  7  IN STATEMENT  6
  ****19******  &STCOUNT = 8
  REASON FOR FAILURE :- COMPILATION ERROR ENCOUNTERED DURING EXECUTION
  ****20******  &STCOUNT = 9

  ****21******  &STCOUNT = 10

  ****7*******  &STCOUNT = 11
  ****7*******  INPUT = 'L2'
  ****9*******  &STCOUNT = 12
  "L2"
  ****7*******  &STCOUNT = 13
  ****7*******  INPUT = 'STOPTR'
  ****10******  &STCOUNT = 14
  STOPTR
  ****11******  &STCOUNT = 15
  ****7*******  INPUT = 'L1'
  "L1"
  ****7*******  INPUT = 'L100'


  ERROR NO.  38  IN STATEMENT  7
  REASON FOR FAILURE :- GOTO UNDEFINED LABEL

  ****12******  INPUT = 'L200'
  ERROR NO.  2  IN STATEMENT  12
  REASON FOR FAILURE :- ADDITION RIGHT OPERAND IS NOT NUMERIC

  ****16******  INPUT = '1.111111'
  ****16******  INPUT = '2.2'
  ****16******  INPUT = '3.3'
  ****16******  INPUT = '4.4'
  ****16******  INPUT = '5.5'
  ****16******  INPUT = '6.6'
  ****16******  INPUT = '7.7'
  ****16******  INPUT = '8.8'
  ****16******  INPUT = '9.9'
  ****16******  INPUT = '10.10'


  ERROR 035 -- UNEXPECTED FAILURE IN -NOFAIL MODE

  IN STATEMENT   16
  STMTS EXECUTED 51
  RUN TIME-MSEC  280
  MCSEC / STMT   5490
  REGENERATIONS  0







         MACRO SPITBOL V3.5
                                                   PAGE 71 - [11]
         Implementation Information



                   *---------------------------------*
                     [11] Implementation Information
                   | [11] Implementation Information |
                   *---------------------------------*

    SPITBOL  is  implemented  on  a   wide   variety   of   computers.
    Condsiderable  efforts have been made to achieve compatibility and
    portability between versions but inevitably  there  are  features,
    values  or  limitations  particular  to each implementation.  This
    section gives details for the VAX/VMS implementation.

    Note that version BCAB-2132  of  SPITBOL  or  higher  requires  at
    least VMS version 2.


 11.1  &CODE
 11.1  &CODE
 ___________
    The  default  value  for  &CODE  in  VAX/VMS SPITBOL is one.  This
    avoids a "successful completion" message  from  VMS  which  occurs
    when &CODE is zero on exit.

    The  value  of  &CODE  is  used on exit as the return code to VMS.
      There are two exceptions:

    - &CODE = 998 will print a message on termination  to  the  effect
      that the standard output channel is not available.

    - &CODE  =  999  will print a message on termination to the effect
      that execution was suppressed  (either  via  startup  switch  or
      control card).

    The  VMS message number 196648 corresponds to "CLI-F-ABORT" and is
    useful to signal general program failure  to  the  command  stream
    via $STATUS/$SEVERITY.


 11.2  &ERRTEXT
 11.2  &ERRTEXT
 ______________
    The  initial  value  of &ERRTEXT contains the startup command line
    text, excluding the command name and any trailing  comment.   When
    reloading  from  a saved EXIT(n) file, if the value of n was -2 or
    -1, the new command line will replace the value of &ERRTEXT.


 11.3  &STLIMIT
 11.3  &STLIMIT
 ______________
    The default value for &STLIMIT is one billion.  Maximum  value  is
    2,147,403,647.   Note  that statement counting and checking can be
    disabled by setting the value of &STLIMIT to -1.











         MACRO SPITBOL V3.5
                                                   PAGE 72 - [11.4]
         Implementation Information

 11.4  &TRIM
 11.4  &TRIM
 ___________
    Records are never implicitly padded with blanks  on  output.   For
    input,  any  trailing  blanks  received depend on the file and the
    value of &TRIM.


 11.5  Buffers
 11.5  Buffers
 _____________
    VAX/VMS  SPITBOL  contains  an  additional  datatype  called   the
    BUFFER.   This  is  described  in  the  section  on datatypes.  In
    addition, new functions BUFFER, INSERT and APPEND have been  added
    to  support  buffers.   These functions are described in detail in
    Section 5.














































         MACRO SPITBOL V3.5
                                                   PAGE 73 - [11.6]
         Implementation Information



 11.6  Character Set for VAX/VMS SPITBOL
 11.6  Character Set for VAX/VMS SPITBOL
 _______________ ___ ___ _______ _______

    Character codes can  be  a  considerable  locus  of  confusion  in
    SPITBOL.   The  SNOBOL4  language  does  not  define  a "standard"
    graphic set, so in general an attempt has been made to conform  to
    the   original  IBM/360 EBCDIC symbology where possible (excluding
    the 'extended graphics').  This is the character style most  often
    used in references and manuals.

    The  point where this is most likely to cause problems is with the
    binary   bar   (alternation),   which   in   many   other    ASCII
    implementations  is  the exclamation point.  Such programs as make
    use of this convention must be editted -  OPSYN cannot be used  to
    redefine  a  system  operator's  semantics in MACRO SPITBOL.  Note
    also that the unary not-sign may be different.

    The correspondence between the  SNOBOL4 and VAX/VMS Macro  SPITBOL
    source program character set is as follows:

    Character Name
    _________ ____
                        IBM SNOBOL4
                        ___ _______
                                       VAX/VMS SPITBOL
                                       _______ _______

    Digits
                        0..9
                                       0..9
    Letters
                        A..Z
                                       A..Z a..z
    Left Parenthesis
                        (
                                       (
    Right Parenthesis
                        )
                                       )
    Left Angle Bracket
                        <
                                       < or [
    Right Angle Bracket
                        >
                                       > or ]
    Colon
                        :
                                       :
    Semicolon
                        ;
                                       ;
    Comma
                        ,
                                       ,
    Equal Sign
                        =
                                       =
    Double Quote


         MACRO SPITBOL V3.5
                                                   PAGE 74 - [11.6]
         Implementation Information

                        "
                                       "
    Single Quote
                        '
                                       '
    Negation
                        <Not-Sign>
                                       ~
    Query
                        ?
                                       ?
    Dollar Sign
                        $
                                       $
    Point
                        .
                                       .
    Exponentiation
                        **
                                       ** or !
    Percent
                        %
                                       %
    Asterisk
                        *
                                       *
    Divide
                        /
                                       /
    Plus
                        +
                                       +
    Minus
                        -
                                       -
    At
                        @
                                       @
    Blank
                        <Blank>
                                       <Blank> or <Tab>
    Alternation
                        |
                                       |
    Number Sign
                        #
                                       #
    Ampersand
                        &
                                       &
    Underscore
                        not avail.
                                       _





         MACRO SPITBOL V3.5
                                                   PAGE 75 - [11.7]
         Implementation Information



 11.7  Form of DATE String
 11.7  Form of DATE String
 __________ __ ____ ______
    DATE() returns an 22 character string of the form:

                          MM-DD-YYYY HH:MM:SS.CC

                                                           M      D
    These  wall-time  components  designate  respectively: _onth, _ay,
    Y     H     M       S                      C
    _ear, _our, _inute, _econd and Hundredths (_enti-) seconds.


 11.8  Errors
 11.8  Errors
 ____________
    In addition to the errors  issued  by  the  interpreter,  the  VMS
    interface  may  detect a number of conditions which it will report
    using the default VMS condition handler.

    There follows the list of SPITBOL's VMS-specific errors,  and  the
    severity  of  the  error.  Errors which have a severity of warning
    or less can be suppressed  with the /NOWARN startup  command  line
    switch.   (An  exception are the messages generated as a result of
    an exception caused by a LOADed function image.)   Errors  with  a
    listed  severity  of "Severe" will generally cause execution to be
    aborted  with  the  DCL   $STATUS  and   $SEVERITY   symbols   set
    appropriately.   Although  more  messages  may  be  added  in  the
    future, existing message symbols and values will not.


     Error Name    Severity          Description

     EXIT           Info     EXIT Module Saved - <Filename>

     EXSUP          Info     Execution Suppressed

     INSVIRMEM      Severe   Insufficient Virtual Memory
       This can occur if the value specified on the /MINT switch, or
    if
       the value of the system VIRTUALPAGECNT parameter is too low (it
       should generally be at least 4000.)

     LINETRUNC      Warning  Input Source Line Truncated

     LOADCRC        Severe   Load Incompatible, Please Retranslate
    Source
       SPITBOL has been modified since the EXIT(-n) module was saved.

     LOADMEM        Severe   <No longer used>

     LOADOPEN       Severe   Can't Open LOAD File - <Filename>

     LOADMAP        Severe   Error Mapping LOAD File - <Filename>

     LOADUNEXCOND   Warning  Loaded Function Failed To Handle
                               Condition At PC=<Hex PC>
       An external LOADed function was invoked and generated an
    exception
       condition which it did not handle.  Check to see that the image


         MACRO SPITBOL V3.5
                                                   PAGE 76 - [11.8]
         Implementation Information

       base address was properly specified.

     LOADUNEXTRY    Warning  Will Attempt to Recover By Forcing
    Failure
       A loaded function was unable to return an acceptable result, so
       SPITBOL attempts to continue execution by simulating failure.

     LOADVERS       Severe   Load Versions Incompatible,
                               Please Retranslate Source
       The version of SPITBOL used to save an EXIT(-n) module was not
       the same as the one being used to load it.

     NOSYSOUT       Severe   Output File Not Accessable
       The /LIST= or /OUT= device/file could not be opened for
    writing.

     NOTEXITMOD     Severe   File is Not a Saved EXIT File -
    <Filename>
       The file implied or specified by /LOAD was not a saved SPITBOL
       EXIT(-n) file.

     OPENOUT        Severe   Error Opening <Filename> as Output

     OPENIN         Severe   Error Opening <Filename> as Input

     PAUSE          Info     Paused at Statement <Stmt #>
       This is issued as a consequence of executing an EXIT(0).  Enter
       CONTINUE to resume execution.

     STACKOVFL      Severe   Virtual Stack Space Exhausted
       This is a severe stack overflow which will not be seen (SPITBOL
       will issue its own stack overflow through the standard error
       handling mechanism) unless SPITBOL is improperly linked.

     SYNTAX         Severe   Syntax Error In Command Line

     BADLINK        Severe   Incorrectly specified BASE(s) in SPITBOL
    link
       The symbol LOAD_BASE is higher than the start of the
    interpreter
       (BASE=) or STACK_LIMIT is too close to LOAD_BASE.

     LOADBADINT     Warning  Loaded function returned invalid
                               integer result pointer

     LOADBADREAL    Warning  Loaded function returned invalid real
                               number result ptr

     LOADBADSTRING  Warning  Loaded function returned invalid string
                               descriptor

     LOADBADUNCONV  Warning  Loaded function returned bad block for
                               unconverted result





         MACRO SPITBOL V3.5
                                                   PAGE 77 - [11.9]
         Implementation Information



 11.9  EXIT Function Usage
 11.9  EXIT Function Usage
 __________ ________ _____
    The EXIT  function  has  been  implemented  in  all  forms  except
    positive  integer  arguments  (that  is  to say, there is no total
    image save).  Each of the forms is described below.


 11.9.1  EXIT(0) Usage
 11.9.1  EXIT(0) Usage
    EXIT(0) will pause the program with a message;  a  DCL  "CONTINUE"
    command  will  continue  execution.  The message can be suppressed
    with the /NOWARN command line option.


 11.9.2  EXIT(String) Usage
 11.9.2  EXIT(String) Usage
    EXIT(string) will cause SPITBOL  to  exit  and  "string"  will  be
    given  to  the command interpreter as the next command.  Note that
    this subsumes the normal SPITBOL  semantics  of  EXIT(string)  for
    chain  execution  if the string is of the form "RUN image".  It is
    also possible to initiate a command file  (including  one  written
    by   the   program   itself)   if  the  string  is  of  the  form:
    "@command-file".


 11.9.3  EXIT(-n) Usage
 11.9.3  EXIT(-n) Usage
    EXIT(-n) is implemented, and will save the impure segments of  the
    interpreter  in  a  specially formatted block mode file.  The name
    for this file is the same as the  standard  input  file,  with  an
                      S       EX
    extension ".SEX" (SPITBOL EXit!) under the default directory.   If
    such  a  file already exists, it will be reused (with an extension
    of space if required), otherwise a new file  is  allocated.    The
    startup   switch   "/LOAD[=filename]"   can  be  used  to  load  a
    previously saved .SEX file.  If the "=filename" is  not  specified
    on  the  load, the default LOAD name is the same as that described
    above.  Specification of  /LOAD  does  not  obviate  the  need  to
    specify  a standard input file, although it need not have the same
    name as the save file,  and trivially could be "NL:" if no use  is
    to be made of the standard input channel.

    Certain  remarks are in order regarding this form of EXIT.  When a
    previously saved .SEX file is loaded, SPITBOL  performs  a  number
    of  fairly  extensive  checks to verify that the segment was saved
    under the same version of SPITBOL that is being used to  load  it.
    If  it is not, the load will not work and one of a number of fatal
    errors will be issued.  The conclusion should  be  that  the  file
    created  by  EXIT  is not really analogous to a "permanent" object
    or executable binary.   The  original  source  and  data  must  be
    retained in the event that a retranslation is indicated.

    One  other point should be noted as regards EXIT(-n).  Neither the
    status of open files, nor the contents of LOAD(...)  functions  is
    preserved  across  an  EXIT(-n);  this includes the standard input
    and output files, which are instead associated anew when the  exit
    module  is reloaded using the filenames given on the /LOAD startup
    line.   In general, INPUT(...), OUTPUT(...)  and  LOAD(...)  calls
    must  be  made  after  the  call  to  EXIT(-n).   In addition, the


         MACRO SPITBOL V3.5
                                                   PAGE 78 - [11.9.3]
         Implementation Information

    load-time  values  (default  or  explicit)  of  /MINC  and   /MINT
    override  whatever  values were in effect when the exit module was
    saved (SPITBOL will, however,  always  attempt  to  obtain  enough
    virtual  space  to  hold  the  impure  data  of  the  exit module,
    regardless of the setting of /MINT.)  If the EXIT(-1) or  EXIT(-2)
    forms  are  used,  then  the load-time values of the other startup
    command line switches override the  values  at  the  time  of  the
    EXIT.


 11.10  FENCE(PATTERN)
 11.10  FENCE(PATTERN)
 _____________________
    VAX/VMS  SPITBOL contains an additional intrinsic pattern matching
    function called FENCE.  This function is described  in  Section  5
    in detail.


 11.11  HOST
 11.11  HOST
 ___________
    The  only defined entry to HOST is when all arguments are null, in
    which case, HOST() returns the identifying string of the form:

                  VAX:VMS:sitename:username:accountname

    "Sitename" is derived from  a  translation  of  the  logical  name
    "SYS$SITENAME"  to  obtain  a  site name both for HOST and for the
    banner.  The translated string must be 28 or fewer characters.


 11.12  Range of Integers
 11.12  Range of Integers
 ____________ __ ________
    Integers are represented in a single  VAX  32-bit  longword.   The
    range for integers is: [ -2,147,483,648 , +2,147,483,647 ].




























         MACRO SPITBOL V3.5
                                                   PAGE 79 - [11.13]
         Implementation Information



 11.13  INPUT/OUTPUT
 11.13  INPUT/OUTPUT
 ___________________
    All  VAX/VMS  Macro  SPITBOL  I/O is processed through RMS (Record
    Management Services).  The general form of the  INPUT/OUTPUT  call
    in Macro SPITBOL is:

                      XXXPUT(Var,Filearg1,Filearg2)

    "Filearg1"  may  be any Macro SPITBOL object that can be converted
    to a name (e.g. number or string).  It has no significance to  the
    I/O  system  as  such,  however  it represents a unique binding to
    this I/O channel,  and it can thus be used in subsequent calls  to
    INPUT,  OUTPUT,  REWIND,  ENDFILE and EJECT.  If Filearg1 is null,
    an INPUT call refers to the standard  input  channel  association,
    and  an  OUTPUT  call  similarly  refers  to  the  standard output
    channel.   It  is  permitted  to  reassign  these   channels   via
    INPUT/OUTPUT,  but note that SPITBOL does not allow null arguments
    to REWIND or ENDFILE.

    "Filearg2" differs slightly from the form shown in Section  5  for
    the INPUT and OUTPUT functions, and has the form:

                       "Filespec/Switch/Switch/..."

    where  all  components,  including  "Filespec"  are  optional.  If
    Filespec is given, the current channel (if any) is closed out  and
    a  new  association  to the given Filespec is created.  "Filespec"
    is  given   in   standard   VMS/RMS   form   for   a   device/file
    specification.   If  the  Filespec  is  omitted  then any switches
    specified are processed  for  the  association,  but  the  present
    association  to  the  channel  remains  unchanged.   If the entire
    Filearg2 is null, then this  reduces  to  simply  I/O  associating
    "Var" to the channel designated by Filearg1.

    Any  given "Filearg1" channel can be associated for both INPUT and
    OUTPUT, however any such dual associations must  be  formed  prior
    to  opening  the  channel  in order to avoid an RMS error when the
    channel is used in a  manner  for  which  is  was  not  originally
    opened.   A  channel  is opened for I/O activity indirectly due to
    the first I/O reference to it.  The call to  INPUT  or  OUTPUT  by
    itself  causes no I/O activity, but only establishes the nature of
    the variable-to-channel and channel-to-file associations that  can
    be   used  later.   The  first  I/O  reference  to  a  channel  or
    channel-associated variable causes either an OPEN or CREATE to  be
    issued.   The  OPEN  (an existing file) is issued unless an OUTPUT
    association to the channel has been made, in which case  a  CREATE
    (new  file)  will  be issued.  The occurrence of some switches can
    modify this default action.

    Note that all I/O sequential in nature; the default mode  of  file
    creation  is  variable-length,  carriage  return  delimited record
    attributes.   It is possible to  process  existing  indexed  files
    transparently  through RMS, however, sequential access is the only
    processing   mode   available,   regardless    of    the    file's
    characteristics.


         MACRO SPITBOL V3.5
                                                   PAGE 80 - [11.13.1]
         Implementation Information



 11.13.1  FILEARG2 SWITCHES
 11.13.1  FILEARG2 SWITCHES
    The   following   switches  are  available  for  specification  on
    Filearg2.  They must be specified in upper-case.  In  many  cases,
    it  is  possible  to  precede  the  switch name by the prefix "NO"
    which indicates that the condition indicated by the switch  is  to
    be  inverted  for  this channel.  For switches which apply only to
    terminal I/O, their presence is ignored when  dealing  with  other
    devices or files.

        SWITCH           _ _ _ _ _ _ _ _ _ _ _
        ______           D_E_S_C_R_I_P_T_I_O_N

         /CCO   Cancel   terminal   control  O  on  subsequent  output
                operations.
         /CIF   If  the  named  file  already  exists,  it  is   used.
                Otherwise,  a  new  file  is created.  Note that if an
                existing  sequential  variable-length  file  is  being
                processed,  /EOF  must  also  be  specified  since RMS
                cannot  rewrite   records   in   such   files.    This
                restriction does not apply to indexed files.
         /CR    Set  CR/LF  file  attributes  for  CREATE  operations.
                Note that an  output  association  to  "TT:/-CR"  will
                thus  suppress the usual carriage return and line feed
                after each output assignment to the terminal.
         /DLT   Delete the file when it is closed.
         /EOF   Position  to  end-of-file  on  open.   If  an   OUTPUT
                association  has  been made, the presence of /EOF will
                cause an OPEN to be issued rather than a CREATE.
         /FTN   Set  FORTRAN-type  carriage  control  attributes   for
                CREATE.   This  switch  is mutually exclusive with the
                "CR" switch.
         /MXV   Maximize the version number of the file  on  a  CREATE
                between  any specified version and one higher than the
                highest existing verion.
         /PTA   Purge the terminal type-ahead  buffer  for  subsequent
                terminal input on this channel.
         /RNE   For  a  terminal  input-associated channel, subsequent
                input is not to be echoed.
         /RNF   For terminal-associated  input,  control-U,  control-R
                and  DELETE  characters are passed in the input string
                and are not taken as control characters.
         /SCF   Submit this file to the system standard  batch  stream
                when it is closed.
         /SPL   Submit  this  file  to the system standard spool queue
                when it is closed.
         /SUP   Supercede any existing file on CREATE.
         /TEF   Truncate the file to actual EOF when it is closed.










         MACRO SPITBOL V3.5
                                                   PAGE 81 - [11.13.2]
         Implementation Information



 11.13.2  I/O EXAMPLES
 11.13.2  I/O EXAMPLES
    Here are a few examples of INPUT/OUTPUT calls.  The  colons  (":")
    represent code sequences which are not shown.

    1. Attach  the user's terminal for input without echoing the first
       line read in.

            INPUT(.TTNE,1,'TT:/RNE')
                     :
            FIRST_LINE = TTNE
            INPUT(.TTNE,1,'/NORNE')
                     :


    2. Write  to  a  new  file  OUT.DAT  and  spool  it  when  SPITBOL
       terminates.

            OUTPUT(.OUTFILE,1,'OUT.DAT/SPL')


    3. Write  to  an  intermediate  file, then rewind it, read through
       it, and delete it.

            INPUT(.INTER,1,'SCRATCH.DAT/DLT')
            OUTPUT(.INTER,1)
                    :
       WRITELOOP
            INTER = X
                    :
            REWIND(1)
       READLOOP
            X = INTER   :F(EXIT)
                    :
       EXIT
            ENDFILE(1)
       END


    4. Append the record "***END***" to an existing file:

            OUTPUT(.OLDFILE,1,'OLDFILE.DAT/EOF/CIF')
            OLDFILE = '***END***'
       END













         MACRO SPITBOL V3.5
                                                   PAGE 82 - [11.14]
         Implementation Information



 11.14  Linking SPITBOL
 11.14  Linking SPITBOL
 ______________ _______


    SPITBOL is delivered pre-linked and ready for use.  Some sites  or
    users  may  wish  to  link their own copies.  Modifications to the
    source are not encouraged, as it renders much more  difficult  the
    process  of  diagnosing  trouble  reports.  If trouble reports are
    submitted, the implementor requests that the original,  unmodified
    interpreter be used to provide the necessary information.

    The normal link command is:

         $
         _ LINK/SYMB=SYS$SYSTEM:SPITBOL/EXE=SYS$SYSTEM:SPITBOL -
         $
         __     SYS$LIBRARY:SPITBOL/OPT

    The recommended SPITBOL.OPT linker options file is:

         SPITV35,SPITGO,SPITMSGS,SPITSYS,SPITIOSYS,-
         SYS$SYSTEM:SYS.STB/SELECT
         BASE=%X100000
         IOSEGMENT=128
         STACK=10
         SYMBOL=LOAD_BASE,%X7FE00
         SYMBOL=STACK_LIMIT,%X10000

    Note  that  VAX/VMS  SPITBOL  is  a  licensed product and sources,
    objects and executable images are for use only  on  the  system(s)
    where  the  license  applies.   This applies both to the delivered
    files as well as any modified versions of them.


 11.15  Terminal Listing Options
 11.15  Terminal Listing Options
 _______________ _______ _______
    If  the  standard  output  channel  is  a  terminal   device,   an
    abbreviated  listing  format  is  used  by default.  See below for
    details.





















         MACRO SPITBOL V3.5
                                                   PAGE 83 - [11.16]
         Implementation Information



 11.16  LOAD Function Usage
 11.16  LOAD Function Usage
 ___________ ________ _____
    The LOAD function is implemented with the  general  philosophy  of
    permitting  a  true  dynamic  load  of  externally  linked  images
    without  any  necessity  for  resorting  to  MACRO-32  or  similar
    machine-level  coding.  The first argument to LOAD is as described
    in Section 5.  The second argument  string  is  the  name  of  the
    image  to  be  loaded.   The usual defaults (those of the process)
    apply to this  name;   the  default  extension  is  ".EXE".   This
    string  should  never  be null, that form is reserved for a future
    implementation of a static LOAD.

    The  general  process  for  creating  a  LOADable  image  can   be
    summarized as follows:

      1. Prepare  and  debug  the  external  subroutine(s) you want to
         link into  a  loadable  function.   The  code  should  be  as
         thoroughly   checked   out  as  possible.    Debugging  under
         control of SPITBOL is difficult, and in extreme  cases,  bugs
         can  corrupt  the  interpreter's  store,  making them all but
         impossible to locate.

         Any language(s) can  be  used  to  program  the  subprograms,
         however  users of high-level languages usually need to follow
         some special guidelines (see below).

      2. Link an image consisting of the modules required.  The  image
         must  be  linked  at  a  suitable base address if it contains
         positionally dependent content (see below).  The link  should
         incorporate  a  search  of  SPITBOL's  symbol  table to avoid
         duplication of  the  run-time  library  in  the  image's  own
         virtual  space.   The  image  must  have  a  defined transfer
         address in user space.

      3. Run the  SPITBOL  program  and  issue  the  LOAD  call.   The
         function can now be used as an ordinary SPITBOL function.

    Details on each of these steps follow.



















         MACRO SPITBOL V3.5
                                                   PAGE 84 - [11.16.1]
         Implementation Information



 11.16.1  High-Level Languages and LOAD
 11.16.1  High-Level Languages and LOAD
    Images  invoked  by  LOAD are not entered via the image activator.
    Instead,  SPITBOL  gets  to  them  via   an   ordinary   CALL-type
    instruction  to  the  entry  point  of  the image.  Note that most
    "high-level  languages"  do  not  support  the  declaration  of  a
    parameterized subprogram as an image entry point.

    To  permit  the use of such languages for LOAD functions, a module
    to solve the problem just described is provided with  the  SPITBOL
    delivery  in  SYS$LIBRARY:SPITHLS.OBJ.   This  module  defines  an
    entry point, and  then  jumps  one  word  past  the  global  label
    SPIT$LOAD_ENTRY.   (The  one  word  is  to  bypass the procedure's
    register save mask.)  This means that the entry subprogram of  any
    LOADable   function    which   uses   SPITHLS.OBJ  must  be  named
    SPIT$LOAD_ENTRY.


 11.16.2  Calling Conventions for LOAD
 11.16.2  Calling Conventions for LOAD
    All  arguments  to  LOAD  are  transmitted  to  the  function   by
    reference  pointers  to  values  on the stack (in P1 space).  (The
    only exception  is  unconverted  arguments  which  are  passed  by
    reference  to  a  block  in SPITBOL's dynamic area.)  The function
    may  overwrite  these  stacked  values  freely,  since  they   are
    discarded  when  the  function  returns.   It goes without further
    comment that in no case should an attempt ever be  made  to  store
    outside the defined length of the value.

    If  a  LOADed function requires a dynamically sized memory area to
    work in, the LOAD prototype can specify a 'junk'  parameter  which
    can  be  a  string  of the appropriate length when the function is
    called.  LOADed functions should under  no  circumstances  attempt
    to  dynamically  map  their  own  virtual  memory since this would
    likely interfere with SPITBOL's own allocation process.

    It may, for  some  applications,  be  helpful  to  be  aware  that
    arbitrary binary data can be stored in strings and buffers.


 11.16.3  Return Conventions for LOAD
 11.16.3  Return Conventions for LOAD
    When  an  external  function  is  ready  to  return, it may signal
    success or  failure,  and  if  it  succeeds,  it  must  return  an
    appropriate  result  of  the  type described by the LOAD prototype
    for the function.

    Success or failure is indicated on return by the low order bit  of
    R0,  according  to the normal VAX/VMS convention (the remainder of
    the register is ignored).

    If the low bit of R0 is set on  return,  this  indicates  success,
    and  R1  points  to  an  integer  value,  real  value,  or  string
    descriptor as appropriate for the function.   This  is  the  value
    that will be returned to SPITBOL as the result of the call.




         MACRO SPITBOL V3.5
                                                   PAGE 85 - [11.16.3]
         Implementation Information

    Many   high-level   languages   do  not  have  the  capability  of
    returning  values  in  this  manner,  so   SYS$LIBRARY:SPITHLS.OBJ
    contains  two  additional  entry  points, SPIT$SUCCESS_RETURN(obj)
    and SPIT$FAIL_RETURN().  These are co-routine  entry  points  that
    can  be called using the VAX/VMS standard calling conventions, and
    will make adjustments to the  stack,  R0  and  R1  and  return  to
    SPITBOL.   "Obj" is the address of the returned value when success
                                                        must
    is  to  be  indicated.   Both of these entry points must be called
    from the same level as when the function was  originally  entered,
    that  is,  at the same point in execution where the function would
    normally return.

    Before the LOADed function is invoked, and also  when  the  result
    is  being  checked,  SPITBOL  establishes a condition handler that
    will receive control if any exceptions  occur.   These  exceptions
    typically  are  the result of an error in the function itself,  an
    improper specification of argument or result  types  in  the  LOAD
    call,    or  an  improper  link  of a non-PIC function (see below)
    causing invalid addresses to  be  returned  to  SPITBOL.   In  any
    event,  this handler will, after printing a message indicating the
    cause of the error, attempt recovery by  forcing  failure  of  the
    function  call.   This  will  generally allow SPITBOL execution to
    continue.  Note that this handler will  only  receive  control  in
    the  event  that  the  user's function does not properly field the
    condition itself.


 11.16.4  Linking External Functions
 11.16.4  Linking External Functions
    Like the old saw  about   how  to  shave  a  gorilla,  linking  an
                                         very
    function image for LOAD must be done ____ carefully.  As  a  rule,
    you  will  have  an  easier  time  of it if the image to be linked
    contains solely position independent content  (PIC),  though  this
    is not absolutely necessary.

    SPITBOL  reserves a set of pages between an address defined by the
    link-time symbol LOAD_BASE, and the bottom of the interpreter  for
    loading  images.    LOAD_BASE  is  defined in the SPITBOL.OPT link
    options file and is normally hex 7FE00

    When requested by a LOAD(...) call  to  load  an  external  image,
    SPITBOL  first  allocates the next available page in this area for
    image information, and maps the image itself directly  above  this
    page,  taking  as  many  pages  as required.  The base address (if
    any) specified to the linker when the image was generated  has  no
    effect  on the base address of the load.   So even if the image is
    not PIC, it is possible to predict  in  advance  where  the  image
    will  be  loaded.  Knowing this, the image can be linked with this
    location as the  base  address.   Note  that  if  several  non-PIC
    images  are to be loaded with different LOAD(...) calls, the order
    of the loading is significant.

    As an example, suppose you have an object module called  PROCSTATS
    produced  by VAX/VMS Fortran V2 (non-PIC) which you wish to use as
    a LOAD function.  You would link the image with a  linker  command
    such as:



         MACRO SPITBOL V3.5
                                                   PAGE 86 - [11.16.4]
         Implementation Information

           $ LINK/MAP PROCSTATS,SYS$LIBRARY:SPITHLS,-
             SYS$SYSTEM:SPITBOL/SELECTIVE_SEARCH,PROCSTATS/OPT

    The  reason for linking against SPITBOL's symbol table is to avoid
    including the VMS shareable run-time library  in  the  image.   In
    some  cases,  there will also be global symbols of interest in the
    interpreter  to  which  the  program  will   need   access.    The
    PROCSTATS.OPT  options  file  would contain at least one statement
    to  define  the  base  address  of  the   image   of   the   form:
    "BASE=%X80000".    This  is  one  page  above  the usual LOAD_BASE
    (%X7FE00) to leave room for the image data page  which  is  always
    allocated first by SPITBOL.

    If  additional  non-PIC images were to be linked, the total amount
    of virtual space used by images to be loaded first would  have  to
    be  calculated,  in  order  to  determine  the  actual load (base)
    address. For images which are entirely PIC, the  base  address  is
    irrelevant.   Note that for languages such as Fortran, the code is
    PIC but the pure data is not.


 11.16.5  Unconverted Values and Results for LOAD
 11.16.5  Unconverted Values and Results for LOAD
    If a type other than "INTEGER", "STRING", or "REAL"  is  indicated
    in  the  first  argument of the call to LOAD, the value is said to
    be "unconverted."

    In the case of passed arguments, a pointer to the  internal  block
    for  the  argument is given to the program.  The first longword of
    any such block is a SPITBOL block-type  word.   The  remainder  of
    the  block  is vertically encoded depending on the block-type.  No
    discussion of the internals of the interpreter are provided  here.
    The  source  listing  gives  a complete description of the storage
    blocks  for  SPITBOL   and   should   be   consulted   by   anyone
    contemplating using unconverted values.

    In  the  case  of  returned  values,  a pointer to the unconverted
    result must  be  in  R1  (returned  value  register).   The  block
    pointed  to must be in SPITBOL-correct format, including the value
    of the block-type  word.   It  will  be  copied  by  SPITBOL  into
    dynamic memory upon return.


















         MACRO SPITBOL V3.5
                                                   PAGE 87 - [11.17]
         Implementation Information



 11.17  MXLEN
 11.17  MXLEN
 ____________
    The   value   of   MXLEN  is  approximately  1,000,000.   This  is
    controlled by the "BASE=..." option  in  the  SPITBOL.OPT   linker
    options  file.   It is not recommended that this value be reduced,
    as it will limit the size  of  objects,  and  reduce  the  virtual
    space available for mapping in external (LOAD) images.


 11.18  Real Arithmetic
 11.18  Real Arithmetic
 ___________ __________
    Available  in  single  precision  with  a  printing  accuracy of 6
    digits.


 11.19  Extended Character Set
 11.19  Extended Character Set
 _______________ _________ ___
    All 256 8-bit ASCII codes are in  &ALPHABET.   The  tab  character
    may be used lexically in place of the space.


 11.20  REWIND
 11.20  REWIND
 _____________
    Available.


 11.21  Running SPITBOL
 11.21  Running SPITBOL
 ______________ _______


    SPITBOL  must  be  started with a command line in order to specify
    filenames for the standard channels, and  to  explicitly  override
    any  default  processing options.  This means that SPITBOL must be
    installed as a foreign command so that it can  recieve  a  command
    line.   If  SPITBOL  has  not been installed as a foreign command,
    this can be done individually by the  user  by  entering  the  VMS
    command:

                         $
                         _ SPIT*BOL :== $SPITBOL

    The  system  manager  normally  adds  this to the systemwide login
    command file as a part of the SPITBOL  delivery  process,  so  the
    above should not be necessary.

    The general form of the SPITBOL startup command line is:

            $ SPITBOL/switch... input-file/switch... "Any Text

    The  input-file  sets  the  identity of the standard input channel
    for SPITBOL.   The default extension  for  this  file  is  ".SPT".
    The  standard input channel represents the program source, and any
    data for  the  preassociated  INPUT  variable.   Such  data  input
    should  thus  immediately  follow the END statement of the source.
    All switches are optional.

    If no input-file is given, or  if  SPITBOL  is  unable  to  get  a
    command line, the default input-file will be SYS$INPUT.




         MACRO SPITBOL V3.5
                                                   PAGE 88 - [11.21]
         Implementation Information

    The  initial  value of the startup command line as provided by the
    VMS Command Line Interpreter (CLI) is  assigned  to  the  &ERRTEXT
    keyword.  This makes it possible to examine the command line as it
    is given to SPITBOL, in order  to  determine  filenames,  switches
    and  the like.   (The assignment to &ERRTEXT is made just prior to
    execution, and is  not  affected  by  any  preceeding  compilation
    errors.)   Note that the CLI will compress runs of tabs and blanks
    into single blanks, and place all unquoted  text  in  upper  case.
    Also  note that the command string begins with the first non-blank
               following
    character  _________  the VMS command name.   CLI "comments" (text
    following an unquoted "!" on the  command  line)  are  not  passed
    either.

    SPITBOL  recognizes  a  double-quote (") as an end-of-command line
    delimiter.  Any text following the double-quote  will  be  ignored
    by  SPITBOL,  but  will  appear  intact  in  the  initial value of
    &ERRTEXT.  This provides a mechanism for  passing  arbitrary  text
    into  the  program  from the command line.  The CLI will not alter
    the text following this double quote.

    It should be pointed out that the availability of startup  command
    line  text  in  &ERRTEXT is an addition in VAX/VMS SPITBOL, and is
    not  necessarily  portable  to  other   implementations   of   the
    language.

    In  some  cases,  there  may  be  a SPITBOL application or utility
    program for which a "custom" command  may  be  desired.   This  is
    easily achieved with a definition something like:

        $
        _ SPUTIL :== $SPITBOL/OUT=TT:/LOAD=SYS$LIBRARY:SPUTIL NL:

             $
    Typing  "_SPUTIL"  as  a VMS command will then load the saved EXIT
    file named SPUTIL in SYS$LIBRARY and execute it with the  standard
    output  file assigned to the terminal.  Other permutations will be
    useful depending on the particular application.























         MACRO SPITBOL V3.5
                                                   PAGE 89 - [11.21.1]
         Implementation Information



 11.21.1  Startup Switches
 11.21.1  Startup Switches
    Startup switches are optional in the sense that there are  defined
    defaults  for  all  of  them  that  should be adequate most of the
    time.  Switch names can be abbreviated to the minimum  unambiguous
    length.  A syntax error in the startup command line will cause the
    interpreter to exit with a message.

    Switches may appear at any point in the command  line;   they  are
    processed  left-to-right.   There  are no 'file-specific' switches
    as with some VMS languages, all switches are global.  The  use  of
    multiple  input  files separated either by commas or plus signs is
    not
    ___ supported.

    These are the switches provided on  the  SPITBOL  startup  command
    line:


     1.  /CRC /NOCRC
         This  switch  is  only  meaningful  on a /LOAD=... operation,
         where the specification of  /NOCRC  will  bypass  the  cyclic
         reducdancy  check of the SPITBOL code region.  The purpose of
         this check is to insure that the  version  of  SPITBOL  being
         used  is  the same as the version under which the exit module
         was saved.  As SPITBOL  also  checks  version  identification
         data  and  other  parameters, the overhead for this check may
         be considered unnecessary for frequently used  load  modules.
         In  such  cases,  /NOCRC  can  be  profitably specified.  The
         default is /CRC.

     2.  /CSTATS /NOCSTATS
         This  switch  will  suppress  the  printing  of   compilation
         statistics  on  the  output  file.  "/CSTATS" is the default.
         If /NOLIST has been specified, the default is /NOCSTATS.

     3.  /ESTATS /NOESTATS
         This  switch  will  suppress  the   printing   of   execution
         statistics  on  the  output  file.  "/ESTATS" is the default.
         If  /NOLIST  has  been  specified,  then   the   default   is
         /NOESTATS.

     4.  /EXECUTE /NOEXECUTE
         This  switch  has  the  same  logical effect as a  -NOEXECUTE
         control card in the source  program.   SPITBOL  will  process
         the  source  program,  and  then  exit  with  a  message that
         Execution Was Suppressed.  The default is "/EXECUTE".

     5.  /LIST[=filename] /NOLIST
         The /LIST switch allows specification  of  the  filename  for
         the  standard  output  channel.   If  a  terminal  device  is
         specified for the  /LIST  switch,  then  form  feeds  in  the
         program  listing  will be suppressed.  The default device and
         account for this  file  is  the  same  as  that  under  which
         SPITBOL  is  being run.  The default name for the output file
         is the input  file's  name,  and  the  default  extension  is


         MACRO SPITBOL V3.5
                                                   PAGE 90 - [11.21.1]
         Implementation Information

         ".LIS".   The  program listing and compilation statistics are
         sent to this file.  If neither of  /OUTPUT=...  or  /NOOUTPUT
         are  also  specified  on  the  command  line,  then execution
         output is also directed to this file.  This  includes  OUTPUT
         assigned text and TRACE and DUMP output.

         The  /NOLIST  switch  indicates that source listing is not to
         be generated. /NOLIST also causes an implicit  /NOESTATS  and
         /NOCSTATS.   Note  that  the  appearance  of /NOLIST does not
         mean that no output will  be  sent  to  the  standard  output
         channel.   However,  if the program makes no reference to the
         standard output channel, then if /NOLIST is  specified,  this
         channel will never be opened.

         /LIST  with  no  filename  inverts  the  effect of a previous
         /NOLIST  spec.   That  is,   enables   source   listing   and
         compilation statistics.

     6.  /MINC=nnn
         This  switch  controls the number of pages by which SPITBOL's
         working store is expanded when it becomes  exhausted.   Under
         normal  circumstances,  it should not be necessary to specify
         this switch, however, "/MINC=0" will prevent  any  additional
         allocation  to SPITBOL past the MINT allocation, and may thus
         be useful  in  preventing  the  unrestrained  growth  of  the
         interpreter.

         Even  if  MINC is non-zero, there are three cases which could
         concievably cause dynamic allocation of a SPITBOL  object  to
         fail.  These are:

            - The  size  of  the object exceeds &MAXLNGTH (MXLEN).  As
              this is initially greater than one million,  this  fault
              is  very  unlikely  to  occur  except as the result of a
              programming error.

            - If allocation would cause the virtual  memory  quota  to
              be  exceeded,  SPITBOL  will  print  a  MEMORY  OVERFLOW
              error, and terminate execution.  This is  also  unlikely
              on most systems.

            - If  SPITBOL  has  been  linked  allowing  RMS buffers to
              extend  in   P0  space  (linker  option  P0BUFS  -   the
              default),  then  with  a  large number of simultaneously
              open files  an  RMS  space  extension  would  block  the
              contiguous  growth  of  the  dynamic  area  and  cause a
              memory overflow.

         The default for this switch is "/MINC=20" which is 10K  bytes
         or about 2,000 SPITBOL 'words.'

     7.  /MINT=nnn
         This  switch  controls  the amount of  virtual memory (in 512
         Byte pages) that will be  initally  allocated  for  SPITBOL's
         working   storage   areas.   The  SPITBOL  VMS  interface  is
         designed to  permit  these  working  storage  areas  to  grow


         MACRO SPITBOL V3.5
                                                   PAGE 91 - [11.21.1]
         Implementation Information

         indefinitely,  as  long as the region remains contiguous, and
         there are pages available  in  the  process'  virtual  quota.
         However,  SPITBOL will not request additional memory from VMS
         unless it cannot get  enough  by  regenerating  its  existing
         store.   So,  this switch may be useful in some situations to
         avoid garbage collector  thrashing.   The  default  for  this
         switch  is  "/MINT=200"  which  is  equivalent to  about 100K
         bytes, or 25,000 SPITBOL 'words' (VAX Longwords).

         For most applications, the performance  will  increase  quite
         dramatically  as  real  memory  is made available.  Past that
         point, additional working set will improve  performance  only
         marginally.   As  the  dynamic  space  is  allowed  to become
         increasingly  virtual,  performance   will   very   gradually
         deteriorate  because  of  the  thrashing caused (principally)
         during garbage collection.  Thus as a general  guide,  it  is
         usually  best  to  minimize garbage collection at the expense
         of additional memory.

         Stack space is not included in the  MINT  allocation.   Stack
         is allocated automatically as needed.

     8.  /OUTPUT[=Filename]
         The  /OUTPUT=filename  switch  requests an alternate file for
         the standard output  channel  at  execution  time.   If  this
         switch  is  not  specified, then execution output is directed
         at the same file  as  the  source  listing  (/LIST=filename).
         This  file  is not opened until execution begins.  If at that
         time the channel cannot  be  opened,  SPITBOL  exits  with  a
         fatal status.

         /NOOUTPUT   directs  any  execution-time  references  to  the
         standard output channel to the null device (NL:)

         /OUTPUT with no  filename  restores  the  default  condition.
         That is, execution output is appended to the listing output.

         Note that /OUTPUT and /LIST are not synonymous.

     9.  /PAGE /NOPAGE
         If  this  switch  is specified, page separators in the source
         listing and statistics will be a few blank lines, instead  of
         form  feeds.   "/PAGE"  is  the  default, unless the standard
         output channel (see /OUTPUT switch) is a terminal,  in  which
         case "/NOPAGE" is the default.

         At  startup,  LIB$LP_LINES  is called to get the page length.
         From  the  value  returned  (66  unless  the   logical   name
         SYS$LP_LINES  is  assigned), six  is subtracted to leave room
         for page shoulders.

    10.  /WARN /NOWARN
         When /NOWARN is indicated on the command  line,  only  errors
         and  severe  errors  in  the  VMS  interface  logic  will  be
         reported on  SYS$ERROR.   This  can  be  useful  to  suppress
         messages  regarding source line truncation, exit module saves


         MACRO SPITBOL V3.5
                                                   PAGE 92 - [11.21.1]
         Implementation Information

         and similar messages. /WARN, the  default,  causes  reporting
         of such conditions.

         This  switch does not affect in any way SPITBOL's handling of
         errors with respect to the program.

    11.  /WIDTH=nnn
         SPITBOL attempts to compute a proper width for  the  standard
         output  file.   The switch "/WIDTH=n" can be used to override
         any  default.    Otherwise,   if   the   output   device   is
         record-oriented  (including  spooled  files),  the default is
         the buffer for the  device  as  indicated  by  VMS.   If  the
         buffer  size  cannot  be  obtained,  or  is outside the range
         [0..255], then a final default of 132 (decimal) is applied.












































         MACRO SPITBOL V3.5
                                                   PAGE 93 - [11.22]
         Implementation Information



 11.22  Stack Overflow
 11.22  Stack Overflow
 ____________ ________
    SPITBOL  stack  is  located  in  P0  (program)  space.   It  grows
    downwards  as  needed  from  LOAD_BASE  to STACK_LIMIT.  These two
    values are defined in the SPITBOL Link options file.  In  general,
    these  values  are  set  such  that stack overflow is not possible
    unless a program is truly out of control.


 11.23  TERMINAL
 11.23  TERMINAL
 _______________
    TERMINAL  is  available  and  is  associated  with  SYS$INPUT  and
    SYS$OUTPUT.   The  first  assignment  or  access to TERMINAL opens
    this channel.


 11.24  Time
 11.24  Time
 ___________
    All execution times in the VAX/VMS Macro  SPITBOL  system  are  in
    CPU  time  increments  of 10 (milliseconds).  This covers both the
    times shown in the statistics, and  the  time  retrieved  via  the
    system TIME function.  Wall time is available through DATE.





































         MACRO SPITBOL V3.5
                                                   PAGE 94 - [12]
         Implementation Information



                    *--------------------------------*
                      [12] Installation and Delivery
                    | [12] Installation and Delivery |
                    *--------------------------------*

    This  section  of  the  SPITBOL  manual  describes the process for
    unpackaging and installing the  VAX/VMS  MACRO  SPITBOL  software.
    This  section  is  also provided in hardcopy form with the 1600BPI
    tape to facilitate the  installation  process.   If  this  is  the
    first  time  you  have performed the delivery, please read through
    these directions before starting;  the  delivery  process  is  not
    highly  automated, and there will be a number of decisions for you
    to make.

    There are four steps to be  initially  performed  to  deliver  and
    install the software package.


     1.  Get  the files from the tape into the proper directories, and
         link  the  interpreter.    The   directories   involved   are
         SYS$LIBRARY:,  SYS$HELP:,  and  SYS$SYSTEM:.  Be certain that
         these VMS standard logical names are  defined  to  correspond
         to  valid  directories  on the system disk before undertaking
         the software installation.

     2.  Establish the  VMS  environment  and  commands  necessary  to
         execute MACRO SPITBOL.

     3.  Generate  the  reference  manual  and help file.  The program
         which does this is a SPITBOL program, so this  serves  as  an
         installation checkout.

     4.  Delete  and/or  copy  off  any optional files which you don't
         want to keep.

    Each of these steps is now detailed in turn.


    NOTE:
    NOTE:
    _____ This  version  of  MACRO  SPITBOL requires version 2 of VMS.
    If you are running any  version  1  of  VMS  you  cannot  use  the
    interpreter.   You  must first upgrade your system to version 2 of
    VMS before attempting to install MACRO SPITBOL.















         MACRO SPITBOL V3.5
                                                   PAGE 95 - [12.1]
         Implementation Information



 12.1  Transferring Delivery Files
 12.1  Transferring Delivery Files
 __________________ ________ _____


    Follow these steps:


     1.  Log on to the hardcopy system console  using  the  privileged
         SYSTEM  account.   Be certain that your default is set to the
         system  disk.   "BYPASS"  privilege  is  recommended  as   it
         insures  that  there  will be no snags in renaming or copying
         files.

     2.  If there  are  any  existing  files  or  directories  for  an
         earlier  version  of  SPITBOL,  they should be deleted.  (The
         new version  is  strictly  upward  compatible  with  previous
         versions.)   If  it  does  not already exist, create an empty
         scratch directory named SYS$DISK:[SPITBOL] with the command:

                         $
                         _ CRE/DIR SYS$DISK:[SPITBOL]


     3.  Set your default to the SPITBOL directory using the command:

                       $
                       _ SET DEFAULT SYS$DISK:[SPITBOL]


     4.  Mount the delivery tape on a drive with a command such as:

                              $
                              _ MOUNT MT:/OVER=ID


     5.  Copy all files from the  tape  into  the  directory  using  a
         command similar to:

                                $
                                _ COPY MT:*.* *


     6.  Dismount the tape with a command such as:

                                $
                                _ DISMOUNT MT:


     7.  Enter the command:

                                  $
                                  _ @SPITBOL

         This   command   file  will  rename  files  to  their  proper
         directories, and link the interpreter image.

    Sites with a previous release  of  the  interpreter  may  want  to
    print  a  copy of [SPITBOL]RELNOTES.LIS which documents changes in
    this release.




         MACRO SPITBOL V3.5
                                                   PAGE 96 - [12.2]
         Implementation Information



 12.2  Installing MACRO SPITBOL
 12.2  Installing MACRO SPITBOL
 ________________ _____ _______


     1.  Enter the commands:

                    $
                    _ SPIT*BOL :== $SYS$SYSTEM:SPITBOL
                    $
                    _ ASSIGN/SYS "<site-name>" SYS$SITENAME

         In the above, "<site-name>" is  any  text  string  of  28  or
         fewer   characters  which  SPITBOL  will  use  for  the  site
         identification.

         Using an editor, place the first of the above definitions  in
         the  systemwide  login  command  file  to define them for all
         users.   (The  name  of  this  file  varies  from  system  to
         system,  SYLOGIN.COM  and  SYSLOGIN.COM  in  SYS$MANAGER:  is
         typical.  If your site has not established such a file,  then
         users   will  have  to  define  this  command  in  their  own
         LOGIN.COM files.)   The ASSIGN  command  should  be  inserted
         into SYS$MANAGER:SYSTARTUP.COM .

     2.  In  general,  if  SPITBOL  is  to  be  used frequently, it is
         recommended that it be installed as a shareable image.   This
         can  be  done  (from  the  SYSTEM  account) using the command
         lines:

                   $ MCR INSTALL
                   SYS$SYSTEM:SPITBOL.EXE/SHARE/OPEN/HEADER

         SPITBOL  should  not   normally   be   installed   with   any
         privileges.



 12.3  Interpreter Checkout and Documentation Generation
 12.3  Interpreter Checkout and Documentation Generation
 _________________ ________ ___ _____________ __________


     1.  Set your default to SYS$LIBRARY:

     2.  Enter the command:

                    $
                    _ SPIT GPMDOC " {SET INPUT,SPITBOL.GPM}

         Note the blank  following  the  double  quote  in  the  above
         ____ ___ _____  _________  ___  ______  _____  __  ___  _____
         command.  This blank is significant and must be  included  as
         ________  ____ _____ __ ___________ ___ ____ __  ________  __
         shown.
         ______  If all is well, this will cause the system to ask  if
         you  want  to  produce the manual.  Answer "yes".  Generating
         the approximately 100 page manual takes about  5  minutes  on
         an  unloaded  VAX 11/780.  If it is working, a message should
         appear on your console for every page produced.






         MACRO SPITBOL V3.5
                                                   PAGE 97 - [12.3]
         Implementation Information

         After this, you will be asked if you  want  to  generate  the
         help  file.   Again  answer  "yes".   The generated file is a
         reformatted  version  of  the  manual  itself,  in  VMS  help
         library format.

         When this concludes, the GPMDOC program exits.

     3.  Print  SYS$LIBRARY:GPMDOC.LIS  on  a  132 column line printer
         and examine the listing to be sure that  the  interpreter  is
         functioning  properly.   Look  at  the  2  line header on the
         first listing page and be certain  that  the  site  name  you
         defined above appears there.

     4.  Print  SYS$LIBRARY:SPITBOL.MAN on (if possible) an 80 column,
         8.5x11 inch, white paper printer.  An  LA120  DECwriter  will
         do  if there is plenty of time available.  If any interactive
                                                   $
         device is  used,  be  certain  to  type  "_ SET TERM/NOBROAD"
         before  starting.   The table of contents is at the back - it
         should be moved to the indicated place at the beginning.

     5.  You should now decide if you  want  to  add  the  SPITBOL.HLP
         help  file to the system help file.  (The only reason for not
         so doing would be that it consumes about 300 blocks  of  disk
         space).   If  you  decide  to  do  this,  set your default to
         SYS$HELP: and enter the following commands:

                      $
                      _ LIB/COMPR=KEYSIZ:31/HELP HELPLIB
                      $
                      _ LIB/REPLACE/HELP HELPLIB SPITBOL
                      $
                      _ LIB/COMPRESS/HELP HELPLIB
                      $
                      _ PURGE HELPLIB.HLB




 12.4  Delivery File Cleanup
 12.4  Delivery File Cleanup
 ______________ ____ _______


    The delivery and  installation  process  is  concluded.   At  this
    point,  some  sites  may  choose  to  delete some of the delivered
    files in order to free up as much system disk space  as  possible.
    To  such  an  end,  a list of all delivered and generated files is
    given here, grouped by  their  function.   Examine  the  list  and
    delete the ones you don't want.


     1.  BASIC INTERPRETER:
         Basic  interpreter  files  consist  of  the executable image,
         objects, and sources.

         The executable image  is  built  as  SYS$SYSTEM:SPITBOL.EXE .
         This  file must not be deleted.  Also, SYS$SYSTEM:SPITBOL.STB
         is the corresponding symbol table  file  which  can  be  used
         when  linking images for use by LOAD(...).  It should also be
         retained.




         MACRO SPITBOL V3.5
                                                   PAGE 98 - [12.4]
         Implementation Information

         The  objects  are  in  SYS$LIBRARY:  and  named  SPITSYS.OBJ,
         SPITIOSYS,  SPITGO,  SPITMSGS and SPITV35.  It is recommended
         that    these    files     be     kept.      In     addition,
         SYS$LIBRARY:SPITBOL.OPT  is the standard SPITBOL link options
         file and should be retained if the objects are.

         The sources are in SYS$LIBRARY and have  the  same  names  as
         the  objects  except  that the file extensions are different.
         SPITGO.MAR is the entry  point,  and  provides  command  line
         processing,   initialization   and   basic  file  assignment.
         SPITSYS.MAR   contains   the    VMS    interface    routines.
         SPITIOSYS.MAR  contains  the VMS interface routines for input
         and output operations.  SPITV35.MAR is  the  source  for  the
         interpreter  itself.  SPITMSGS.MSG is the source text for the
         error messages  of  the  system.  It  is  input  to  the  VMS
         "MESSAGE" processor.

         SPITMACS.MAR  and  SPITMACS.MLB  comprise  the  macro library
         which is required for assembling any of these sources.

         These source files will  be  of  academic  interest  to  most
         sites,  and  can  be  profitably deleted since they consume a
         substantial quantity of disk space.

     2.  INTERPRETER SUPPORT FILES:
         On SYS$LIBRARY: will be found SPITHLS in .OBJ and .MAR  form.
         These  files  are  used  in  conjunction  with  the LOAD(...)
         feature and should not be deleted.  In  any  event  they  are
         quite small.

     3.  DOCUMENTATION FILES:
         The   delivery  process  outlined  above  uses  and  produces
         several files that relate to MACRO SPITBOL documentation.

         In SYS$LIBRARY: will be found SPITBOL.GPM and  SPITTEXT.GPM .
         These  two  files,  together, comprise the needed information
         to generate both the manual and help file text.  They can  be
         deleted once the manual and/or help file has been produced.

         The    delivery    process    generates    the    manual   in
         SYS$LIBRARY:SPITBOL.MAN. Once a good copy of  this  has  been
         printed, this file can be deleted.

         The  help  file  text  is  produced  in SYS$HELP:SPITBOL.HLP.
         This should be deleted only if no use is made of it.  If  you
         have  added it to the system help library, keep the .HLP file
         in case a future VMS delivery reinitializes the  system  help
         file.

         The   delivery   process   generates  a  SPITBOL  listing  in
         SYS$LIBRARY:GPMDOC.LIS.  This file is of  no  value  once  it
         has been checked out, and can be deleted.






         MACRO SPITBOL V3.5
                                                   PAGE 99 - [12.4]
         Implementation Information

     4.  GPMDOC:
         GPMDOC  is  the  text processing program (written in SPITBOL)
         that produces the manual and  help  text  files.   It  is  an
         interesting  program  in  its  own right, and for that reason
         you may wish to keep it.  Otherwise, all of the GPMDOC  files
         can be deleted, they are in SYS$LIBRARY:

         GPMDOC.SPT is the basic GPMDOC program source.

         GPMBIF.GPM  is  a  file  of  auxiliary  definitions needed by
         GPMDOC when it starts up.

         GPMDOC.GPM  is  part  of  the  reference  documentation   for
         GPMDOC.   To  generate this documentation, set the default to
         SYS$LIBRARY: and enter the commands:

              $
              _ SPIT GPMDOC -
              $
              __ " {SET OUTPUT,GPMDOC.MAN}{SET INPUT,GPMDOC.GPM}
              $
              _ PRINT/DELETE GPMDOC.MAN
              $
              _ DELETE GPMDOC.LIS;*


         JUSTIFY (.FOR, .OBJ, .EXE and .OPT) is a LOAD image  used  by
         GPMDOC  that   performs  right-justification of text strings.
         It is not essential to the operation  of  GPMDOC  (though  it
         runs  slightly  faster  with it.)  However, JUSTIFY is a good
         example of use of the LOAD(...) function feature, and  should
         be retained for that reason.

     5.  MISCELLANEOUS FILES:
         The  file  [SPITBOL]SPITBOL.COM  and  it's  scratch directory
         [SPITBOL]  are  of  no  use  once  the  delivery   has   been
         successfully   completed,   and  should  be  deleted.    This
         directory also contains RELNOTES.LIS.   These  release  notes
         are  primarily  directed  at sites with an earlier release of
         the system, and may be kept or deleted as desired.

         SYS$LIBRARY:DIF.SPT is a file comparator program  similar  to
         the   PDP-11  "CMP"  program.   It  runs significantly faster
         and, in  most  cases,  more  accurately  than  the  V2.4  VMS
         "DIFFERENCES"  command and for that reason may be of value to
         some sites.  The command format for DIF is described  in  its
         source.


















    ! ...................................... 16, 17
    $ ...................................... 16, 56, 57, 58
    $SEVERITY .............................. 75
    $STATUS ................................ 75
    % ...................................... 16
    & ...................................... 16

    &ABEND ................................. 43
    &ABORT ................................. 43
    &ALPHABET .............................. 43, 58
    &ANCHOR ................................ 4, 43, 57
    &ARB ................................... 43

    &BAL ................................... 43
    &CODE .................................. 43, 71
    &DUMP .................................. 43
    &ERRLIMIT .............................. 44
    &ERRTEXT ............................... 5, 21, 25, 38, 44, 71, 88

    &ERRTYPE ............................... 38, 44
    &FAIL .................................. 44
    &FENCE ................................. 44
    &FNCLEVEL .............................. 38, 44
    &FTRACE ................................ 44

    &FULLSCAN .............................. 3
    &INPUT ................................. 44
    &LASTNO ................................ 44
    &MAXLNGTH .............................. 5, 9, 44, 90
    &OUTPUT ................................ 44

    &PROFILE ............................... 5, 44
    &REM ................................... 45
    &RTNTYPE ............................... 45
    &STCOUNT ............................... 45
    &STFCOUNT .............................. 3

    &STLIMIT ............................... 6, 42, 45, 71
    &STNO .................................. 45
    &SUCCEED ............................... 45
    &TRACE ................................. 45
    &TRIM .................................. 5, 45, 57, 71

    * ...................................... 16, 57
    + ...................................... 16
    - ...................................... 16
    -DOUBLE ................................ 48
    -EJECT ................................. 46






                                     Index - i





    -EXECUTE ............................... 49
    -FAIL .................................. 49
    -IN .................................... 49
    -LIST .................................. 21, 48
    -NOERRORS .............................. 49, 50
    -NOEXECUTE ............................. 49, 89

    -NOFAIL ................................ 25, 49
    -NOLIST ................................ 48
    -NOPRINT ............................... 48
    -PRINT ................................. 48
    -SINGLE ................................ 48

    -SPACE ................................. 46
    -TITLE ................................. 46
    . ...................................... 16, 57
    .EXE ................................... 83
    .SEX ................................... 77

    .SPT ................................... 87
    / ...................................... 16
    /CCO ................................... 80
    /CIF ................................... 80
    /CR .................................... 80

    /CRC ................................... 89
    /CSTATS ................................ 89
    /DLT ................................... 80
    /EOF ................................... 80
    /ESTATS ................................ 89

    /EXECUTE ............................... 89
    /FTN ................................... 80
    /LIST .................................. 89
    /LOAD .................................. 71, 77
    /MINC .................................. 77, 90

    /MINT .................................. 77, 90
    /MXV ................................... 80
    /NOCRC ................................. 89
    /NOCSTATS .............................. 89
    /NOESTATS .............................. 89

    /NOEXECUTE ............................. 89
    /NOLIST ................................ 89
    /NOOUTPUT .............................. 91
    /NOPAGE ................................ 91
    /NOWARN ................................ 75, 91






                                     Index - ii





    /OUTPUT ................................ 91
    /PAGE .................................. 91
    /PTA ................................... 80
    /RNE ................................... 80
    /RNF ................................... 80
    /SCF ................................... 80

    /SPL ................................... 80
    /SUP ................................... 80
    /TEF ................................... 80
    /WARN .................................. 91
    /WIDTH ................................. 92

    <> ..................................... 7
    = ...................................... 6, 7, 16
    ? ...................................... 6, 7, 16, 58
    @ ...................................... 16
    ABEND .................................. 43, 43

    ABORT .................................. 4, 38, 43
    ALTERNATION ............................ 73
    ALTERNATIVE ............................ 5, 7
    ANCHOR ................................. 43
    ANCHORED MATCHING ...................... 57

    ANY .................................... 18, 56, 58
    APPEND ................................. 5, 10, 18, 57
    APPLY .................................. 18
    ARB .................................... 4, 20, 43, 58
    ARBNO .................................. 19, 58

    ARG .................................... 19
    ARRAY .................................. 9, 15, 18, 19, 39, 41
    ARRAYS ................................. 19, 56, 57
    ASSOCIATIVE LOOKUP ..................... 57
    BACKSPACE .............................. 3

    BAL .................................... 4, 43
    BLOCK .................................. 3
    BREAK .................................. 19, 56, 58
    BREAKX ................................. 5, 20, 56, 58
    BUFFER ................................. 5, 20

    BUFFERS ................................ 6, 10, 30, 57, 57, 58, 72
    CHAR ................................... 5, 21
    CHARACTER SET .......................... 6, 73, 87
    CLEAR .................................. 21
    CLI .................................... 88






                                    Index - iii





    CMP .................................... 99
    CODE ................................... 10, 21, 38, 56
    CODE BLOCKS ............................ 56
    COLLECT ................................ 22, 57
    COMMAND LINE ........................... 87
    CONDITION HANDLERS ..................... 85

    CONTINUE ............................... 38
    CONTROL CARDS .......................... 6, 46
    CONVERT ................................ 5, 22, 39
    COPY ................................... 22
    CPU TIME ............................... 93

    DATA ................................... 18, 23, 39
    DATATYPE ............................... 4, 23
    DATATYPE CONVERSIONS ................... 4, 11, 12, 58
    DATE ................................... 23, 75
    DCL .................................... 75

    DEBUGGING .............................. 42, 58, 83
    DEFERRED EXPRESSION .................... 58, 65
    DEFINE ................................. 18, 23
    DELIVERY ............................... 94
    DETACH ................................. 23, 58

    DIF.SPT ................................ 99
    DIFFER ................................. 4, 24
    DUMP ................................... 5, 24
    DUPL ................................... 24
    EBCDIC ................................. 73

    EJECT .................................. 5, 24, 79
    END .................................... 4
    ENDFILE ................................ 25, 79
    ERRORS ................................. 50, 75
    EVAL ................................... 25, 38

    EXIT ................................... 5, 25, 71, 77
    EXPRESSION ............................. 10
    FAIL ................................... 4, 44
    FENCE .................................. 4, 27, 44, 78
    FIELD .................................. 27

    FRETURN ................................ 38
    FULLSCAN ............................... 3
    FUNCTION ............................... 56
    FUNCTIONS .............................. 18
    GARBAGE COLLECTION ..................... 5, 22, 25, 56, 91






                                     Index - iv





    GE ..................................... 27
    GORILLA ................................ 85
    GOTOS .................................. 6
    GPMDOC ................................. 96, 99
    GT ..................................... 27
    HASH ................................... 56

    HASHING ................................ 4, 41, 57
    HELP LIBRARY ........................... 97
    HOST ................................... 5, 27, 78
    I/O .................................... 79
    I/O ASSOCIATION ........................ 58

    I/O SWITCHES ........................... 79
    IBM .................................... 1, 73
    IDENT .................................. 4, 28
    IF-THEN-ELSE ........................... 7
    INPUT .................................. 23, 25, 29, 36, 77, 79

    INSERT ................................. 5, 10, 30, 57
    INSTALL ................................ 96
    INSTALLATION ........................... 94, 96
    INTEGER ................................ 9, 14, 31, 39
    INTEGERS ............................... 56, 78

    INTERROGATION .......................... 58
    ITEM ................................... 7, 31
    JUSTIFY ................................ 99
    KEYWORDS ............................... 43
    LABEL .................................. 56

    LE ..................................... 31
    LEN .................................... 32
    LEQ .................................... 5, 32
    LGE .................................... 5, 32
    LGT .................................... 32

    LIB$LP_LINES ........................... 91
    LINKER ................................. 82, 82, 87
    LISTING ................................ 46
    LISTING OPTIONS ........................ 82
    LLE .................................... 5, 32

    LLT .................................... 5, 33
    LNE .................................... 5, 33
    LOAD ................................... 33, 77, 77, 83, 99
    LOAD MODULE ............................ 25
    LOAD_BASE .............................. 82, 85, 86, 93






                                     Index - v





    LOCAL .................................. 33
    LONGWORD ............................... 91
    LPAD ................................... 5, 34
    LT ..................................... 34
    MACRO-32 ............................... 83
    MATRIX ................................. 39

    MAXIMUM SIZE ........................... 5
    MXLEN .................................. 5, 9, 9, 9, 43, 44, 87, 90
    NAME ................................... 4, 9, 15, 39, 58
    NE ..................................... 34
    NL: .................................... 77

    NOTANY ................................. 34, 56, 58
    NRETURN ................................ 38
    NULL STRING ............................ 39
    NUMERIC ................................ 4, 39
    ON-LINE TERMINAL ....................... 6

    OPERATORS .............................. 16
    OPSYN .................................. 35, 73
    OPTIONS FILE ........................... 82
    OUTPUT ................................. 23, 24, 25, 29, 35, 36,
                                            77, 79

    P0BUFS ................................. 90
    PATTERN ................................ 9
    PATTERN MATCHING OPERATOR .............. 6
    PATTERN REPLACEMENT .................... 57
    PIC .................................... 85, 85, 86

    POS .................................... 35
    POSITION INDEPENDENCE .................. 85, 85
    PRE-EVALUATION ......................... 3, 5, 57, 65
    PROGRAM DEFINED DATATYPES .............. 23, 56, 57
    PROTOTYPE .............................. 36

    PUNCH .................................. 3
    QUICKSCAN .............................. 3
    REAL ................................... 9, 14, 39
    REAL ARITHMETIC ........................ 3, 87
    REALS .................................. 56

    RELEASE NOTES .......................... 99
    RELNOTES.LIS ........................... 99
    REM .................................... 4, 45
    REMDR .................................. 36
    REPLACE ................................ 36, 58






                                     Index - vi





    RETURN ................................. 38
    REVERSE ................................ 5, 36
    REWIND ................................. 36, 79, 87
    RMS .................................... 79, 90
    RPAD ................................... 5, 37
    RPOS ................................... 37

    RSORT .................................. 5, 6, 37, 39, 58
    RTAB ................................... 37
    SELECTION .............................. 5, 7
    SETEXIT ................................ 4, 5, 21, 25, 38, 44, 44
    SHAREABLE IMAGE ........................ 96

    SIZE ................................... 39
    SNOBOL4 ................................ 73
    SNOBOL4B ............................... 3
    SORT ................................... 5, 6, 39, 58
    SPACE OVERHEAD ......................... 56

    SPAN ................................... 40, 56, 58
    SPEED CONSIDERATIONS ................... 57
    SPIT$FAIL_RETURN ....................... 85
    SPIT$LOAD_ENTRY ........................ 84
    SPIT$SUCCESS_RETURN .................... 85

    SPITHLS ................................ 84, 85, 85
    STACK .................................. 91
    STACK OVERFLOW ......................... 93
    STACK_LIMIT ............................ 93
    STITL .................................. 47

    STOPTR ................................. 40, 58
    STRING ................................. 9, 12
    SUBSTR ................................. 5, 41
    SUCCEED ................................ 4, 45
    SWITCHES ............................... 87

    SYS$HELP ............................... 94
    SYS$INPUT .............................. 87
    SYS$LIBRARY ............................ 82, 84, 85, 85, 94
    SYS$LIBRARY: ........................... 98
    SYS$LP_LINES ........................... 91

    SYS$SITENAME ........................... 96
    SYS$SYSTEM ............................. 85, 94
    SYSLOGIN.COM ........................... 96
    SYSTARTUP.COM .......................... 96
    TAB .................................... 41






                                    Index - vii





    TAB CHARACTER .......................... 6
    TABLE .................................. 4, 4, 9, 15, 39, 39, 41,
                                            56, 57
    TABLES ................................. 56, 57
    TERMINAL ............................... 6, 93
    TERMINAL I/O ........................... 80

    TIME ................................... 42, 93
    TRACE .................................. 5, 42
    TRACING ................................ 58
    TRIM ................................... 42
    UNANCHORED MODE ........................ 57

    UNIVAC ................................. 1
    UNLOAD ................................. 42
    VALUE .................................. 3
    VARIABLE ............................... 56
    VECTOR ................................. 39

    VECTORS ................................ 19, 56
    VMS .................................... 94
    WORD ................................... 91
    [] ..................................... 7
    | ...................................... 17

    ~ ...................................... 16, 16




























                                    Index - viii


                                 TABLE OF CONTENTS
                                 _____ __ ________


         Section                        Title
         Page



              Introduction
    1         Introduction                                          1

              Summary of Differences
    2         Summary of Differences                                3
    2.1         Features not Implemented                            3
    2.2         Features Implemented Differently                    4
    2.3         Additional Features                                 5
    2.4         Syntax Differences                                  7

              Datatypes and Conversion
    3         Datatypes and Conversion                              9
    3.1         Available Datatypes                                 9
    3.2         Possible Datatype Conversions                       11
    3.3         Conversion Details                                  12

              Operators
    4         Operators                                             16
    4.1         Unary Operators                                     16
    4.2         Binary Operators                                    17

              Functions
    5         Functions                                             18
    5.1         ANY -- Pattern to Match Selected Character          18
    5.2         APPEND * -- Append string to buffer                 18
    5.3         APPLY * -- Apply function                           18
    5.4         ARBNO -- Pattern for Iterated Match                 19
    5.5         ARG * -- Obtain Argument Name                       19
    5.6         ARRAY -- Generate Array Structure                   19
    5.7         BREAK -- Construct Scanning Pattern                 19
    5.8         BUFFER * -- Create buffer object                    20
    5.9         BREAKX * -- Construct Scanning Pattern              20
    5.10        CHAR * -- Convert Character Code to String          21
    5.11        CLEAR * -- Clear Variable Storage                   21
    5.12        CODE * -- Compile Code                              21
    5.13        COLLECT -- Initiate Storage Regeneration            22
    5.14        CONVERT * -- Convert Datatypes                      22
    5.15        COPY * -- Copy Structure                            22
    5.16        DATA -- Create Datatype                             23
    5.17        DATATYPE * -- Obtain Datatype                       23
    5.18        DATE * -- Obtain Date                               23
    5.19        DEFINE -- Define a Function                         23
    5.20        DETACH -- Detach I/O Association                    23
    5.21        DIFFER * -- Test for Arguments Differing            24
    5.22        DUMP * -- Dump Storage                              24
    5.23        DUPL * -- Duplicate String or Pattern               24
    5.24        EJECT * -- Eject to new page                        24
    5.25        ENDFILE * -- Close a File                           25
    5.26        EQ -- Test for Equal                                25
    5.27        EVAL * -- Evaluate Expression                       25
    5.28        EXIT * -- Exit to Save Load Module or to JCL        25
    5.29        FENCE * -- Generate Fenced Pattern                  27


                                         i


                             TABLE OF CONTENTS (CON'T)
                             _____ __ ________ _______


         Section                        Title
         Page

    5.30        FIELD * -- Get Field Name                           27
    5.31        GE -- Test for Greater or Equal                     27
    5.32        GT -- Test for Greater                              27
    5.33        HOST * -- Obtain Information about Host Computer    28
    5.34        IDENT * -- Test for Identical                       28
    5.35        INPUT * -- Set Input Association                    29
    5.36        INSERT * -- Insert string in buffer                 30
    5.37        INTEGER * -- Test for Integer                       31
    5.38        ITEM -- Select Array or Table Element               31
    5.39        LE -- Test for Less or Equal                        31
    5.40        LEN -- Generate Specified Length Pattern            32
    5.41        LEQ * -- Test for Lexically Equal                   32
    5.42        LGE * -- Test for Lexically Greater or Equal        32
    5.43        LGT * -- Test for Lexically Greater                 32
    5.44        LLE * -- Test for Lexically Less or Equal           32
    5.45        LLT * -- Test for Lexically Less                    33
    5.46        LNE * -- Test for Lexically Not Equal               33
    5.47        LOAD -- Load External Function                      33
    5.48        LOCAL * -- Get Name of Local                        33
    5.49        LPAD * -- Left Pad                                  34
    5.50        LT -- Test for Less                                 34
    5.51        NE -- Test for Not Equal                            34
    5.52        NOTANY -- Build Character Select Pattern            34
    5.53        OPSYN * -- Equate Functions and Operators           35
    5.54        OUTPUT * -- Set Output Association                  35
    5.55        POS -- Define Positioning Pattern                   35
    5.56        PROTOTYPE -- Retrieve Prototype                     36
    5.57        REMDR -- Remainder                                  36
    5.58        REPLACE -- Translate Characters                     36
    5.59        REVERSE * -- Reverse String                         36
    5.60        REWIND -- Reposition File                           36
    5.61        RPAD * -- Right Pad                                 37
    5.62        RPOS -- Define Positioning Pattern                  37
    5.63        RSORT -- Reverse Sort                               37
    5.64        RTAB -- Create Tabbing Pattern                      37
    5.65        SETEXIT * -- Set Error Exit                         38
    5.66        SIZE -- Get String or Buffer Size                   39
    5.67        SORT * -- Sort                                      39
    5.68        SPAN -- Create Spanning Pattern                     40
    5.69        STOPTR * -- Stop Trace                              40
    5.70        SUBSTR * -- Extract Substring                       41
    5.71        TAB -- Create Tabbing Pattern                       41
    5.72        TABLE * -- Create Table                             41
    5.73        TIME -- Get Timer Value                             42
    5.74        TRACE * -- Initiate Trace                           42
    5.75        TRIM -- Trim Trailing Blanks                        42
    5.76        UNLOAD * -- Unload Function                         42

              Keywords
    6         Keywords                                              43


                                         ii


                             TABLE OF CONTENTS (CON'T)
                             _____ __ ________ _______


         Section                        Title
         Page


              Program Listing and Control Cards
    7         Program Listing and Control Cards                     46
    7.1         Listing Control Cards                               46
    7.1.1         -EJECT                                            46
    7.1.2         -SPACE                                            46
    7.1.3         -TITLE                                            47
    7.1.4         -STITL                                            47
    7.2         Option Control Cards                                48
    7.2.1         -LIST -NOLIST                                     48
    7.2.2         -NOPRINT -PRINT                                   48
    7.2.3         -SINGLE -DOUBLE                                   48
    7.2.4         -INXXX                                            49
    7.2.5         -ERRORS -NOERRORS                                 49
    7.2.6         -FAIL -NOFAIL                                     49
    7.2.7         -EXECUTE -NOEXECUTE                               49

              Errors
    8         Errors                                                50
    8.1         Compilation Error Messages                          50
    8.2         Execution Error Messages                            50
    8.3         Error Codes and Messages                            50

              Programming Notes
    9         Programming Notes                                     56
    9.1         Space Considerations                                56
    9.2         Speed Considerations                                57
    9.3         Other Notes                                         58

              Specimen Programs
    10        Specimen Programs                                     59
    10.1        Program 1                                           59
    10.2        Program 2                                           61
    10.3        Program 3                                           65
    10.4        Program 4                                           68

              Implementation Information
    11        Implementation Information                            71
    11.1        &CODE                                               71
    11.2        &ERRTEXT                                            71
    11.3        &STLIMIT                                            71
    11.4        &TRIM                                               72
    11.5        Buffers                                             72
    11.6        Character Set for VAX/VMS SPITBOL                   73
    11.7        Form of DATE String                                 75
    11.8        Errors                                              75
    11.9        EXIT Function Usage                                 77
    11.9.1        EXIT(0) Usage                                     77
    11.9.2        EXIT(String) Usage                                77
    11.9.3        EXIT(-n) Usage                                    77
    11.10       FENCE(PATTERN)                                      78
    11.11       HOST                                                78
    11.12       Range of Integers                                   78
    11.13       INPUT/OUTPUT                                        79


                                        iii


                             TABLE OF CONTENTS (CON'T)
                             _____ __ ________ _______


         Section                        Title
         Page

    11.13.1       FILEARG2 SWITCHES                                 80
    11.13.2       I/O EXAMPLES                                      81
    11.14       Linking SPITBOL                                     82
    11.15       Terminal Listing Options                            82
    11.16       LOAD Function Usage                                 83
    11.16.1       High-Level Languages and LOAD                     84
    11.16.2       Calling Conventions for LOAD                      84
    11.16.3       Return Conventions for LOAD                       84
    11.16.4       Linking External Functions                        85
    11.16.5       Unconverted Values and Results for LOAD           86
    11.17       MXLEN                                               87
    11.18       Real Arithmetic                                     87
    11.19       Extended Character Set                              87
    11.20       REWIND                                              87
    11.21       Running SPITBOL                                     87
    11.21.1       Startup Switches                                  89
    11.22       Stack Overflow                                      93
    11.23       TERMINAL                                            93
    11.24       Time                                                93

              Installation and Delivery
    12        Installation and Delivery                             94
    12.1        Transferring Delivery Files                         95
    12.2        Installing MACRO SPITBOL                            96
    12.3        Interpreter Checkout and Documentation Generation   96
    12.4        Delivery File Cleanup                               97


























                                         iv