Annotation of researchv10no/cmd/spitbol/man.out, revision 1.1

1.1     ! root        1: 
        !             2: 
        !             3: 
        !             4: 
        !             5: 
        !             6: 
        !             7: 
        !             8:                              *      *      *
        !             9: 
        !            10: 
        !            11: 
        !            12: 
        !            13: 
        !            14:                         M A C R O   S P I T B O L
                        M A C R O   S P I T B O L
        !            15: 
        !            16:                         -------------------------
        !            17: 
        !            18: 
        !            19: 
        !            20:                     PROGRAM REFERENCE MANUAL (Rev. G)
        !            21: 
        !            22:                     ---------------------------------
        !            23: 
        !            24: 
        !            25: 
        !            26:                      VAX/VMS Version 3.5 (BCAB-2132)
        !            27: 
        !            28:                      -------------------------------
        !            29: 
        !            30: 
        !            31: 
        !            32: 
        !            33: 
        !            34:                   Copyright   (c)   1980    by    DEWAR
        !            35:                   INFORMATION    SYSTEMS   CORPORATION.
        !            36:                   This   manual   may   be   reporduced
        !            37:                   provided  that this Dewar Information
        !            38:                   Systems    Copyright    Notice     is
        !            39:                   incorporated.
        !            40: 
        !            41: 
        !            42: 
        !            43:                   VAX,   VMS,  DECwriter  and  PDP  are
        !            44:                   registered trademarks of the  Digital
        !            45:                   Equipment Corporation.
        !            46: 
        !            47: 
        !            48: 
        !            49: 
        !            50:                   DEWAR INFORMATION SYSTEMS CORPORATION
        !            51:                            221 West Lake Street
        !            52:                       Oak Park, Illinois USA  60302
        !            53: 
        !            54:                               (312) 524-1644
        !            55: 
        !            56: 
        !            57: 
        !            58: 
        !            59: 
        !            60: 
        !            61: 
        !            62: 
        !            63: 
        !            64: 
        !            65: 
        !            66: 
        !            67: 
        !            68: 
        !            69: 
        !            70: 
        !            71: 
        !            72: 
        !            73: 
        !            74: 
        !            75: 
        !            76: 
        !            77: 
        !            78: 
        !            79: 
        !            80: 
        !            81: 
        !            82: 
        !            83: 
        !            84: 
        !            85: 
        !            86: 
        !            87: 
        !            88: 
        !            89: 
        !            90: 
        !            91: 
        !            92: 
        !            93: 
        !            94: 
        !            95:            Please replace this page with the Table of Contents
           Please replace this page with the Table of Contents
        !            96:                                (At the end)
                               (At the end)
        !            97: 
        !            98: 
        !            99: 
        !           100: 
        !           101: 
        !           102: 
        !           103: 
        !           104: 
        !           105: 
        !           106: 
        !           107: 
        !           108: 
        !           109: 
        !           110: 
        !           111: 
        !           112: 
        !           113: 
        !           114: 
        !           115: 
        !           116: 
        !           117: 
        !           118: 
        !           119: 
        !           120: 
        !           121: 
        !           122: 
        !           123: 
        !           124: 
        !           125: 
        !           126: 
        !           127: 
        !           128:     This  report  is  parallel  to  the  University of Leeds Technical
        !           129:     Report Number 94, "Macro Spitbol - Decsystem 10 Version,"  McCann,
        !           130:     Holden  and Dewar, Dec. 1976.  Differences will be found primarily
        !           131:     in Section 12.
        !           132: 
        !           133: 
        !           134:                              Revision History
                             ________ _______
        !           135: 
        !           136:     This document has been revised as follows :
        !           137: 
        !           138:     Dec 1976        to correspond with        SPITBOL Version 3.0
        !           139:     Mar 1978        to correspond with        SPITBOL Version 3.3
        !           140:     Sep 1978        to correspond with        SPITBOL Version 3.4
        !           141:     Feb 1979        to correspond with        SPITBOL Version 3.5
        !           142: 
        !           143: 
        !           144: 
        !           145:     VAX/VMS MACRO SPITBOL Version BCAB-2132 is designed to operate  on
        !           146:     the  VAX 11/780 and VAX 11/750 computers running the VMS operating
        !           147:     system version 2.0, 2.1, 2.2, 2.3 or 2.4.
        !           148: 
        !           149: 
        !           150: 
        !           151: 
        !           152: 
        !           153: 
        !           154: 
        !           155: 
        !           156: 
        !           157: 
        !           158: 
        !           159: 
        !           160: 
        !           161: 
        !           162: 
        !           163: 
        !           164: 
        !           165: 
        !           166: 
        !           167: 
        !           168: 
        !           169: 
        !           170: 
        !           171: 
        !           172: 
        !           173: 
        !           174: 
        !           175: 
        !           176: 
        !           177: 
        !           178: 
        !           179: 
        !           180: 
        !           181: 
        !           182: 
        !           183: 
        !           184: 
        !           185: 
        !           186: 
        !           187:          MACRO SPITBOL V3.5
        !           188:                                                    PAGE 1 - [1]
        !           189:          Introduction
        !           190: 
        !           191: 
        !           192: 
        !           193:                           *-------------------*
        !           194:                             [1]  Introduction
                          | [1]  Introduction |
        !           195:                           *-------------------*
        !           196: 
        !           197:     MACRO SPITBOL  is  an  implementation  of  the  SNOBOL4   computer
        !           198:     language  which  was  coded  during 1974/75. In speed and external
        !           199:     style  it resembles the earlier SPITBOL  implementations  for  the
        !           200:     IBM 360   and  UNIVAC 1100  series  computers  but  internally  it
        !           201:     differs  considerably  from  these  since  the  source   code   is
        !           202:     converted  to  a reverse polish string which is then used to drive
        !           203:     interpretive routines.  MACRO SPITBOL is  available  with  a  high
        !           204:     degree  of  compatibility  on  a  range of computers running under
        !           205:     widely differing operating  systems.   This  report  reflects  the
        !           206:     above   fact   by  providing  in  its  first  nine  sections  such
        !           207:     documentation  and  information  for  users  as  is  substantially
        !           208:     machine   independent,  with  a  final  section  giving  essential
        !           209:     information peculiar to each  particular  implementation.   It  is
        !           210:     assumed  that  the  reader  is familiar with the standard version,
        !           211:     referred to simply as SNOBOL4 in the remainder of the  report  and
        !           212:     described   in   the   essential   reference   book  "The  SNOBOL4
        !           213:     Programming Language" by Griswold,  Poage  and  Polonsky,  Addison
        !           214:     Wesley,  1971.   Version  3.4  of SNOBOL4 is the reference version
        !           215:     for comparison.  There are  several  minor  incompatibilities  and
        !           216:     some  features  are  not implemented.  There are several additions
        !           217:     to the language in this implementation.
        !           218: 
        !           219: 
        !           220: 
        !           221: 
        !           222: 
        !           223: 
        !           224: 
        !           225: 
        !           226: 
        !           227: 
        !           228: 
        !           229: 
        !           230: 
        !           231: 
        !           232: 
        !           233: 
        !           234: 
        !           235: 
        !           236: 
        !           237: 
        !           238: 
        !           239: 
        !           240: 
        !           241: 
        !           242: 
        !           243: 
        !           244: 
        !           245: 
        !           246: 
        !           247: 
        !           248: 
        !           249:          MACRO SPITBOL V3.5
        !           250:                                                    PAGE 2 - [1]
        !           251:          Introduction
        !           252: 
        !           253: 
        !           254:     In  general  an  attempt  has   been   made   to   retain   upward
        !           255:     compatibility  wherever  possible.   Most  SNOBOL4  programs which
        !           256:     operate correctly using  SNOBOL4  should  operate  correctly  when
        !           257:     compiled  and  executed  using MACRO SPITBOL.  For brevity, in the
        !           258:     remainder of the report MACRO SPITBOL will be referred  to  simply
        !           259:     as SPITBOL.
        !           260: 
        !           261: 
        !           262:     SPITBOL was initially designed and implemented by:
        !           263: 
        !           264:     Professor Robert B. K. Dewar,
        !           265:     Courant Institute of Mathematical Sciences,
        !           266:     251 Mercer Street,
        !           267:     NEW YORK, N.Y. 10012.
        !           268:     U.S.A.
        !           269: 
        !           270:     It has been further developed and is now maintained by:
        !           271: 
        !           272:     Dr.  Anthony P. McCann,
        !           273:     Department of Computer Studies,
        !           274:     University of Leeds,
        !           275:     LEEDS, LS2 9JT,
        !           276:     England.
        !           277: 
        !           278: 
        !           279:     The VAX/VMS Version is the work of and is maintained by:
        !           280: 
        !           281:     Steven G. Duff
        !           282:     c/o Dewar Information Systems Corporation
        !           283:     221 West Lake Street
        !           284:     Oak Park, Illinois  60302
        !           285: 
        !           286:     which  should  be  contacted to report problems or for information
        !           287:     on distribution.
        !           288: 
        !           289:     The implementor gratefully acknowledges the assistance of  Thagard
        !           290:     Research  in  providing  development  facilities  for  the VAX/VMS
        !           291:     Version of SPITBOL.
        !           292: 
        !           293: 
        !           294: 
        !           295: 
        !           296: 
        !           297: 
        !           298: 
        !           299: 
        !           300: 
        !           301: 
        !           302: 
        !           303: 
        !           304: 
        !           305: 
        !           306: 
        !           307: 
        !           308: 
        !           309: 
        !           310: 
        !           311:          MACRO SPITBOL V3.5
        !           312:                                                    PAGE 3 - [2]
        !           313:          Summary of Differences
        !           314: 
        !           315: 
        !           316: 
        !           317:                      *-----------------------------*
        !           318:                        [2]  Summary of Differences
                     | [2]  Summary of Differences |
        !           319:                      *-----------------------------*
        !           320: 
        !           321:     The  principal  differences  between  SPITBOL  and   SNOBOL4   are
        !           322:     summarised here.
        !           323: 
        !           324: 
        !           325:  2.1  Features not Implemented
 2.1  Features not Implemented
 _____________ ___ ___________
        !           326: 
        !           327: 
        !           328:      1.  The  capability  to  redefine  standard  system functions and
        !           329:          predefined operators.  This restriction permits compile  time
        !           330:          pre-evaluation  of  a wider range of expressions and patterns
        !           331:          than would otherwise  be  possible.   It  affects  the  OPSYN
        !           332:          function (see Section 5 for details).
        !           333: 
        !           334:      2.  The VALUE  and BACKSPACE functions.
        !           335: 
        !           336:      3.  The  keywords  &STFCOUNT  and  &FULLSCAN  .   The  heuristics
        !           337:          associated with the QUICKSCAN mode of  pattern  matching  are
        !           338:          complex  and for many programs do not result in a significant
        !           339:          increase  in speed.  Accordingly only  FULLSCAN  matching  is
        !           340:          provided  and  no  heuristics  are  applied.   In  particular
        !           341:          deferred expressions are not assumed to match  at  least  one
        !           342:          character.
        !           343: 
        !           344:      4.  The BLOCK datatype as in SNOBOL4B .
        !           345: 
        !           346:      5.  The  variable  PUNCH has no predefined association to a punch
        !           347:          stream.   If  required,  the  programmer  should  include   a
        !           348:          statement such as OUTPUT(.PUNCH,3) in his program.
        !           349: 
        !           350:      6.  SPITBOL does not permit exponentiation of two real numbers.
        !           351: 
        !           352:      7.  For  small  machines,  versions  of SPITBOL in which all real
        !           353:          arithmetic capability is omitted are available - see  Section
        !           354:          12.
        !           355: 
        !           356:      8.  Some  implementations  may  omit  a  few features.  A list is
        !           357:          given in Section 12.
        !           358: 
        !           359: 
        !           360: 
        !           361: 
        !           362: 
        !           363: 
        !           364: 
        !           365: 
        !           366: 
        !           367: 
        !           368: 
        !           369: 
        !           370: 
        !           371: 
        !           372: 
        !           373:          MACRO SPITBOL V3.5
        !           374:                                                    PAGE 4 - [2.2]
        !           375:          Summary of Differences
        !           376: 
        !           377: 
        !           378: 
        !           379:  2.2  Features Implemented Differently
 2.2  Features Implemented Differently
 _____________ ___________ ___________
        !           380: 
        !           381:     Some of the differences here may necessitate program changes.
        !           382: 
        !           383: 
        !           384:      1.  In SPITBOL the value of  &ANCHOR  is  obtained  only  at  the
        !           385:          start  of the match.  In SNOBOL4, changing the value during a
        !           386:          match can lead to unexpected results.
        !           387: 
        !           388:      2.  The pattern valued variables ABORT, ARB, BAL,  FAIL,   FENCE,
        !           389:          REM,  SUCCEED  are write protected so that attempts to assign
        !           390:          to them will fail.
        !           391: 
        !           392:      3.  The same stack is used for pattern matching and for  function
        !           393:          calls.   Thus  the  diagnostic issued for an infinite pattern
        !           394:          recursion is simply the standard stack overflow message.
        !           395: 
        !           396:      4.  Recovery from execution errors (see function SETEXIT ).
        !           397: 
        !           398:      5.  Input/Output.  In particular, FORTRAN I/O  is  not  provided.
        !           399:          Dynamic  association  to  files is possible through the third
        !           400:          argument and statement failure is possible if a  file  cannot
        !           401:          be found as in
        !           402:               INPUT(.IN,3,'INFIL')                :F(NOFILE)
        !           403: 
        !           404:      6.  The  TABLE function is implemented so that table elements can
        !           405:          be rapidly accessed by the efficient  technique  of  hashing.
        !           406:          In  order  to  set  a  suitable size for the hash table it is
        !           407:          important to choose a reasonable value for  the  argument  of
        !           408:          TABLE.   Use of an inappropriate value will not cause program
        !           409:          failure but may delay access to elements or waste memory.
        !           410: 
        !           411:      7.  SPITBOL allows  some  datatype  conversions  not  allowed  in
        !           412:          SNOBOL4.   For  example  a real value may be used in patterns
        !           413:          and is converted to a string.  In  general  objects  will  be
        !           414:          converted to an appropriate datatype if at all possible.
        !           415: 
        !           416:      8.  The  unary  .  (name)  operator applied to a natural variable
        !           417:          yields  a NAME rather than a  STRING.   Since  this  NAME  is
        !           418:          converted  to  a STRING when necessary, the difference is not
        !           419:          normally noticed.  The only points at which   the  difference
        !           420:          will  be  apparent  is  in  use  of  the  IDENT,  DIFFER  and
        !           421:          DATATYPE functions  and when used as a TABLE subscript.
        !           422: 
        !           423:      9.  SPITBOL  permits  leading  and  trailing  blanks  on  numeric
        !           424:          strings which are to be converted to  NUMERIC .
        !           425: 
        !           426:     10.  Several  of  the  built-in  functions are slightly different.
        !           427:          They are identified by a * on their names in Section 5.
        !           428: 
        !           429:     11.  The count  of  statements  executed  includes  labelled  null
        !           430:          statements and  the END statement.
        !           431: 
        !           432: 
        !           433: 
        !           434: 
        !           435:          MACRO SPITBOL V3.5
        !           436:                                                    PAGE 5 - [2.2]
        !           437:          Summary of Differences
        !           438: 
        !           439:     12.  Constant  sub-expressions  and  patterns are pre-evaluated at
        !           440:          compile time.  This  may  occasionally  result  in  execution
        !           441:          errors   (e.g.   integer   overflow)  being  reported  during
        !           442:          compilation.  Significant speed increases may be obtained  by
        !           443:          ensuring  that in-line patterns are constant so that they may
        !           444:          be  pre-evaluated.   Patterns  built  from   pattern   valued
        !           445:          variables  (e.g.  ARB)  and  pattern  functions with constant
        !           446:          arguments (e.g. ANY(*ARG), RTAB(0)) are themselves constant.
        !           447: 
        !           448:     13.  A compact and fast garbage collector is used which  needs  to
        !           449:          distinguish   between  small  integers  and memory addresses.
        !           450:          This effectively restricts the maximum size  of  any  SPITBOL
        !           451:          object  (string,  array, table, code or expression block)  to
        !           452:          be less than a value subsequently  referred  to  as  MXLEN  .
        !           453:          This   is   in  practice  little  restriction  on  most  host
        !           454:          computers.  Where, because of implementation needs, it  might
        !           455:          prove  restrictive,  a  run time option is generally provided
        !           456:          for setting this value to suit  a  user's  requirements  (see
        !           457:          Section  12.  where  an  indication  of  the  default initial
        !           458:          setting of MXLEN is also given).  Since the  value  of  MXLEN
        !           459:          is  used  to initialise &MAXLNGTH , printing &MAXLNGTH during
        !           460:          execution gives its exact value.   A  user  may  subsequently
        !           461:          assign  a  smaller value to this keyword but values exceeding
        !           462:          that of MXLEN may not be assigned to it.
        !           463: 
        !           464:     14.  A value of zero for &TRIM does  not  necessarily  imply  that
        !           465:          trailing  blanks  will  be added to records in which they are
        !           466:          not originally present - see Section 12.
        !           467: 
        !           468: 
        !           469: 
        !           470:  2.3  Additional Features
 2.3  Additional Features
 _______________ ________
        !           471: 
        !           472:     The following SPITBOL features are not found in SNOBOL4.
        !           473: 
        !           474: 
        !           475:      1.  The  functions APPEND, BREAKX, CHAR, BUFFER,    EJECT,  EXIT,
        !           476:          HOST,    INSERT,    LEQ,  LGE,        LLE,  LLT,  LNE,  LPAD,
        !           477:          REVERSE, RPAD,      RSORT,  SETEXIT,  SORT,  SUBSTR   .   The
        !           478:          sorting  functions,  the  extended  break pattern BREAKX, and
        !           479:          the output formatting functions LPAD and RPAD are  especially
        !           480:          useful.  See Section 5 for details of all these functions.
        !           481: 
        !           482:      2.  The keywords &ERRTEXT and &PROFILE.
        !           483: 
        !           484:      3.  The  symbolic  dump  optionally  includes elements of arrays,
        !           485:          tables  and programmer defined datatypes. (See DUMP ).
        !           486: 
        !           487:      4.  An access trace mode is provided in  addition  to  the  other
        !           488:          standard modes.  (See TRACE ).
        !           489: 
        !           490:      5.  A selection or alternative feature is provided.
        !           491: 
        !           492: 
        !           493: 
        !           494: 
        !           495: 
        !           496: 
        !           497:          MACRO SPITBOL V3.5
        !           498:                                                    PAGE 6 - [2.3]
        !           499:          Summary of Differences
        !           500: 
        !           501:      6.  The second argument of CONVERT may be 'NUMERIC'.
        !           502: 
        !           503:      7.  The  assignment symbol , = , is treated as an ordinary binary
        !           504:          operator  and the binary operator , ? , is  given  a  defined
        !           505:          meaning as a pattern matching operator.
        !           506: 
        !           507:      8.  If  running  SPITBOL from an on-line terminal, options may be
        !           508:          selected  to reduce the amount of  listing  information  sent
        !           509:          to  the  terminal  or  to restrict this to compilation errors
        !           510:          only. (See Section 12 for details).
        !           511: 
        !           512:      9.  Reflecting the fact that many current computer systems   have
        !           513:          good  online  terminal  capabilities,  the  name  TERMINAL is
        !           514:          available with pre-association for  input  and  output  to  a
        !           515:          terminal on such systems - see Section 12.
        !           516:          T     TERMINAL = EVAL(TERMINAL)     :S(T)
        !           517:          acts  as a desk calculator.  TERMINAL may be detached but may
        !           518:          not   then   be   re-associated.    If   this   feature    is
        !           519:          unimplemented, TERMINAL acts as an ordinary variable.
        !           520: 
        !           521:     10.  Several  additional  control  cards  may  be  used  to select
        !           522:          various compile time and run time options.
        !           523: 
        !           524:     11.  An   extended   character   set   is   available   in    some
        !           525:          implementations.   Where  lower  case  letters  are  provided
        !           526:          names such as "INPUT" and "input"  are  distinct.   In  gotos
        !           527:          :f  and :s mean the same as :F and :S.  The Tab character, if
        !           528:          available,  is  syntactically  identical  with  blank.    See
        !           529:          Section 12.
        !           530: 
        !           531:     12.  The  assignment  &STLIMIT = -1 inhibits all checks on numbers
        !           532:          of statements executed.
        !           533: 
        !           534:     13.  Built-in functions are available for sorting the elements  of
        !           535:          tables and arrays.
        !           536: 
        !           537:     14.  A  additional datatype called a BUFFER is available.  Buffers
        !           538:          are  character  arrays  with  a  fixed  allocation   and   an
        !           539:          adjustable   size   which  may  vary  between  zero  and  the
        !           540:          allocated size at any time.   Three  new  functions,  INSERT,
        !           541:          APPEND  and BUFFER have been added to support the buffer type
        !           542:          specifically,  and the CONVERT,  PROTOTYPE,  SIZE,  DATATYPE,
        !           543:          SUBSTR,  COPY and pattern matching and replacement operations
        !           544:          have been enhanced to provide support for buffers.
        !           545: 
        !           546: 
        !           547: 
        !           548: 
        !           549: 
        !           550: 
        !           551: 
        !           552: 
        !           553: 
        !           554: 
        !           555: 
        !           556: 
        !           557: 
        !           558: 
        !           559:          MACRO SPITBOL V3.5
        !           560:                                                    PAGE 7 - [2.4]
        !           561:          Summary of Differences
        !           562: 
        !           563: 
        !           564: 
        !           565:  2.4  Syntax Differences
 2.4  Syntax Differences
 ___________ ___________
        !           566: 
        !           567:     This section describes differences in syntax between  SPITBOL  and
        !           568:     SNOBOL4.  such  differences  should  not generally affect existing
        !           569:     SNOBOL4 programs.
        !           570: 
        !           571: 
        !           572:      1.  Reference  to  elements  of  arrays  which   are   themselves
        !           573:          elements  of   arrays  is  possible  without  using  the ITEM
        !           574:          function.  Thus the following are equivalent -
        !           575:            A<J><K> = B<J><K>;       ITEM(A<J>,K) = ITEM(B<J>,K)
        !           576: 
        !           577:      2.  The compiler permits real  constants  to  be  followed  by  a
        !           578:          FORTRAN style exponent E+xxx.
        !           579: 
        !           580:      3.  A  selection  or  alternative  construction  may  be  written
        !           581:          anywhere that a value is permitted.  It consists of a  series
        !           582:          of   expressions   separated   by   commas  and  enclosed  in
        !           583:          parentheses:
        !           584:            (e1,e2,e3,....,en)
        !           585:          The semantics is to evaluate the  expressions  from  left  to
        !           586:          right  until one succeeds and then use its value.  Failure is
        !           587:          signalled if all evaluations fail.   This  feature  trivially
        !           588:          provides  an  "or"  function for predicates and also has many
        !           589:          other uses as shown by the following examples:
        !           590:            A     = (EQ(B,3),GT(B,20)) B + 1
        !           591:            NEXT  = (INPUT,'%EOF')
        !           592:            MAXAB = (GT(A,B) A,B)
        !           593:          The   alternative   structure   provides   an    IF-THEN-ELSE
        !           594:          capability,  and  as  such  is  a useful programming feature.
        !           595:          Note incidentally that the semantics of ordinary  parentheses
        !           596:          is  a  correct  degenerate  case  of an alternative structure
        !           597:          with one alternative.
        !           598: 
        !           599:      4.  The array brackets [] may be used instead of <>  if  desired.
        !           600:          Thus X[I,J] and X<I,J> are equivalent.
        !           601: 
        !           602:      5.  By  treating  =  as  a  right  associative operator of lowest
        !           603:          priority, multiple assignments within a single statement  may
        !           604:          be  coded.   The  value  returned by an assignment is that of
        !           605:          its right hand side.  After obeying
        !           606:            A[I = INPUT] = INPUT
        !           607:          I is the index of the element of the array  into  which  data
        !           608:          has been read.
        !           609: 
        !           610:      6.  ?  is  defined  to  be an explicit pattern matching operator.
        !           611:          It is left associative and has priority lower  than  that  of
        !           612:          all  operators  except  =  .   It  returns  as  its value the
        !           613:          substring matched from its left argument (a  string)  by  its
        !           614:          right argument (a pattern).  Thus
        !           615:            'ABCD' ? LEN(3) $ OUTPUT ? LEN(1) REM $ OUTPUT
        !           616:          causes printing of
        !           617:            ABC
        !           618:            BC
        !           619: 
        !           620: 
        !           621:          MACRO SPITBOL V3.5
        !           622:                                                    PAGE 8 - [2.4]
        !           623:          Summary of Differences
        !           624: 
        !           625: 
        !           626: 
        !           627: 
        !           628: 
        !           629: 
        !           630: 
        !           631: 
        !           632: 
        !           633: 
        !           634: 
        !           635: 
        !           636: 
        !           637: 
        !           638: 
        !           639: 
        !           640: 
        !           641: 
        !           642: 
        !           643: 
        !           644: 
        !           645: 
        !           646: 
        !           647: 
        !           648: 
        !           649: 
        !           650: 
        !           651: 
        !           652: 
        !           653: 
        !           654: 
        !           655: 
        !           656: 
        !           657: 
        !           658: 
        !           659: 
        !           660: 
        !           661: 
        !           662: 
        !           663: 
        !           664: 
        !           665: 
        !           666: 
        !           667: 
        !           668: 
        !           669: 
        !           670: 
        !           671: 
        !           672: 
        !           673: 
        !           674: 
        !           675: 
        !           676: 
        !           677: 
        !           678: 
        !           679: 
        !           680: 
        !           681: 
        !           682: 
        !           683:          MACRO SPITBOL V3.5
        !           684:                                                    PAGE 9 - [3]
        !           685:          Datatypes and Conversion
        !           686: 
        !           687: 
        !           688: 
        !           689:                     *-------------------------------*
        !           690:                       [3]  Datatypes and Conversion
                    | [3]  Datatypes and Conversion |
        !           691:                     *-------------------------------*
        !           692: 
        !           693:     This  section  details  the datatypes available in SPITBOL and the
        !           694:     conversions which may be performed amongst them.
        !           695: 
        !           696: 
        !           697:  3.1  Available Datatypes
 3.1  Available Datatypes
 ______________ _________
        !           698: 
        !           699: 
        !           700:      1.  STRING
        !           701:          Strings range  in  length  from  0  (null  string)  to  MXLEN
        !           702:          characters   (subject  to  the  setting  of  &MAXLNGTH).  Any
        !           703:          characters from the hardware set of the computer used to  run
        !           704:          SPITBOL can appear in a string.
        !           705: 
        !           706:      2.  INTEGER
        !           707:          Integers  are  generally  stored  in  the hardware complement
        !           708:          form for the computer used to run SPITBOL and usually  occupy
        !           709:          a single word.  See Section 12 for range.
        !           710: 
        !           711:      3.  REAL
        !           712:          Available  if  floating  point  hardware  is  available  (sec
        !           713:          10.2.4).  Stored according to the usual hardware  conventions
        !           714:          of the computer on which SPITBOL is run.
        !           715: 
        !           716:      4.  ARRAY
        !           717:          Arrays  may  not  exceed  MXLEN words in total size. 10 to 15
        !           718:          words must be allowed for housekeeping information.
        !           719: 
        !           720:      5.  TABLE
        !           721:          A table may have up to MXLEN elements.   Any  SPITBOL  object
        !           722:          may  be  used  as  the name of a table element, including the
        !           723:          null string.  See Section 5 for details.
        !           724: 
        !           725:      6.  PATTERN
        !           726:          Pattern  structures  may  be  arbitrarily  large  within  the
        !           727:          limits imposed by total available memory.
        !           728: 
        !           729:      7.  NAME
        !           730:          A  name  can  be  obtained  from  any variable.  Note that in
        !           731:          SPITBOL , the name operator (unary dot) applied to a  natural
        !           732:          variable  yields  a  name,  not  a string as is the case with
        !           733:          SNOBOL4.  Use  of  names  as  arguments  to  the  indirection
        !           734:          operator  (unary  $)  is  much  faster than the use of string
        !           735:          arguments.   Names  can  also  be  used   advantageously   in
        !           736:          statements such as  INPUT(.IN)
        !           737: 
        !           738: 
        !           739: 
        !           740: 
        !           741: 
        !           742: 
        !           743: 
        !           744: 
        !           745:          MACRO SPITBOL V3.5
        !           746:                                                    PAGE 10 - [3.1]
        !           747:          Datatypes and Conversion
        !           748: 
        !           749: 
        !           750:      8.  EXPRESSION
        !           751:          Any   expression  may  be  deferred  by  using  the  unary  *
        !           752:          operator.
        !           753: 
        !           754:      9.  CODE
        !           755:          A string representing a valid  program  can  be  compiled  at
        !           756:          execution  time.   The  resulting CODE object may be executed
        !           757:          in the same manner as the original program.
        !           758: 
        !           759:     10.  BUFFER
        !           760:          The buffer type does not  exist  in  SNOBOL4;   it  has  been
        !           761:          introduced  into  MACRO  SPITBOL  primarily to provide a more
        !           762:          efficient mechanism for working with large strings.
        !           763: 
        !           764:          Buffers are packed character  arrays  created  with  a  fixed
        !           765:          allocation  defining  the  maximum  number of characters they
        !           766:          can ever contain.  Buffers are helpful in manipulating  large
        !           767:          strings  efficiently.  The reason is that in-situ replacement
        !           768:          of buffer  contents  is  possible  using  APPEND,  INSERT  or
        !           769:          pattern  replacement, while any modification to a string must
        !           770:          be achieved internally by first making a copy of the string.
        !           771: 
        !           772:          A buffer is like an array  in  that  it  cannot  be  extended
        !           773:          beyond  its  allocation size.  The origin of the first buffer
        !           774:          character is always one.   Buffer  creation  is  accomplished
        !           775:          directly   with  the  BUFFER  function,  or  indirectly  with
        !           776:          CONVERT.  In addition, every buffer  has  a  dynamic  defined
        !           777:          size that can vary between zero and the maximum allocation.
        !           778: 
        !           779:          Once  a  buffer  has been created,  characters can be written
        !           780:          into  specific  segments  using   the   INSERT   and   APPEND
        !           781:          functions, or using pattern replacement.
        !           782: 
        !           783:          As  with  other aggregate types, two buffers are IDENTical if
        !           784:          and only if they are the same object.
        !           785: 
        !           786:          Most standard functions will convert buffers to strings  when
        !           787:          required.   Exceptions  to this are SUBSTR, which can be used
        !           788:          to directly produce a string  from  a  section  of  a  buffer
        !           789:          without  the  need  for  an intermediate conversion and SIZE,
        !           790:          which  will  give  the  current  defined  size  of  a  buffer
        !           791:          directly.   The  pattern  matching  and  pattern  replacement
        !           792:          operations of the language will also accept a buffer name  as
        !           793:          a  subject.   Pattern  matching  is  done  directly  from the
        !           794:          buffer, and pattern replacement is  done  directly  into  the
        !           795:          buffer as an INSERT function on the substring matched.
        !           796: 
        !           797:          In  addition,  PROTOTYPE  gives  the  prototype  string for a
        !           798:          buffer, which is the integer allocation size  of  the  buffer
        !           799:          object.   COPY  can be used to create a duplicate of a buffer
        !           800:          to work with.  DATATYPE will, of course,  return  the  string
        !           801:          "BUFFER" for any buffer object.
        !           802: 
        !           803: 
        !           804: 
        !           805: 
        !           806: 
        !           807:          MACRO SPITBOL V3.5
        !           808:                                                    PAGE 11 - [3.2]
        !           809:          Datatypes and Conversion
        !           810: 
        !           811: 
        !           812: 
        !           813:  3.2  Possible Datatype Conversions
 3.2  Possible Datatype Conversions
 _____________ ________ ___________
        !           814: 
        !           815:     As  far  as possible SPITBOL converts from one datatype to another
        !           816:     as required.  The following  table  shows  which  conversions  are
        !           817:     possible.    Blank  entries  indicate  that  the  conversions  are
        !           818:     impossible, A indicates that conversion is always possible, and  U
        !           819:     indicates  conversion  is usually possible, depending on the value
        !           820:     involved.
        !           821: 
        !           822:                           CONVERT TO:
        !           823: 
        !           824:                        S I R A T P N E C B
        !           825:                      +--------------------
        !           826:                     S! A U U     A A U U U
        !           827:                     I! A A A     A A A   A
        !           828:                     R! A U A     A A A   A
        !           829:             CONVERT A!       A U
        !           830:              FROM:  T!       A A
        !           831:                     P!           A
        !           832:                     N! U U U     U A U U U
        !           833:                     E!               A
        !           834:                     C!                 A
        !           835:                     B!                   A
        !           836: 
        !           837:             S       STRING
        !           838:             I       INTEGER
        !           839:             R       REAL
        !           840:             A       ARRAY
        !           841:             T       TABLE
        !           842:             P       PATTERN
        !           843:             N       NAME
        !           844:             E       EXPRESSION
        !           845:             C       CODE
        !           846:             B       BUFFER
        !           847: 
        !           848: 
        !           849: 
        !           850: 
        !           851: 
        !           852: 
        !           853: 
        !           854: 
        !           855: 
        !           856: 
        !           857: 
        !           858: 
        !           859: 
        !           860: 
        !           861: 
        !           862: 
        !           863: 
        !           864: 
        !           865: 
        !           866: 
        !           867: 
        !           868: 
        !           869:          MACRO SPITBOL V3.5
        !           870:                                                    PAGE 12 - [3.3]
        !           871:          Datatypes and Conversion
        !           872: 
        !           873: 
        !           874: 
        !           875:  3.3  Conversion Details
 3.3  Conversion Details
 _______________ _______
        !           876: 
        !           877:     This section gives detailed descriptions for each of the  possible
        !           878:     conversions.
        !           879: 
        !           880: 
        !           881:      1.  STRING --> INTEGER
        !           882: 
        !           883:          Leading  and  trailing blanks are ignored.  A leading sign is
        !           884:          optional.  The sign, if  present,  must  immediately  precede
        !           885:          the  digits.   A  null  or  all  blank string is converted to
        !           886:          zero.
        !           887: 
        !           888:      2.  STRING --> REAL
        !           889: 
        !           890:          Leading and trailing blanks are ignored.  A leading  sign  if
        !           891:          present,  must  immediately  precede  the number.  The number
        !           892:          itself may be written in standard FORTRAN  type  format  with
        !           893:          an  optional  exponent.   The  conversion is always accurate,
        !           894:          the last bit  being  correctly  rounded.   A  null  or  blank
        !           895:          string is converted to 0.0 .
        !           896: 
        !           897:      3.  STRING --> PATTERN
        !           898: 
        !           899:          A pattern is created which will match the string value.
        !           900: 
        !           901:      4.  STRING --> NAME
        !           902: 
        !           903:          The  result is the name of the natural variable which has the
        !           904:          given string as its name.  This is identical  to  the  result
        !           905:          of  applying  the  unary  dot  operator  to  the  variable in
        !           906:          question.  The null string cannot be converted to a name.
        !           907: 
        !           908:      5.  STRING --> EXPRESSION
        !           909: 
        !           910:          The string must represent a legal  SPITBOL  expression.   The
        !           911:          compiler  is  used  to convert the string into its equivalent
        !           912:          expression and the result can be used anywhere an  expression
        !           913:          is permitted.
        !           914: 
        !           915:      6.  STRING --> CODE
        !           916: 
        !           917:          The  string  must represent a legal SPITBOL program, complete
        !           918:          with labels, and using  semicolons  to  separate  statements.
        !           919:          The  compiler  is  used to convert the string into executable
        !           920:          code.  The resulting code can be executed by transferring  to
        !           921:          it  with  a  direct  GOTO  or by a normal transfer to a label
        !           922:          within the code.
        !           923: 
        !           924:      7.  STRING --> BUFFER
        !           925: 
        !           926: 
        !           927: 
        !           928: 
        !           929: 
        !           930: 
        !           931:          MACRO SPITBOL V3.5
        !           932:                                                    PAGE 13 - [3.3]
        !           933:          Datatypes and Conversion
        !           934: 
        !           935:          A buffer is created with an  allocation  size  equal  to  the
        !           936:          size  of  the string, and the string value is copied into the
        !           937:          buffer.  The null string cannot be converted to a buffer.
        !           938: 
        !           939: 
        !           940: 
        !           941: 
        !           942: 
        !           943: 
        !           944: 
        !           945: 
        !           946: 
        !           947: 
        !           948: 
        !           949: 
        !           950: 
        !           951: 
        !           952: 
        !           953: 
        !           954: 
        !           955: 
        !           956: 
        !           957: 
        !           958: 
        !           959: 
        !           960: 
        !           961: 
        !           962: 
        !           963: 
        !           964: 
        !           965: 
        !           966: 
        !           967: 
        !           968: 
        !           969: 
        !           970: 
        !           971: 
        !           972: 
        !           973: 
        !           974: 
        !           975: 
        !           976: 
        !           977: 
        !           978: 
        !           979: 
        !           980: 
        !           981: 
        !           982: 
        !           983: 
        !           984: 
        !           985: 
        !           986: 
        !           987: 
        !           988: 
        !           989: 
        !           990: 
        !           991: 
        !           992: 
        !           993:          MACRO SPITBOL V3.5
        !           994:                                                    PAGE 14 - [3.3]
        !           995:          Datatypes and Conversion
        !           996: 
        !           997: 
        !           998:      8.  INTEGER --> STRING
        !           999: 
        !          1000:          The result has no leading  or  trailing  blanks  and  leading
        !          1001:          zeros  are  suppressed.  A minus sign is prefixed to negative
        !          1002:          values.  Zero is converted to "0".
        !          1003: 
        !          1004:      9.  INTEGER --> REAL
        !          1005: 
        !          1006:          A real number is obtained by adding a zero  fractional  part.
        !          1007:          Note  that  it  is  possible  to  lose  significance  in this
        !          1008:          conversion if the mantissa of  the  real  representation  has
        !          1009:          fewer digits than are available for an integer.
        !          1010: 
        !          1011:     10.  INTEGER --> PATTERN
        !          1012: 
        !          1013:          First  convert   to  a  STRING  and  then  treat as STRING to
        !          1014:          PATTERN.
        !          1015: 
        !          1016:     11.  INTEGER --> NAME
        !          1017: 
        !          1018:          First convert to STRING and then treat as STRING to NAME.
        !          1019: 
        !          1020:     12.  INTEGER --> EXPRESSION
        !          1021: 
        !          1022:          The result is an EXPRESSION which when evaluated  yields  the
        !          1023:          INTEGER as its value.
        !          1024: 
        !          1025:     13.  INTEGER --> BUFFER
        !          1026: 
        !          1027:          The  integer  is  first  converted  to a STRING which is then
        !          1028:          converted to a buffer.
        !          1029: 
        !          1030:     14.  REAL --> STRING
        !          1031: 
        !          1032:          The real  number  is  converted  to  its  standard  character
        !          1033:          representation.   Fixed  type  format  is  used  if possible,
        !          1034:          otherwise  an  exponent  (using  E)   is   supplied.    Seven
        !          1035:          significant  digits  are  generated, the last being correctly
        !          1036:          rounded for all  cases.   Trailing  insignificant  zeros  are
        !          1037:          suppressed after rounding has taken place.
        !          1038: 
        !          1039:     15.  REAL --> INTEGER
        !          1040: 
        !          1041:          This  conversion is only possible if the REAL is in the range
        !          1042:          permitted  for  integers.   in  this  case,  the  result   is
        !          1043:          obtained by truncating the fractional part.
        !          1044: 
        !          1045:     16.  REAL --> PATTERN
        !          1046: 
        !          1047:          First convert to STRING and then treat as STRING to PATTERN.
        !          1048: 
        !          1049:     17.  REAL --> NAME
        !          1050: 
        !          1051: 
        !          1052: 
        !          1053: 
        !          1054: 
        !          1055:          MACRO SPITBOL V3.5
        !          1056:                                                    PAGE 15 - [3.3]
        !          1057:          Datatypes and Conversion
        !          1058: 
        !          1059:          First convert to STRING and then treat as STRING to NAME.
        !          1060: 
        !          1061:     18.  REAL --> EXPRESSION
        !          1062: 
        !          1063:          The  result  is an expression which when evaluated yields the
        !          1064:          REAL as its value.
        !          1065: 
        !          1066:     19.  REAL --> BUFFER
        !          1067: 
        !          1068:          First convert to STRING, then treat as STRING to BUFFER.
        !          1069: 
        !          1070:     20.  ARRAY --> TABLE
        !          1071: 
        !          1072:          The array must be two dimensional with a second dimension  of
        !          1073:          2   or  an  error  occurs.   For  each  value  of  the  first
        !          1074:          subscript, J , a table entry using the (J,1)  entry  as  name
        !          1075:          and  the  (J,2)  entry  as value is created.  The table built
        !          1076:          has a number of hash headers (see TABLE in Section  5)  equal
        !          1077:          to the first dimension.
        !          1078: 
        !          1079:     21.  TABLE --> ARRAY
        !          1080: 
        !          1081:          The  table  must  have at least one element which is non-null
        !          1082:          otherwise statement failure occurs.  The array  generated  is
        !          1083:          two  dimensional with the first dimension equal to the number
        !          1084:          of non-null entries in the table and the second dimension  is
        !          1085:          two.   For  each entry, the (J,1) element in the array is the
        !          1086:          the name and the (J,2) element is the value.
        !          1087: 
        !          1088:     22.  NAME --> STRING
        !          1089: 
        !          1090:          A NAME can be converted to a STRING only if it  is  the  name
        !          1091:          of   a   natural  variable.   The  resulting  string  is  the
        !          1092:          character name of the variable.
        !          1093: 
        !          1094:     23.  NAME --> INTEGER, REAL, PATTERN, EXPRESSION, CODE, BUFFER
        !          1095: 
        !          1096:          The NAME is first converted to a  STRING  (if  possible)  and
        !          1097:          then the conversion proceeds as described for STRING.
        !          1098: 
        !          1099: 
        !          1100: 
        !          1101: 
        !          1102: 
        !          1103: 
        !          1104: 
        !          1105: 
        !          1106: 
        !          1107: 
        !          1108: 
        !          1109: 
        !          1110: 
        !          1111: 
        !          1112: 
        !          1113: 
        !          1114: 
        !          1115: 
        !          1116: 
        !          1117:          MACRO SPITBOL V3.5
        !          1118:                                                    PAGE 16 - [4]
        !          1119:          Operators
        !          1120: 
        !          1121: 
        !          1122: 
        !          1123:                             *----------------*
        !          1124:                               [4]  Operators
                            | [4]  Operators |
        !          1125:                             *----------------*
        !          1126: 
        !          1127:     SPITBOL  operators  are  listed  without any detailed descriptions
        !          1128:     since  they  correspond,  with  a  few  exceptions  noted  in  the
        !          1129:     description of differences, to those of SNOBOL4.
        !          1130: 
        !          1131: 
        !          1132:  4.1  Unary Operators
 4.1  Unary Operators
 __________ _________
        !          1133: 
        !          1134:     Unary  operators  all  have  equal  priority which is greater than
        !          1135:     that of any binary operator.
        !          1136: 
        !          1137:     OPERATOR                DESCRIPTION
        !          1138: 
        !          1139:     ?                Interrogation - null if operand succeeds
        !          1140:     &                Keyword
        !          1141:     +                Indicates postive numeric operand
        !          1142:     -                Negates numeric operand
        !          1143:     *                Defers evaluation of expression
        !          1144:     $                Indirection
        !          1145:     .                Returns a name
        !          1146:     ~                Negates failure or success of its operand
        !          1147:     @                Assigns cursor position to its operand
        !          1148: 
        !          1149:          Unused unary operator symbols are   ! % / # =
        !          1150: 
        !          1151: 
        !          1152: 
        !          1153: 
        !          1154: 
        !          1155: 
        !          1156: 
        !          1157: 
        !          1158: 
        !          1159: 
        !          1160: 
        !          1161: 
        !          1162: 
        !          1163: 
        !          1164: 
        !          1165: 
        !          1166: 
        !          1167: 
        !          1168: 
        !          1169: 
        !          1170: 
        !          1171: 
        !          1172: 
        !          1173: 
        !          1174: 
        !          1175: 
        !          1176: 
        !          1177: 
        !          1178: 
        !          1179:          MACRO SPITBOL V3.5
        !          1180:                                                    PAGE 17 - [4.2]
        !          1181:          Operators
        !          1182: 
        !          1183: 
        !          1184: 
        !          1185:  4.2  Binary Operators
 4.2  Binary Operators
 ___________ _________
        !          1186: 
        !          1187:     Several of the associativites and priorities differ from those  of
        !          1188:     SNOBOL4.
        !          1189: 
        !          1190:     OP.     ASSOCY. PRIO.           DEFINITION
        !          1191: 
        !          1192:     =       right   0       Assignment
        !          1193:     ?       left    1       Pattern match
        !          1194:     |       right   3       Pattern alternation
        !          1195:     blank   right   4       Concatenation or pattern match
        !          1196:     +       left    6       Arithmetic addition
        !          1197:     -       left    6       Arithmetic subtraction
        !          1198:     /       left    8       Arithmetic division
        !          1199:     *       left    9       Arithmetic multiplication
        !          1200:     $       left    12      Immediate pattern assignment
        !          1201:     .       left    12      Conditional pattern assignment
        !          1202: 
        !          1203:     &       left    2       Undefined
        !          1204:     @       right   5       Undefined
        !          1205:     ~       left    7       Undefined
        !          1206:     %       left    10      Undefined
        !          1207:     _       right   13      Undefined
        !          1208: 
        !          1209: 
        !          1210: 
        !          1211: 
        !          1212: 
        !          1213: 
        !          1214: 
        !          1215: 
        !          1216: 
        !          1217: 
        !          1218: 
        !          1219: 
        !          1220: 
        !          1221: 
        !          1222: 
        !          1223: 
        !          1224: 
        !          1225: 
        !          1226: 
        !          1227: 
        !          1228: 
        !          1229: 
        !          1230: 
        !          1231: 
        !          1232: 
        !          1233: 
        !          1234: 
        !          1235: 
        !          1236: 
        !          1237: 
        !          1238: 
        !          1239: 
        !          1240: 
        !          1241:          MACRO SPITBOL V3.5
        !          1242:                                                    PAGE 18 - [5]
        !          1243:          Functions
        !          1244: 
        !          1245: 
        !          1246: 
        !          1247:                             *----------------*
        !          1248:                               [5]  Functions
                            | [5]  Functions |
        !          1249:                             *----------------*
        !          1250: 
        !          1251:     This  section  defines  the  built-in  functions  of  SPITBOL, the
        !          1252:     descriptions being given in alphabetical order.   In  most  cases,
        !          1253:     the  arguments  are  pre-converted  to  some  particular datatype.
        !          1254:     This is indicated in the function header by the notation:
        !          1255:       FUNCTION(STRING,INTEGER,....)
        !          1256:     If  the  corresponding  argument  cannot  be  converted   to   the
        !          1257:     indicated  datatype,  an  error  occurs.   Sometimes  the range of
        !          1258:     arguments  permitted  is  restricted,  in  which  case   arguments
        !          1259:     outside  the  range  cause an error.  The usage "ARGUMENT" implies
        !          1260:     that the argument can be of any datatype. "NUMERIC"  implies  that
        !          1261:     either REAL or INTEGER arguments are acceptable.
        !          1262: 
        !          1263:     In  functions  such as ARRAY, DATA, DEFINE with a string prototype
        !          1264:     argument, the string should not contain non-significant blanks.
        !          1265: 
        !          1266: 
        !          1267:  5.1  ANY -- Pattern to Match Selected Character
 5.1  ANY -- Pattern to Match Selected Character
 ________ __ _______ __ _____ ________ _________
        !          1268: 
        !          1269:     ANY(STRING) or ANY(EXPRESSION)
        !          1270: 
        !          1271:     This function  returns   a  pattern  which  will  match  a  single
        !          1272:     character  selected from the characters in the argument string.  A
        !          1273:     null argument is not permitted.   If  an  expression  argument  is
        !          1274:     used,  then  the  expression  is evaluated during pattern matching
        !          1275:     and must yield a non-null string result.
        !          1276: 
        !          1277: 
        !          1278:  5.2  APPEND * -- Append string to buffer
 5.2  APPEND * -- Append string to buffer
 ___________ _ __ ______ ______ __ ______
        !          1279: 
        !          1280:     APPEND(BUFFER,STRING)
        !          1281: 
        !          1282:     APPEND is used to append a string to the contents of  an  existing
        !          1283:     buffer.     APPEND    is    defined    to    be    identical    to
        !          1284:     INSERT(BUFFER,SIZE(BUFFER)+1,0,STRING).  The first  argument  must
        !          1285:     be a buffer type or an error occurs.
        !          1286: 
        !          1287: 
        !          1288:  5.3  APPLY * -- Apply function
 5.3  APPLY * -- Apply function
 __________ _ __ _____ ________
        !          1289: 
        !          1290:     APPLY(NAME,ARG,ARG,...)
        !          1291: 
        !          1292:     The  first argument is the name of a function to be applied to the
        !          1293:     (possibly null) list  of  arguments  following.   Unlike  SNOBOL4,
        !          1294:     SPITBOL  does  not  require  the  number of arguments to match the
        !          1295:     function definition, extra arguments  being  ignored  and  missing
        !          1296:     arguments being supplied as null strings.
        !          1297: 
        !          1298: 
        !          1299: 
        !          1300: 
        !          1301: 
        !          1302: 
        !          1303:          MACRO SPITBOL V3.5
        !          1304:                                                    PAGE 19 - [5.4]
        !          1305:          Functions
        !          1306: 
        !          1307: 
        !          1308: 
        !          1309:  5.4  ARBNO -- Pattern for Iterated Match
 5.4  ARBNO -- Pattern for Iterated Match
 __________ __ _______ ___ ________ _____
        !          1310: 
        !          1311:     ARBNO(PATTERN)
        !          1312: 
        !          1313:     This  function  returns  a  pattern  which will match an arbitrary
        !          1314:     number of occurrences of  the  pattern  argument,  including  zero
        !          1315:     occurrences (this resulting in matching of the null string).
        !          1316: 
        !          1317: 
        !          1318:  5.5  ARG * -- Obtain Argument Name
 5.5  ARG * -- Obtain Argument Name
 ________ _ __ ______ ________ ____
        !          1319: 
        !          1320:     ARG(NAME,INTEGER)
        !          1321: 
        !          1322:     The  first  argument  represents  the  name  of  a  function.  The
        !          1323:     integer is the index of a formal argument to this  function.   The
        !          1324:     NAME  of the selected argument is returned (this is converted to a
        !          1325:     string on output).  ARG fails if the integer is out  of  range  of
        !          1326:     the number of formal arguments.
        !          1327: 
        !          1328: 
        !          1329:  5.6  ARRAY -- Generate Array Structure
 5.6  ARRAY -- Generate Array Structure
 __________ __ ________ _____ _________
        !          1330: 
        !          1331:     ARRAY(STRING,ARG) or ARRAY(INTEGER,ARG)
        !          1332: 
        !          1333:     The  string  represents  the protoype of an array to be allocated.
        !          1334:     This is in the form
        !          1335:        "LBD1:HBD1,LBD2:HBD2,...."
        !          1336:     where  LBD1,HBD1  etc.   are  integers  specifying  low  and  high
        !          1337:     bounds.   The  low  bound  (LBD) may be omitted for some or all of
        !          1338:     the dimensions, in which case the colon may also be omitted and  a
        !          1339:     low  bound of 1 is assumed.  The second argument (of any datatype)
        !          1340:     is the initial value of all the elements in the array.  If  it  is
        !          1341:     omitted,  the  initial  value of all the elements will be the null
        !          1342:     string.  The second form of the call may be  used  to  create  one
        !          1343:     dimensional  arrays  (vectors)  with  a  low  bound  of 1. SPITBOL
        !          1344:     optimises accesses to elements of vectors.
        !          1345: 
        !          1346: 
        !          1347:  5.7  BREAK -- Construct Scanning Pattern
 5.7  BREAK -- Construct Scanning Pattern
 __________ __ _________ ________ _______
        !          1348: 
        !          1349:     BREAK(STRING) or BREAK(EXPRESSION)
        !          1350: 
        !          1351:     This function returns a pattern which will match any string up  to
        !          1352:     the  point  preceding  any  character which occurs in the argument
        !          1353:     string.  A null argument  is  not  permitted.   If  an  expression
        !          1354:     argument  is given, the resulting pattern causes the expression to
        !          1355:     be  evaluated  during  pattern  matching.   In  this   case,   the
        !          1356:     evaluated result must be a non-null string.
        !          1357: 
        !          1358: 
        !          1359: 
        !          1360: 
        !          1361: 
        !          1362: 
        !          1363: 
        !          1364: 
        !          1365:          MACRO SPITBOL V3.5
        !          1366:                                                    PAGE 20 - [5.8]
        !          1367:          Functions
        !          1368: 
        !          1369: 
        !          1370: 
        !          1371:  5.8  BUFFER * -- Create buffer object
 5.8  BUFFER * -- Create buffer object
 ___________ _ __ ______ ______ ______
        !          1372: 
        !          1373:     BUFFER(INTEGER,STRING)
        !          1374: 
        !          1375:     This  function  creates  a buffer-type object (see the description
        !          1376:     in the datatype section).   The  first  argument  is  the  integer
        !          1377:     allocation  for  the  buffer  and  the second argument defines the
        !          1378:     initial contents of the buffer.  The defined size  of  the  buffer
        !          1379:     is  initialized  to  SIZE(STRING).  The allocation must be between
        !          1380:     between 1 and &MAXLNGTH, and the size of the string must  be  less
        !          1381:     than or equal to the allocated size, or an error will occur.
        !          1382: 
        !          1383: 
        !          1384:  5.9  BREAKX * -- Construct Scanning Pattern
 5.9  BREAKX * -- Construct Scanning Pattern
 ___________ _ __ _________ ________ _______
        !          1385: 
        !          1386:     BREAKX(STRING) or BREAKX(EXPRESSION)
        !          1387: 
        !          1388:     BREAKX  returns  a  pattern  whose  initial match is the same as a
        !          1389:     corresponding  BREAK  pattern.   However,  BREAKX   has   implicit
        !          1390:     alternatives  which  on  subsequent  match failure permit scanning
        !          1391:     past the first break character found and  up  to  the  next  break
        !          1392:     character.   Note  that BREAKX may be used to  replace ARB in many
        !          1393:     situations where BREAK cannot be used  easily.   For  example  the
        !          1394:     following replacement can be made -
        !          1395:        ARB ('CAT' ! 'DOG')  -->  BREAKX('CD') ('CAT' ! 'DOG')
        !          1396:     In   the  case  of  an  expression  argument,  the  expression  is
        !          1397:     evaluated during  pattern  matching  and  must  yield  a  non-null
        !          1398:     string.   Note  that  evaluation of the expression is not repeated
        !          1399:     on rematch attempts by extension.
        !          1400: 
        !          1401: 
        !          1402: 
        !          1403: 
        !          1404: 
        !          1405: 
        !          1406: 
        !          1407: 
        !          1408: 
        !          1409: 
        !          1410: 
        !          1411: 
        !          1412: 
        !          1413: 
        !          1414: 
        !          1415: 
        !          1416: 
        !          1417: 
        !          1418: 
        !          1419: 
        !          1420: 
        !          1421: 
        !          1422: 
        !          1423: 
        !          1424: 
        !          1425: 
        !          1426: 
        !          1427:          MACRO SPITBOL V3.5
        !          1428:                                                    PAGE 21 - [5.10]
        !          1429:          Functions
        !          1430: 
        !          1431: 
        !          1432: 
        !          1433:  5.10  CHAR * -- Convert Character Code to String
 5.10  CHAR * -- Convert Character Code to String
 __________ _ __ _______ _________ ____ __ ______
        !          1434: 
        !          1435:     CHAR(INTEGER)
        !          1436: 
        !          1437:     The CHAR function returns a one-character  string  containing  the
        !          1438:     character  with  the  internal character code corresponding to the
        !          1439:     given   argument.    The   string    returned    is    necessarily
        !          1440:     machine-dependent.  In  general however, A = CHAR(N) is equivalent
        !          1441:     to:
        !          1442:        &ALPHABET (LEN(N) LEN(1) . A)
        !          1443: 
        !          1444:     If the given argument is not a non-negative integer in  the  range
        !          1445:     of the host machine character set, an error is issued.
        !          1446: 
        !          1447: 
        !          1448:  5.11  CLEAR * -- Clear Variable Storage
 5.11  CLEAR * -- Clear Variable Storage
 ___________ _ __ _____ ________ _______
        !          1449: 
        !          1450:     CLEAR(STRING)
        !          1451: 
        !          1452:     This  function  causes  the values of variables to be set to null.
        !          1453:     In the simple case, where the argument is  omitted  or  null,  the
        !          1454:     action  is  the  same as in SNOBOL4 (i.e. all variables cleared to
        !          1455:     null).  An extension is available in SPITBOL.  The first  argument
        !          1456:     may  be  a  string  which is a list of variable names separated by
        !          1457:     commas.  These represent the names of variables whose  values  are
        !          1458:     to be left unchanged.  For example -
        !          1459:        CLEAR('ABC,CDE,EFG')
        !          1460:     would  cause the value of all variables except ABC, CDE, EFG to be
        !          1461:     set to the null string.
        !          1462: 
        !          1463: 
        !          1464:  5.12  CODE * -- Compile Code
 5.12  CODE * -- Compile Code
 __________ _ __ _______ ____
        !          1465: 
        !          1466:     CODE(STRING)
        !          1467: 
        !          1468:     The effect of this function is to convert  the  argument  to  type
        !          1469:     CODE  as  described in the section on type conversion.  The STRING
        !          1470:     must represent a valid SPITBOL program complete  with  labels  and
        !          1471:     using  semicolons  (;)  to  separate statements.  The call to CODE
        !          1472:     fails if syntactic errors are found.  In this case it is  possible
        !          1473:     to inspect &ERRTEXT to find the error message.  e.g.
        !          1474:            C = CODE(CD)     :F<CODE(' OUTPUT = &ERRTEXT')>
        !          1475:     SETEXIT  may  also  be  used  to  intercept these errors.  Another
        !          1476:     extension over  SNOBOL4  is  that  the  code  string  may  contain
        !          1477:     embedded  control  cards  (notably  -LIST  to cause listing of the
        !          1478:     code) and comments delimited by semicolons.
        !          1479: 
        !          1480: 
        !          1481: 
        !          1482: 
        !          1483: 
        !          1484: 
        !          1485: 
        !          1486: 
        !          1487: 
        !          1488: 
        !          1489:          MACRO SPITBOL V3.5
        !          1490:                                                    PAGE 22 - [5.13]
        !          1491:          Functions
        !          1492: 
        !          1493: 
        !          1494: 
        !          1495:  5.13  COLLECT -- Initiate Storage Regeneration
 5.13  COLLECT -- Initiate Storage Regeneration
 _____________ __ ________ _______ ____________
        !          1496: 
        !          1497:     COLLECT(INTEGER)
        !          1498: 
        !          1499:     The COLLECT function forces a garbage collection  which  retrieves
        !          1500:     unused  storage  and returns it to the block of available storage.
        !          1501:     The integer argument represents a minimum number of  words  to  be
        !          1502:     made  available.   If  this  amount of storage cannot be obtained,
        !          1503:     the COLLECT function fails.  On successful return, the  result  is
        !          1504:     the   number   of   words   actually   obtained.    Although   the
        !          1505:     implementation of COLLECT is the same as in  SNOBOL4,  the  values
        !          1506:     obtained  will  be  quite different due to different internal data
        !          1507:     representations.  Furthermore,  the  organization  of  SPITBOL  is
        !          1508:     such  that  forcing  garbage  collections to occur before they are
        !          1509:     required increases execution time.
        !          1510: 
        !          1511: 
        !          1512:  5.14  CONVERT * -- Convert Datatypes
 5.14  CONVERT * -- Convert Datatypes
 _____________ _ __ _______ _________
        !          1513: 
        !          1514:     CONVERT(ARGUMENT,STRING)
        !          1515: 
        !          1516:     The returned result is obtained by converting the  first  argument
        !          1517:     to  the type indicated by the string name of the datatype given as
        !          1518:     the second argument.  The permitted conversions are  described  in
        !          1519:     the  section  on  type  conversion.  Any conversions which are not
        !          1520:     permitted cause failure of the CONVERT call.  The second  argument
        !          1521:     may  be  'NUMERIC'  ,  in  which case the argument is converted to
        !          1522:     INTEGER or REAL according to its form.
        !          1523: 
        !          1524: 
        !          1525:  5.15  COPY * -- Copy Structure
 5.15  COPY * -- Copy Structure
 __________ _ __ ____ _________
        !          1526: 
        !          1527:     COPY(ARGUMENT)
        !          1528: 
        !          1529:     The COPY function returns a distinct copy of the object  presented
        !          1530:     as  its argument.  This is only useful for arrays, tables, buffers
        !          1531:     and program defined datatypes.  Note that SPITBOL permits  copying
        !          1532:     of TABLES unlike SNOBOL4.
        !          1533: 
        !          1534: 
        !          1535: 
        !          1536: 
        !          1537: 
        !          1538: 
        !          1539: 
        !          1540: 
        !          1541: 
        !          1542: 
        !          1543: 
        !          1544: 
        !          1545: 
        !          1546: 
        !          1547: 
        !          1548: 
        !          1549: 
        !          1550: 
        !          1551:          MACRO SPITBOL V3.5
        !          1552:                                                    PAGE 23 - [5.16]
        !          1553:          Functions
        !          1554: 
        !          1555: 
        !          1556: 
        !          1557:  5.16  DATA -- Create Datatype
 5.16  DATA -- Create Datatype
 __________ __ ______ ________
        !          1558: 
        !          1559:     DATA(STRING)
        !          1560: 
        !          1561:     The  argument  to  DATA  is  a  prototype  for  a  program defined
        !          1562:     datatype in the form  of  a  function  call  with  arguments  e.g.
        !          1563:     DATA('CMPLX(RE,IM)').   The  function  name  in  the string is the
        !          1564:     name of the new datatype.  The argument names in  the  string  are
        !          1565:     the  names  of  field selector functions used to access the fields
        !          1566:     of  the  new  datatype.   Increased  efficiency  is  obtained   by
        !          1567:     avoiding   the   use   of  duplicate  field  names  for  different
        !          1568:     datatypes, although such multiple use is not forbidden.
        !          1569: 
        !          1570: 
        !          1571:  5.17  DATATYPE * -- Obtain Datatype
 5.17  DATATYPE * -- Obtain Datatype
 ______________ _ __ ______ ________
        !          1572: 
        !          1573:     DATATYPE(ARGUMENT)
        !          1574: 
        !          1575:     DATATYPE returns the formal identification of the datatype of  its
        !          1576:     argument.
        !          1577: 
        !          1578: 
        !          1579:  5.18  DATE * -- Obtain Date
 5.18  DATE * -- Obtain Date
 __________ _ __ ______ ____
        !          1580: 
        !          1581:     DATE()
        !          1582: 
        !          1583:     DATE  returns  a  string giving the current date and possibly also
        !          1584:     clock-on-the-wall-time (see Section 12.)
        !          1585: 
        !          1586: 
        !          1587:  5.19  DEFINE -- Define a Function
 5.19  DEFINE -- Define a Function
 ____________ __ ______ _ ________
        !          1588: 
        !          1589:     DEFINE(STRING) or DEFINE(STRING,NAME)
        !          1590: 
        !          1591:     The DEFINE function is used to create  program  defined  functions
        !          1592:     according  to  the prototype supplied as the argument.  The second
        !          1593:     argument if  supplied,  names  the  label  at  the  entry  to  the
        !          1594:     function.
        !          1595: 
        !          1596: 
        !          1597:  5.20  DETACH -- Detach I/O Association
 5.20  DETACH -- Detach I/O Association
 ____________ __ ______ ___ ___________
        !          1598: 
        !          1599:     DETACH(NAME)
        !          1600: 
        !          1601:     NAME  is the name of a variable which has previously been input or
        !          1602:     output associated   by appearing as the first  argument  of  INPUT
        !          1603:     or  OUTPUT.   DETACH  cancels  the association of the variable but
        !          1604:     does not affect the file to which it was associated.
        !          1605: 
        !          1606: 
        !          1607: 
        !          1608: 
        !          1609: 
        !          1610: 
        !          1611: 
        !          1612: 
        !          1613:          MACRO SPITBOL V3.5
        !          1614:                                                    PAGE 24 - [5.21]
        !          1615:          Functions
        !          1616: 
        !          1617: 
        !          1618: 
        !          1619:  5.21  DIFFER * -- Test for Arguments Differing
 5.21  DIFFER * -- Test for Arguments Differing
 ____________ _ __ ____ ___ _________ _________
        !          1620: 
        !          1621:     DIFFER(ARGUMENT,ARGUMENT)
        !          1622: 
        !          1623:     DIFFER is a predicate function which fails if  its  two  arguments
        !          1624:     are identical objects.  In SPITBOL
        !          1625:        DIFFER(.ABC,'ABC')
        !          1626:     succeeds  since  .ABC  is  a  NAME.  DIFFER and IDENT are the only
        !          1627:     functions in  which  the  different  implementation  of  the  name
        !          1628:     operator (unary dot) may give rise to problems.
        !          1629: 
        !          1630:     DIFFER also works on object of type BUFFER (see IDENT).
        !          1631: 
        !          1632: 
        !          1633:  5.22  DUMP * -- Dump Storage
 5.22  DUMP * -- Dump Storage
 __________ _ __ ____ _______
        !          1634: 
        !          1635:     DUMP(INTEGER)
        !          1636: 
        !          1637:     The  DUMP  function  causes  a  dump  of  current values to occur.
        !          1638:     After the dump is complete, execution  continues  unaffected  (the
        !          1639:     DUMP  function  returns  the  null  string). If the argument is 1,
        !          1640:     then the dump includes values of  all  non-constant  keywords  and
        !          1641:     all  non-null  natural  variables.  If the argument is 2, then the
        !          1642:     dump also  includes  values  of  all   non-null  array  and  table
        !          1643:     elements  and  non-null field values of program defined datatypes.
        !          1644:     The format of the latter  dump  is  self  explanatory  and  avoids
        !          1645:     printing  any  structure  more  than  once.  A call to DUMP with a
        !          1646:     zero argument is ignored.  This  allows  use  of  a  switch  value
        !          1647:     which  can  be turned on and off globally.  A call to DUMP with an
        !          1648:     argument greater than 2 produces a core dump in  the  same  format
        !          1649:     as  that produced by a system abnormal end and should therefore be
        !          1650:     used with discretion.
        !          1651: 
        !          1652: 
        !          1653:  5.23  DUPL * -- Duplicate String or Pattern
 5.23  DUPL * -- Duplicate String or Pattern
 __________ _ __ _________ ______ __ _______
        !          1654: 
        !          1655:     DUPL(STRING,INTEGER) or DUPL(PATTERN,INTEGER)
        !          1656: 
        !          1657:     DUPL returns a result obtained by duplicating the  first  argument
        !          1658:     the  number  of  times  indicated by the second.  A null string is
        !          1659:     returned if INTEGER is zero and statement failure occurs if it  is
        !          1660:     negative.
        !          1661: 
        !          1662: 
        !          1663:  5.24  EJECT * -- Eject to new page
 5.24  EJECT * -- Eject to new page
 ___________ _ __ _____ __ ___ ____
        !          1664: 
        !          1665:     EJECT(INTEGER) or EJECT(STRING)
        !          1666: 
        !          1667:     The  argument must have previously appeared as the second argument
        !          1668:     of a call of  OUTPUT to identify an output channel.  An  eject  to
        !          1669:     the  top  of  the  next page of the output file occurs.  A null or
        !          1670:     absent argument causes an eject on the standard output file.
        !          1671: 
        !          1672: 
        !          1673: 
        !          1674: 
        !          1675:          MACRO SPITBOL V3.5
        !          1676:                                                    PAGE 25 - [5.25]
        !          1677:          Functions
        !          1678: 
        !          1679: 
        !          1680: 
        !          1681:  5.25  ENDFILE * -- Close a File
 5.25  ENDFILE * -- Close a File
 _____________ _ __ _____ _ ____
        !          1682: 
        !          1683:     ENDFILE(INTEGER) or ENDFILE(STRING)
        !          1684: 
        !          1685:     The argument must have previously appeared as the second  argument
        !          1686:     of  a  call  of    INPUT  or  OUTPUT  to  identify an input/output
        !          1687:     channel.  The file attached to the channel is  closed,  associated
        !          1688:     storage  is  released  and  all variables associated with the file
        !          1689:     are detached.  Thus ENDFILE should be used only  when  no  further
        !          1690:     use  is  to  be  made of the file.  If the file is to be reread or
        !          1691:     rewritten,  use  REWIND  (if  the  implementation  supports   this
        !          1692:     function - see Section 12).
        !          1693: 
        !          1694: 
        !          1695:  5.26  EQ -- Test for Equal
 5.26  EQ -- Test for Equal
 ________ __ ____ ___ _____
        !          1696: 
        !          1697:     EQ(NUMERIC,NUMERIC)
        !          1698: 
        !          1699:     EQ  is  a  predicate  function which succeeds if its two arguments
        !          1700:     are equal.
        !          1701: 
        !          1702: 
        !          1703:  5.27  EVAL * -- Evaluate Expression
 5.27  EVAL * -- Evaluate Expression
 __________ _ __ ________ __________
        !          1704: 
        !          1705:     EVAL(EXPRESSION)
        !          1706: 
        !          1707:     EVAL returns the result of  evaluating  its  expression  argument.
        !          1708:     Note  that  a  string  can  be  converted  into  an  expression by
        !          1709:     compiling it into CODE.  Thus EVAL in SPITBOL is  compatible  with
        !          1710:     SNOBOL4  and  handles strings in the same way.  If an error occurs
        !          1711:     in evaluating the argument,  &ERRTEXT is set and EVAL  fails.   To
        !          1712:     avoid  such  errors  passing   unnoticed,  it  may  be well to use
        !          1713:     SETEXIT to intercept them,  or use a FAIL  goto,  or  evaluate  in
        !          1714:     -NOFAIL  mode.
        !          1715: 
        !          1716: 
        !          1717:  5.28  EXIT * -- Exit to Save Load Module or to JCL
 5.28  EXIT * -- Exit to Save Load Module or to JCL
 __________ _ __ ____ __ ____ ____ ______ __ __ ___
        !          1718: 
        !          1719:     EXIT(INTEGER) or EXIT(STRING)
        !          1720: 
        !          1721:     This  function  resembles that introduced by Gimpel in SITBOL.  It
        !          1722:     permits the saving of a core image at any point in  the  execution
        !          1723:     of  a  SPITBOL  program  to  produce  a   load module  and in some
        !          1724:     implementations it may be permissible to exit  from  SPITBOL  into
        !          1725:     another  program.   For  an  often  executed program use of a load
        !          1726:     module saves translation  and  initialisation  time.    A  garbage
        !          1727:     collection  is  performed  in  order to compact store before it is
        !          1728:     saved.  If initialising code is  label  free,  it  is  collectable
        !          1729:     after  it  has  been  executed,  giving  a further opportunity for
        !          1730:     economy.  The argument, N, may have the following values -
        !          1731: 
        !          1732: 
        !          1733: 
        !          1734: 
        !          1735: 
        !          1736: 
        !          1737:          MACRO SPITBOL V3.5
        !          1738:                                                    PAGE 26 - [5.28]
        !          1739:          Functions
        !          1740: 
        !          1741: 
        !          1742: 
        !          1743:      1.  N > 0   Save the whole core  image  (includes  all  the  pure
        !          1744:          SPITBOL  code  and  unused  stack space, so is wasteful). The
        !          1745:          resulting load  module  is  free-standing  and  is  not  made
        !          1746:          obsolete by changes to SPITBOL.
        !          1747: 
        !          1748:      2.  N  =  0   Interrupt program execution and return to JCL level
        !          1749:          so  that  user  can  issue  JCL  commands  and  then   resume
        !          1750:          execution if wished.  Does not save a core image.
        !          1751: 
        !          1752:      3.  N  <  0  Save the impure areas of memory only so that program
        !          1753:          can be restarted by loading pure SPITBOL  code  +  the  saved
        !          1754:          areas.   The  resulting load modules are considerably smaller
        !          1755:          than for the case N = 1, but are made obsolete  and  must  be
        !          1756:          regenerated as new versions of SPITBOL are released.
        !          1757: 
        !          1758:      4.  N  =  "string".   If  this feature is available, (see Section
        !          1759:          12), then SPITBOL execution is  terminated  and  the  program
        !          1760:          named by "string" is entered.
        !          1761: 
        !          1762: 
        !          1763:     EXIT  returns  the null string and may occur in the program at any
        !          1764:     position syntactically valid for a function  call.   No  mechanism
        !          1765:     is  provided  for automatic re-attaching of files which are in use
        !          1766:     at the time an EXIT call terminates a run.  Hence EXIT  calls  are
        !          1767:     most  commonly  placed  after  initialising  code  and  before the
        !          1768:     opening of input/output files for the program proper.  In  general
        !          1769:     no  standard input file is available when a load module is run, so
        !          1770:     references  to  variable  INPUT  will  fail  unless  it  has  been
        !          1771:     detached  or  a  file is explicitly associated to it.  The absence
        !          1772:     of a standard output file may create problems  (in  reporting  run
        !          1773:     time  errors  in  particular).  SPITBOL  implementors will usually
        !          1774:     provide  a  means  of  attaching  such  a  file  at   load   time.
        !          1775:     Alternatively a user may prefer to include a statement
        !          1776: 
        !          1777:          OUTPUT(.OUTPUT,,'FILENAME')
        !          1778: 
        !          1779:     Failing  these  possibilities,  either  a default output file name
        !          1780:     should be allocated or execution should end with a  special  error
        !          1781:     code  if  printing  to  a non-existent standard file is attempted.
        !          1782:     Section  12  gives  details  for  this  implementation.    Certain
        !          1783:     listing options may be selected by choice of the argument value.
        !          1784:       N  =  +1  or  -1. The output file will be given a heading and in
        !          1785:     some implementations it  may  be  possible  to  re-specify  record
        !          1786:     length  (only  to  a  smaller  value  than during compilation) and
        !          1787:     other options.
        !          1788:       N = +2 or -2. Heading omitted but  re-specification  of  options
        !          1789:     may be possible.
        !          1790:       N = +3 or -3. Heading omitted and no option re-specification.
        !          1791: 
        !          1792: 
        !          1793: 
        !          1794: 
        !          1795: 
        !          1796: 
        !          1797: 
        !          1798: 
        !          1799:          MACRO SPITBOL V3.5
        !          1800:                                                    PAGE 27 - [5.29]
        !          1801:          Functions
        !          1802: 
        !          1803: 
        !          1804: 
        !          1805:  5.29  FENCE * -- Generate Fenced Pattern
 5.29  FENCE * -- Generate Fenced Pattern
 ___________ _ __ ________ ______ _______
        !          1806: 
        !          1807:     FENCE(PATTERN)
        !          1808: 
        !          1809:     FENCE(pattern)  returns  a  pattern value which is the same as the
        !          1810:     given pattern, except that alternatives  within  the  pattern  are
        !          1811:     only  seen  by  the  scanner  when  it  is  moving  in the forward
        !          1812:     direction.    Pattern   backup   will    always    pass    through
        !          1813:                                                                    not
    FENCE(pattern).  Note that backup through FENCE(pattern) does  ___
        !          1814:     cause  the  match to abort, as does the &FENCE pattern, it is that
        !          1815:     alternatives within the Fenced pattern are not examined  when  the
        !          1816:     scanner  is  backing  up.  For  example, this pattern will match a
        !          1817:     string of text up to the next comma, or if there is no  comma,  to
        !          1818:     the  end  of  the  string.   The text is put in STR, and the match
        !          1819:     will only succeed if STR is non-null.
        !          1820:             P = FENCE( BREAK(',') | REM ) $ STR  *DIFFER(STR)
        !          1821:     Without the FENCE, failure of  the  DIFFER(STR)  would  cause  the
        !          1822:     scanner  to try the REM alternative regardless of whether or not a
        !          1823:     comma is found.
        !          1824: 
        !          1825:     FENCE is not available in all implementations.  See Section 12.
        !          1826: 
        !          1827: 
        !          1828:  5.30  FIELD * -- Get Field Name
 5.30  FIELD * -- Get Field Name
 ___________ _ __ ___ _____ ____
        !          1829: 
        !          1830:     FIELD(NAME,INTEGER)
        !          1831: 
        !          1832:     FIELD returns the NAME  of  the  selected  field  of  the  program
        !          1833:     defined  datatype whose name is the first argument.  If the second
        !          1834:     argument is out of range (less than 1, or greater than the  number
        !          1835:     of fields), the FIELD function fails.
        !          1836: 
        !          1837: 
        !          1838:  5.31  GE -- Test for Greater or Equal
 5.31  GE -- Test for Greater or Equal
 ________ __ ____ ___ _______ __ _____
        !          1839: 
        !          1840:     GE(NUMERIC,NUMERIC)
        !          1841: 
        !          1842:     GE  is  a  predicate function which succeeds if the first argument
        !          1843:     is greater than or equal to the second.
        !          1844: 
        !          1845: 
        !          1846:  5.32  GT -- Test for Greater
 5.32  GT -- Test for Greater
 ________ __ ____ ___ _______
        !          1847: 
        !          1848:     GT(NUMERIC,NUMERIC)
        !          1849: 
        !          1850:     GT is a predicate function which succeeds if  the  first  argument
        !          1851:     is greater than the second.
        !          1852: 
        !          1853: 
        !          1854: 
        !          1855: 
        !          1856: 
        !          1857: 
        !          1858: 
        !          1859: 
        !          1860: 
        !          1861:          MACRO SPITBOL V3.5
        !          1862:                                                    PAGE 28 - [5.33]
        !          1863:          Functions
        !          1864: 
        !          1865:  5.33  HOST * -- Obtain Information about Host Computer
 5.33  HOST * -- Obtain Information about Host Computer
 __________ _ __ ______ ___________ _____ ____ ________
        !          1866: 
        !          1867:     HOST(ARGUMENT,ARGUMENT,ARGUMENT)
        !          1868: 
        !          1869:     SPITBOL  runs on different mainframes with differing file formats,
        !          1870:     file naming conventions etc.  which makes  it  desirable  in  some
        !          1871:     programs  to  know  on  what machine the program is running.  HOST
        !          1872:     called with null arguments returns a string of the form
        !          1873:        "<COMPUTER NAME>:<OPERATING SYSTEM NAME>:<SITE NAME>"
        !          1874:     which  satisfies  most  requirements  of  this   kind.    At   the
        !          1875:     discretion  of  the SPITBOL implementor, non-null arguments may be
        !          1876:     used to specify other features specific to the host.  See  Section
        !          1877:     12 for details.
        !          1878: 
        !          1879: 
        !          1880:  5.34  IDENT * -- Test for Identical
 5.34  IDENT * -- Test for Identical
 ___________ _ __ ____ ___ _________
        !          1881: 
        !          1882:     IDENT(ARGUMENT,ARGUMENT)
        !          1883: 
        !          1884:     IDENT  is a predicate function which succeeds if its two arguments
        !          1885:     are identical.  In SPITBOL,
        !          1886:        IDENT(.ABC,'ABC')
        !          1887:     fails since .ABC is a NAME in SPITBOL.  Also, two values  of  type
        !          1888:     BUFFER  will  be IDENTical if and only if they are the same buffer
        !          1889:     object.  Apart from this, IDENT is compatible with SNOBOL4.
        !          1890: 
        !          1891: 
        !          1892: 
        !          1893: 
        !          1894: 
        !          1895: 
        !          1896: 
        !          1897: 
        !          1898: 
        !          1899: 
        !          1900: 
        !          1901: 
        !          1902: 
        !          1903: 
        !          1904: 
        !          1905: 
        !          1906: 
        !          1907: 
        !          1908: 
        !          1909: 
        !          1910: 
        !          1911: 
        !          1912: 
        !          1913: 
        !          1914: 
        !          1915: 
        !          1916: 
        !          1917: 
        !          1918: 
        !          1919: 
        !          1920: 
        !          1921: 
        !          1922: 
        !          1923:          MACRO SPITBOL V3.5
        !          1924:                                                    PAGE 29 - [5.35]
        !          1925:          Functions
        !          1926: 
        !          1927: 
        !          1928: 
        !          1929:  5.35  INPUT * -- Set Input Association
 5.35  INPUT * -- Set Input Association
 ___________ _ __ ___ _____ ___________
        !          1930: 
        !          1931:     INPUT(NAME,INTEGER,STRING) or INPUT(NAME,STRING,STRING)
        !          1932: 
        !          1933:     Rather than give a separate description of OUTPUT which  would  be
        !          1934:     almost  exactly  parallel with that for INPUT, a joint description
        !          1935:     is given  here.   Some  machine  dependency  is  likely  in  these
        !          1936:     functions   -   see  Section  12  for  details  relating  to  this
        !          1937:     implementation.
        !          1938: 
        !          1939:     The first argument is the name  of  a  variable  which  is  to  be
        !          1940:     input/output  associated  and  is required, whereas the others are
        !          1941:     optional.  The second argument  identifies  a  channel  which  may
        !          1942:     subsequently   be  used  to  refer  to  the  association.   It  is
        !          1943:     recommended that,  as  in  SNOBOL4,  the  second  argument  be  an
        !          1944:     integer  but  the  use  of  a more general string is not excluded.
        !          1945:     Different  channel  identifiers   are   required   for   accessing
        !          1946:     different  files.   The  second  argument  may be omitted in which
        !          1947:     case association is to the standard input  or  output  file.   The
        !          1948:     chief  divergence between SNOBOL4 and SPITBOL is in the use of the
        !          1949:     third argument, where SPITBOL permits the very useful  feature  of
        !          1950:     dynamic  file  assignment.  The general form of the third argument
        !          1951:     is a string
        !          1952: 
        !          1953:         <f>,R<r>,C<c>,I<i>,X<x>...      where
        !          1954: 
        !          1955:     <f> is an optional file name which is placed first;
        !          1956: 
        !          1957:     ,   is a delimiter used to mark  off  remaining  items  which  are
        !          1958:         optional and may occur in any order;
        !          1959: 
        !          1960:     <r> is  the  maximum  record  length  in  characters  for the file
        !          1961:         (default values are documented in Section 12);
        !          1962: 
        !          1963:     <c> is a carriage control  character  or  string  needed  in  some
        !          1964:         implementations;
        !          1965: 
        !          1966:     <i> is   additional   channel   identification   needed   in  some
        !          1967:         implementations  in  the  absence  of  <f>  to  associate  the
        !          1968:         variable  with  a file attached by job control commands at the
        !          1969:         start of a SPITBOL run;
        !          1970: 
        !          1971:     <x> symbolises   additional   fields    needed    in    particular
        !          1972:         implementations.
        !          1973: 
        !          1974:     If  <f>  is  non-null,  when  the  statement is obeyed file <f> is
        !          1975:     opened and assigned to the channel  corresponding  to  the  second
        !          1976:     argument  and  normally  this  assignment should be performed once
        !          1977:     only.  If several variables are  to  be  associated  to  the  same
        !          1978:     channel,  <f>  should  be  omitted  from  all but the first of the
        !          1979:     INPUT/OUTPUT calls.
        !          1980: 
        !          1981: 
        !          1982: 
        !          1983: 
        !          1984: 
        !          1985:          MACRO SPITBOL V3.5
        !          1986:                                                    PAGE 30 - [5.35]
        !          1987:          Functions
        !          1988: 
        !          1989:     Alternatively <f> can be omitted from all INPUT/OUTPUT  statements
        !          1990:     relating  to  a  channel  provided  the  necessary assignments are
        !          1991:     performed  by  suitable  job  control  commands  before  execution
        !          1992:     starts.  Thus -
        !          1993:        INPUT(.IN,2,'INFILE');    OUTPUT(.OU,7,'OUF')
        !          1994:        INPUT(.IN,2);             OUTPUT(.OU,7)
        !          1995:     will  have the same effect if in the latter case INFILE , OUF have
        !          1996:     been suitably attached by JCL commands.  A call in  which  <f>  is
        !          1997:     omitted  but  some  other  item  is present in the third argument,
        !          1998:     alters the association of the channel  in  respect  of  that  item
        !          1999:     only.   E.g.  INPUT(.X,,',R72')  sets the maximum record length to
        !          2000:     72 characters.
        !          2001: 
        !          2002:     Error  messages  are  given  for   syntactically   invalid   third
        !          2003:     arguments  but  in  the  case  where  the  file corresponding to a
        !          2004:     syntactically valid file name  cannot  be  found,  then  statement
        !          2005:     failure  occurs  and  may  be  tested  for  in  the usual way by a
        !          2006:     conditional goto.  For the sake of portability and  compatibility,
        !          2007:     programmers  are  strongly  urged  to use integer second arguments
        !          2008:     (as in SNOBOL4) and short alphanumeric file  names  in  the  third
        !          2009:     argument.   Further  details, particular to an implementation, are
        !          2010:     given in Section 12.
        !          2011: 
        !          2012: 
        !          2013:  5.36  INSERT * -- Insert string in buffer
 5.36  INSERT * -- Insert string in buffer
 ____________ _ __ ______ ______ __ ______
        !          2014: 
        !          2015:     INSERT(BUFFER,INTEGER,INTEGER,STRING)
        !          2016: 
        !          2017:     The function INSERT is defined to return null, but  has  the  side
        !          2018:     effect  of  replacing  characters (pos, pos+1, ..., pos+length) in
        !          2019:     the designated BUFFER with the characters  of  STRING.   "Pos"  is
        !          2020:     given  by  the first INTEGER argument, and "length" by the second.
        !          2021:     Note that if "length"  is  not  equal  to  SIZE(string)  then  the
        !          2022:     trailing  contents  of  the  buffer  following  the  section to be
        !          2023:     replaced will have  to  be  moved  by  INSERT  to  accomodate  the
        !          2024:     STRING.
        !          2025: 
        !          2026:     If  the  inserted  string  cannot  fit,  or if the insertion would
        !          2027:     leave a 'gap' of undefined characters  in  the  buffer,  then  the
        !          2028:     INSERT call fails.
        !          2029: 
        !          2030:     If  the first argument is not a buffer type, then an error occurs.
        !          2031:     (No conversion is attempted since it would be pointless).
        !          2032: 
        !          2033: 
        !          2034: 
        !          2035: 
        !          2036: 
        !          2037: 
        !          2038: 
        !          2039: 
        !          2040: 
        !          2041: 
        !          2042: 
        !          2043: 
        !          2044: 
        !          2045: 
        !          2046: 
        !          2047:          MACRO SPITBOL V3.5
        !          2048:                                                    PAGE 31 - [5.37]
        !          2049:          Functions
        !          2050: 
        !          2051: 
        !          2052: 
        !          2053:  5.37  INTEGER * -- Test for Integer
 5.37  INTEGER * -- Test for Integer
 _____________ _ __ ____ ___ _______
        !          2054: 
        !          2055:     INTEGER(NUMERIC)
        !          2056: 
        !          2057:     INTEGER is a predicate function which succeeds if its argument  is
        !          2058:     integral.   It  fails  if  the  argument  cannot  be  converted to
        !          2059:     numeric or has a non-integral value.
        !          2060: 
        !          2061: 
        !          2062:  5.38  ITEM -- Select Array or Table Element
 5.38  ITEM -- Select Array or Table Element
 __________ __ ______ _____ __ _____ _______
        !          2063: 
        !          2064:     ITEM(ARRAY,INTEGER,INTEGER,....) or  ITEM(TABLE,ARGUMENT)
        !          2065: 
        !          2066:     ITEM returns the selected array or table element  by  name.   Note
        !          2067:     that  the use of ITEM is never necessary in SPITBOL because of the
        !          2068:     extended syntax for array references.
        !          2069: 
        !          2070: 
        !          2071:  5.39  LE -- Test for Less or Equal
 5.39  LE -- Test for Less or Equal
 ________ __ ____ ___ ____ __ _____
        !          2072: 
        !          2073:     LE(NUMERIC,NUMERIC)
        !          2074: 
        !          2075:     LE is a predicate function which succeeds if  its  first  argument
        !          2076:     is less than or equal to the second argument.
        !          2077: 
        !          2078: 
        !          2079: 
        !          2080: 
        !          2081: 
        !          2082: 
        !          2083: 
        !          2084: 
        !          2085: 
        !          2086: 
        !          2087: 
        !          2088: 
        !          2089: 
        !          2090: 
        !          2091: 
        !          2092: 
        !          2093: 
        !          2094: 
        !          2095: 
        !          2096: 
        !          2097: 
        !          2098: 
        !          2099: 
        !          2100: 
        !          2101: 
        !          2102: 
        !          2103: 
        !          2104: 
        !          2105: 
        !          2106: 
        !          2107: 
        !          2108: 
        !          2109:          MACRO SPITBOL V3.5
        !          2110:                                                    PAGE 32 - [5.40]
        !          2111:          Functions
        !          2112: 
        !          2113: 
        !          2114: 
        !          2115:  5.40  LEN -- Generate Specified Length Pattern
 5.40  LEN -- Generate Specified Length Pattern
 _________ __ ________ _________ ______ _______
        !          2116: 
        !          2117:     LEN(INTEGER) or LEN(EXPRESSION)
        !          2118: 
        !          2119:     LEN   generates  a  pattern  which  will  match  any  sequence  of
        !          2120:     characters of length  given  by  the  argument  which  must  be  a
        !          2121:     non-negative  integer.   If  the  argument is an expression, it is
        !          2122:     evaluated during pattern matching and must  yield  a  non-negative
        !          2123:     integer.
        !          2124: 
        !          2125: 
        !          2126:  5.41  LEQ * -- Test for Lexically Equal
 5.41  LEQ * -- Test for Lexically Equal
 _________ _ __ ____ ___ _________ _____
        !          2127: 
        !          2128:     LEQ(STRING,STRING)
        !          2129: 
        !          2130:     LEQ  is  a predicate which succeeds if its arguments are lexically
        !          2131:     equal.   LEQ  differs  from  IDENT  in  that  its  arguments   are
        !          2132:     converted to strings so that both the following succeed
        !          2133:        LEQ(10,'10')             LEQ(.ABC,'ABC')
        !          2134: 
        !          2135: 
        !          2136:  5.42  LGE * -- Test for Lexically Greater or Equal
 5.42  LGE * -- Test for Lexically Greater or Equal
 _________ _ __ ____ ___ _________ _______ __ _____
        !          2137: 
        !          2138:     LGE(STRING,STRING)
        !          2139: 
        !          2140:     LGE  is  a  predicate  which  succeeds  if  the  first argument is
        !          2141:     lexically greater than or equal to the second argument.
        !          2142: 
        !          2143: 
        !          2144:  5.43  LGT * -- Test for Lexically Greater
 5.43  LGT * -- Test for Lexically Greater
 _________ _ __ ____ ___ _________ _______
        !          2145: 
        !          2146:     LGT(STRING,STRING)
        !          2147: 
        !          2148:     LGT is a  predicate  which  succeeds  if  the  first  argument  is
        !          2149:     lexically greater than the second argument.
        !          2150: 
        !          2151: 
        !          2152:  5.44  LLE * -- Test for Lexically Less or Equal
 5.44  LLE * -- Test for Lexically Less or Equal
 _________ _ __ ____ ___ _________ ____ __ _____
        !          2153: 
        !          2154:     LLE(STRING,STRING)
        !          2155: 
        !          2156:     LLE  is  a  predicate  which  succeeds  if  the  first argument is
        !          2157:     lexically less than or equal to the second argument.
        !          2158: 
        !          2159: 
        !          2160: 
        !          2161: 
        !          2162: 
        !          2163: 
        !          2164: 
        !          2165: 
        !          2166: 
        !          2167: 
        !          2168: 
        !          2169: 
        !          2170: 
        !          2171:          MACRO SPITBOL V3.5
        !          2172:                                                    PAGE 33 - [5.45]
        !          2173:          Functions
        !          2174: 
        !          2175: 
        !          2176: 
        !          2177:  5.45  LLT * -- Test for Lexically Less
 5.45  LLT * -- Test for Lexically Less
 _________ _ __ ____ ___ _________ ____
        !          2178: 
        !          2179:     LLT(STRING,STRING)
        !          2180: 
        !          2181:     LLT is a  predicate  which  succeeds  if  the  first  argument  is
        !          2182:     lexically less than the second argument.
        !          2183: 
        !          2184: 
        !          2185:  5.46  LNE * -- Test for Lexically Not Equal
 5.46  LNE * -- Test for Lexically Not Equal
 _________ _ __ ____ ___ _________ ___ _____
        !          2186: 
        !          2187:     LNE(STRING,STRING)
        !          2188: 
        !          2189:     LNE  is  a predicate which succeeds if its arguments are lexically
        !          2190:     unequal.  LNE differs  from  DIFFER  in  that  its  arguments  are
        !          2191:     converted to strings so that both the following fail
        !          2192:        LNE(10,'10')                 LNE(.ABC,'ABC')
        !          2193: 
        !          2194: 
        !          2195:  5.47  LOAD -- Load External Function
 5.47  LOAD -- Load External Function
 __________ __ ____ ________ ________
        !          2196: 
        !          2197:     LOAD(STRING,STRING)
        !          2198: 
        !          2199:     LOAD  is  used  to  make  external  functions available to SPITBOL
        !          2200:     programs.  The first STRING is a prototype of the form:
        !          2201: 
        !          2202:        "function-name(type,type,...)result-type"
        !          2203: 
        !          2204:     The  indicated  types  can  be  any  of  "INTEGER",   "REAL"   (if
        !          2205:     implemented)  or  "STRING" in which case the value is converted to
        !          2206:     the designated type before being passed  to  (returned  from)  the
        !          2207:     external  function.  Any other name for a type leaves the value in
        !          2208:     an unconverted form.
        !          2209: 
        !          2210:     The second argument to LOAD is a library name where  the  function
        !          2211:     is to be found.
        !          2212: 
        !          2213:     LOAD  is  highly  implementation  specific and is not available in
        !          2214:     all implementations.  See Section 12 for details.
        !          2215: 
        !          2216: 
        !          2217:  5.48  LOCAL * -- Get Name of Local
 5.48  LOCAL * -- Get Name of Local
 ___________ _ __ ___ ____ __ _____
        !          2218: 
        !          2219:     LOCAL(NAME,INTEGER)
        !          2220: 
        !          2221:     The value returned is the NAME  of  the  indicated  local  of  the
        !          2222:     function  whose  name is given by the first argument.  LOCAL fails
        !          2223:     if the second argument is out of range (less than  1,  or  greater
        !          2224:     than the number of locals).
        !          2225: 
        !          2226: 
        !          2227: 
        !          2228: 
        !          2229: 
        !          2230: 
        !          2231: 
        !          2232: 
        !          2233:          MACRO SPITBOL V3.5
        !          2234:                                                    PAGE 34 - [5.49]
        !          2235:          Functions
        !          2236: 
        !          2237: 
        !          2238: 
        !          2239:  5.49  LPAD * -- Left Pad
 5.49  LPAD * -- Left Pad
 __________ _ __ ____ ___
        !          2240: 
        !          2241:     LPAD(STRING,INTEGER,STRING)
        !          2242: 
        !          2243:     LPAD  returns  the  result  obtained  by  padding  out  the  first
        !          2244:     argument on the  left  to  the  length  specified  by  the  second
        !          2245:     argument,  using  the  pad character supplied by the one character
        !          2246:     string third argument.  If the third argument is null or  omitted,
        !          2247:     a  blank  is  used as the pad character.  If the first argument is
        !          2248:     already long enough or too long, it is  returned  unchanged,  this
        !          2249:     always  being the case if the second argument is negative or zero.
        !          2250:     LPAD is useful for constructing columnar output.
        !          2251: 
        !          2252: 
        !          2253:  5.50  LT -- Test for Less
 5.50  LT -- Test for Less
 ________ __ ____ ___ ____
        !          2254: 
        !          2255:     LT(NUMERIC,NUMERIC)
        !          2256: 
        !          2257:     LT is a predicate function which succeeds if  its  first  argument
        !          2258:     is less than the second.
        !          2259: 
        !          2260: 
        !          2261:  5.51  NE -- Test for Not Equal
 5.51  NE -- Test for Not Equal
 ________ __ ____ ___ ___ _____
        !          2262: 
        !          2263:     NE(NUMERIC,NUMERIC)
        !          2264: 
        !          2265:     NE  is  a  predicate  function which succeeds if its two arguments
        !          2266:     are unequal.
        !          2267: 
        !          2268: 
        !          2269:  5.52  NOTANY -- Build Character Select Pattern
 5.52  NOTANY -- Build Character Select Pattern
 ____________ __ _____ _________ ______ _______
        !          2270: 
        !          2271:     NOTANY(STRING) or NOTANY(EXPRESSION)
        !          2272: 
        !          2273:     NOTANY returns a pattern which will match any single character  in
        !          2274:     the  subject  string,  provided  it  does  not occur in the string
        !          2275:     argument.  A null argument is not permitted.  If the  argument  is
        !          2276:     an  expression,  it  is evaluated during pattern matching and must
        !          2277:     yield a non-null string.
        !          2278: 
        !          2279: 
        !          2280: 
        !          2281: 
        !          2282: 
        !          2283: 
        !          2284: 
        !          2285: 
        !          2286: 
        !          2287: 
        !          2288: 
        !          2289: 
        !          2290: 
        !          2291: 
        !          2292: 
        !          2293: 
        !          2294: 
        !          2295:          MACRO SPITBOL V3.5
        !          2296:                                                    PAGE 35 - [5.53]
        !          2297:          Functions
        !          2298: 
        !          2299: 
        !          2300: 
        !          2301:  5.53  OPSYN * -- Equate Functions and Operators
 5.53  OPSYN * -- Equate Functions and Operators
 ___________ _ __ ______ _________ ___ _________
        !          2302: 
        !          2303:     OPSYN(NAME,NAME,INTEGER)
        !          2304: 
        !          2305:     In contrast with SNOBOL4, the second argument must  always  be  an
        !          2306:     already  defined  function name.  If the third argument is omitted
        !          2307:     or zero, the first argument must  be  a  function  name.   If  the
        !          2308:     third  argument  is 1 or 2 , the first argument must be resp.  one
        !          2309:     of the undefined unary or binary  operators  (sec  4.1).   In  all
        !          2310:     three  cases,  subsequent  use  of  the  first argument results in
        !          2311:     calling of the function corresponding to the second argument  with
        !          2312:     the  appropriate  arguments.   Note that names of system functions
        !          2313:     or operators cannot appear as the first argument.
        !          2314: 
        !          2315: 
        !          2316:  5.54  OUTPUT * -- Set Output Association
 5.54  OUTPUT * -- Set Output Association
 ____________ _ __ ___ ______ ___________
        !          2317: 
        !          2318:     OUTPUT(NAME,INTEGER,STRING) or OUTPUT(NAME,STRING,STRING)
        !          2319: 
        !          2320:     This function has  similar  arguments  and  behaves  similarly  to
        !          2321:     INPUT, which should be consulted for a detailed description (2).
        !          2322: 
        !          2323: 
        !          2324:  5.55  POS -- Define Positioning Pattern
 5.55  POS -- Define Positioning Pattern
 _________ __ ______ ___________ _______
        !          2325: 
        !          2326:     POS(INTEGER) or POS(EXPRESSION)
        !          2327: 
        !          2328:     POS  returns  a pattern which matches the null string provided the
        !          2329:     value  of  the  cursor  is  equal  to  the  non-negative   integer
        !          2330:     argument.   If  the  argument  is  an  expression, it is evaluated
        !          2331:     during pattern matching and must yield a non-negative integer.
        !          2332: 
        !          2333: 
        !          2334: 
        !          2335: 
        !          2336: 
        !          2337: 
        !          2338: 
        !          2339: 
        !          2340: 
        !          2341: 
        !          2342: 
        !          2343: 
        !          2344: 
        !          2345: 
        !          2346: 
        !          2347: 
        !          2348: 
        !          2349: 
        !          2350: 
        !          2351: 
        !          2352: 
        !          2353: 
        !          2354: 
        !          2355: 
        !          2356: 
        !          2357:          MACRO SPITBOL V3.5
        !          2358:                                                    PAGE 36 - [5.56]
        !          2359:          Functions
        !          2360: 
        !          2361: 
        !          2362: 
        !          2363:  5.56  PROTOTYPE -- Retrieve Prototype
 5.56  PROTOTYPE -- Retrieve Prototype
 _______________ __ ________ _________
        !          2364: 
        !          2365:     PROTOTYPE(ARRAY) or PROTOTYPE(TABLE)
        !          2366: 
        !          2367:     PROTOTYPE returns the first argument used in the ARRAY,  TABLE  or
        !          2368:     BUFFER function call which created the argument.
        !          2369: 
        !          2370: 
        !          2371:  5.57  REMDR -- Remainder
 5.57  REMDR -- Remainder
 ___________ __ _________
        !          2372: 
        !          2373:     REMDR(INTEGER,INTEGER)
        !          2374: 
        !          2375:     REMDR  returns the remainder of dividing the first argument by the
        !          2376:     second.  This has the same sign as the first argument.
        !          2377: 
        !          2378: 
        !          2379:  5.58  REPLACE -- Translate Characters
 5.58  REPLACE -- Translate Characters
 _____________ __ _________ __________
        !          2380: 
        !          2381:     REPLACE(STRING,STRING,STRING)
        !          2382: 
        !          2383:     REPLACE  returns  the  result  of  applying  the   transformations
        !          2384:     represented  by  the  second  and  third  arguments  to  the first
        !          2385:     argument.  REPLACE fails if the second  and  third  arguments  are
        !          2386:     unequal in length or null.
        !          2387: 
        !          2388: 
        !          2389:  5.59  REVERSE * -- Reverse String
 5.59  REVERSE * -- Reverse String
 _____________ _ __ _______ ______
        !          2390: 
        !          2391:     REVERSE(STRING)
        !          2392: 
        !          2393:     REVERSE returns the result of reversing its argument.  Thus
        !          2394:        REVERSE('ABC')            produces          'CBA'
        !          2395: 
        !          2396: 
        !          2397:  5.60  REWIND -- Reposition File
 5.60  REWIND -- Reposition File
 ____________ __ __________ ____
        !          2398: 
        !          2399:     REWIND(INTEGER) or REWIND(STRING)
        !          2400: 
        !          2401:     The  argument must have previously appeared as the second argument
        !          2402:     of a call of   INPUT or OUTPUT.  The file attached to the  channel
        !          2403:     is  repositioned  so  that the next read or write operation starts
        !          2404:     at the first record of the file.   Existing  associations  to  the
        !          2405:     file   are   unaffected.   REWIND  may  not  be  provided  in  all
        !          2406:     implementations - see Section 12.
        !          2407: 
        !          2408: 
        !          2409: 
        !          2410: 
        !          2411: 
        !          2412: 
        !          2413: 
        !          2414: 
        !          2415: 
        !          2416: 
        !          2417: 
        !          2418: 
        !          2419:          MACRO SPITBOL V3.5
        !          2420:                                                    PAGE 37 - [5.61]
        !          2421:          Functions
        !          2422: 
        !          2423: 
        !          2424: 
        !          2425:  5.61  RPAD * -- Right Pad
 5.61  RPAD * -- Right Pad
 __________ _ __ _____ ___
        !          2426: 
        !          2427:     RPAD(STRING,INTEGER,STRING)
        !          2428: 
        !          2429:     RPAD  returns  the  result  obtained  by  padding  out  the  first
        !          2430:     argument  on  the  right  to  the  length  specified by the second
        !          2431:     argument, using the pad character supplied by  the  one  character
        !          2432:     string  third argument.  If the third argument is null or omitted,
        !          2433:     a blank is used as the pad character.  If the  first  argument  is
        !          2434:     already  long  enough  or too long, it is returned unchanged, this
        !          2435:     always being the case if the second argument is negative or  zero.
        !          2436:     RPAD is useful for constructing columnar output.
        !          2437: 
        !          2438: 
        !          2439:  5.62  RPOS -- Define Positioning Pattern
 5.62  RPOS -- Define Positioning Pattern
 __________ __ ______ ___________ _______
        !          2440: 
        !          2441:     RPOS(INTEGER) or RPOS(EXPRESSION)
        !          2442: 
        !          2443:     RPOS  returns a pattern which matches the null string provided the
        !          2444:     indicated number  of  characters  remain  to  be  matched  in  the
        !          2445:     subject   string.   If  the  argument  is  an  expression,  it  is
        !          2446:     evaluated during pattern matching and must  yield  a  non-negative
        !          2447:     integer.
        !          2448: 
        !          2449: 
        !          2450:  5.63  RSORT -- Reverse Sort
 5.63  RSORT -- Reverse Sort
 ___________ __ _______ ____
        !          2451: 
        !          2452:     RSORT(ARRAY or TABLE,INTEGER or NAME)
        !          2453: 
        !          2454:     Performs  a sort in descending (reverse) order of key on the first
        !          2455:     argument.  Consult SORT for details.
        !          2456: 
        !          2457: 
        !          2458:  5.64  RTAB -- Create Tabbing Pattern
 5.64  RTAB -- Create Tabbing Pattern
 __________ __ ______ _______ _______
        !          2459: 
        !          2460:     RTAB(INTEGER) or RTAB(EXPRESSION)
        !          2461: 
        !          2462:     RTAB returns a pattern which matches from the current location  up
        !          2463:     to  the  point  where the indicated number of characters remain to
        !          2464:     be matched.  The argument must be a non-negative integer.  If  the
        !          2465:     argument   is  an  expression,  it  is  evaluated  during  pattern
        !          2466:     matching and must yield a non-negative integer.
        !          2467: 
        !          2468: 
        !          2469: 
        !          2470: 
        !          2471: 
        !          2472: 
        !          2473: 
        !          2474: 
        !          2475: 
        !          2476: 
        !          2477: 
        !          2478: 
        !          2479: 
        !          2480: 
        !          2481:          MACRO SPITBOL V3.5
        !          2482:                                                    PAGE 38 - [5.65]
        !          2483:          Functions
        !          2484: 
        !          2485: 
        !          2486: 
        !          2487:  5.65  SETEXIT * -- Set Error Exit
 5.65  SETEXIT * -- Set Error Exit
 _____________ _ __ ___ _____ ____
        !          2488: 
        !          2489:     SETEXIT(NAME) or SETEXIT()
        !          2490: 
        !          2491:     SETEXIT allows interception of  execution  errors,  including  any
        !          2492:     detected  during calls of CODE and EVAL .  The argument is a label
        !          2493:     to  which  control  is  passed  if  a  subsequent  error   occurs,
        !          2494:     providing  that  the  value  of the keyword &ERRLIMIT is non-zero.
        !          2495:     The value of &ERRLIMIT is decremented when the error trap  occurs.
        !          2496:     A  SETEXIT  call with a null argument causes cancellation of error
        !          2497:     intercepts.  A subsequent error will terminate execution as  usual
        !          2498:     with  an  error  message.   The  result returned by SETEXIT is the
        !          2499:     previous intercept setting (i.e.  a  label  name  or  null  if  no
        !          2500:     intercept  was  set).  This  can  be  used to save and restore the
        !          2501:     SETEXIT conditions recursively.  The  error  routine  may  inspect
        !          2502:     the  error code and text   in &ERRTYPE and &ERRTEXT , and take one
        !          2503:     of the actions -
        !          2504: 
        !          2505: 
        !          2506:      1.  Terminate execution by transferring  to  the  special  system
        !          2507:          label,   ABORT  .   This causes error processing to resume as
        !          2508:          though no error intercept had been set.
        !          2509: 
        !          2510:      2.  Branch to the special system label CONTINUE  .   This  causes
        !          2511:          execution  to  resume by branching to the failure exit of the
        !          2512:          statement in error.
        !          2513: 
        !          2514:      3.  Continue execution elsewhere by branching to another  section
        !          2515:          of  the  program.   If  the error occurred inside a function,
        !          2516:          execution is still 'down a level'.
        !          2517: 
        !          2518:      4.  Branch  to  label  RETURN  ,  FRETURN  ,   NRETURN   provided
        !          2519:          &FNCLEVEL  is  non-zero.   This  avoids possible difficulties
        !          2520:          with 3.
        !          2521: 
        !          2522:     The occurrence of  an  error  cancels  the  intercept.   An  error
        !          2523:     routine  must  reissue  a SETEXIT call if error interception is to
        !          2524:     continue.
        !          2525: 
        !          2526: 
        !          2527: 
        !          2528: 
        !          2529: 
        !          2530: 
        !          2531: 
        !          2532: 
        !          2533: 
        !          2534: 
        !          2535: 
        !          2536: 
        !          2537: 
        !          2538: 
        !          2539: 
        !          2540: 
        !          2541: 
        !          2542: 
        !          2543:          MACRO SPITBOL V3.5
        !          2544:                                                    PAGE 39 - [5.66]
        !          2545:          Functions
        !          2546: 
        !          2547: 
        !          2548: 
        !          2549:  5.66  SIZE -- Get String or Buffer Size
 5.66  SIZE -- Get String or Buffer Size
 __________ __ ___ ______ __ ______ ____
        !          2550: 
        !          2551:     SIZE(STRING or BUFFER)
        !          2552: 
        !          2553:     SIZE returns an  integer  count  of  the  defined  length  of  its
        !          2554:     argument.
        !          2555: 
        !          2556: 
        !          2557:  5.67  SORT * -- Sort
 5.67  SORT * -- Sort
 __________ _ __ ____
        !          2558: 
        !          2559:     SORT(ARRAY or TABLE,INTEGER or NAME)
        !          2560: 
        !          2561:     This  routine  sorts  the  contents  of  the ARRAY or  TABLE first
        !          2562:     argument in ascending order of key.  It differs from   RSORT  only
        !          2563:     in  that  the  latter  sorts  in  descending order of key.  If the
        !          2564:     first  argument  is  an  ARRAY  it  must  be  of   one   dimension
        !          2565:     (subsequently  referred  to  as  a  VECTOR ), or two dimensions (a
        !          2566:     MATRIX ).  Where the argument is a TABLE  ,  it  is  converted  by
        !          2567:     SORT  to an array of 2 dimensions, the first column containing the
        !          2568:     reference or key item and the second the  value,  in  exactly  the
        !          2569:     same  way as  results from a call to CONVERT . This is then sorted
        !          2570:     just as any other two dimensional array.  In all cases, the  items
        !          2571:     to  be  sorted  may  be  of mixed dataypes and the sorting is done
        !          2572:     primarily on datatype of key, using lexical ordering  of  datatype
        !          2573:     names,  and secondarily on value.  Thus items of similar datatypes
        !          2574:     become contiguously grouped in sorted order.  The  only  deviation
        !          2575:     from  this  rule  is that mixed  INTEGER and REAL (NUMERIC ) items
        !          2576:     are sorted as a single group and strings which  can  be  converted
        !          2577:     to  NUMERIC  are  compared  numerically  against NUMERIC keys.  In
        !          2578:     particular the NULL string is regarded as 0 or 0.0  in  comparison
        !          2579:     with  them.   Note  that  compared  numerically,  100  >  "20" but
        !          2580:     compared lexically "100" < "20".  A second argument, if  specified
        !          2581:     for  an  ARRAY  or  TABLE,  must  be an integer corresponding to a
        !          2582:     column index (1 or 2 for a TABLE). The keys are  then  taken  from
        !          2583:     this  column,  and  during the sort, complete rows are permuted to
        !          2584:     the order determined by key values.  If  the  second  argument  is
        !          2585:     omitted,  the  default  column  used  is that corresponding to the
        !          2586:     smallest  value  of  the   second   index   (e.g   -2   in   M   =
        !          2587:     ARRAY('10,-2:+2')).   The  sorting  method  used  is  stable  with
        !          2588:     respect to non-interchange of items having  equal  keys,  so  that
        !          2589:     repeated  sorting  on  successive  columns may be used to effect a
        !          2590:     total ordering.
        !          2591: 
        !          2592:     In the case of a VECTOR, the optional second argument may  be  the
        !          2593:     NAME   of a field of a programmer defined datatype created by DATA
        !          2594:     . In this case, if any of the values in the  VECTOR  are  of  this
        !          2595:     type,  the  contents  of the field corresponding to NAME  are used
        !          2596:     as the key.  If the second argument is  omitted,  the  sorting  is
        !          2597:     carried out by using the values the VECTOR contains as keys.
        !          2598: 
        !          2599: 
        !          2600: 
        !          2601: 
        !          2602: 
        !          2603: 
        !          2604: 
        !          2605:          MACRO SPITBOL V3.5
        !          2606:                                                    PAGE 40 - [5.67]
        !          2607:          Functions
        !          2608: 
        !          2609:     The  sort  method  used is Heapsort (see for instance Horowitz and
        !          2610:     Sahni, "Fundamentals of Data Structures",  Pitman  1977)  modified
        !          2611:     so  that  no  interchanging of equal keys occurs.  It is efficient
        !          2612:     in usage of both space and time, the time taken to  sort  N  items
        !          2613:     being  proportional  to  N * log(N).   The  aggregate  obtained is
        !          2614:     always a sorted copy of the original.  No extra store is used  for
        !          2615:     the  sort  except  in  the case of a TABLE, where space sufficient
        !          2616:     for conversion to an ARRAY is taken.  Examples of calls are
        !          2617:     *  Assume USERS is an ARRAY of programmer defined datatypes
        !          2618:     *  of the type created by       DATA('COMPUSER(NAME,TYME)')
        !          2619:           SUS = RSORT(SORT(USERS,.NAME),.TYME)
        !          2620:     which creates an array sorted  primarily  by  tyme  in  descending
        !          2621:     order  and secondarily by name in alphabetic order.
        !          2622:           MATX = SORT(SORT(SORT(MATX,3),2))
        !          2623:     which sorts MATX respectively by columns 3, 2, 1.
        !          2624:           V = SORT(V)
        !          2625:     which sorts V  by its elements.
        !          2626: 
        !          2627: 
        !          2628:  5.68  SPAN -- Create Spanning Pattern
 5.68  SPAN -- Create Spanning Pattern
 __________ __ ______ ________ _______
        !          2629: 
        !          2630:     SPAN(STRING) or SPAN(EXPRESSION)
        !          2631: 
        !          2632:     SPAN  creates  a  pattern  which, starting from the current cursor
        !          2633:     position, will match the longest non-null sequence  of  characters
        !          2634:     drawn  from  the  character  set  contained  in the argument.  The
        !          2635:     argument is not permitted to be  null.   If  the  argument  is  an
        !          2636:     expression,  it  is  evaluated  during  pattern  matching and must
        !          2637:     yield a non-null string.
        !          2638: 
        !          2639: 
        !          2640:  5.69  STOPTR * -- Stop Trace
 5.69  STOPTR * -- Stop Trace
 ____________ _ __ ____ _____
        !          2641: 
        !          2642:     STOPTR(NAME,STRING)
        !          2643: 
        !          2644:     STOPTR  terminates  tracing  for  the  name  given  by  the  first
        !          2645:     argument.   The  second  argument  designates the respect in which
        !          2646:     the trace is to be stopped and consists  of  one  of  the  strings
        !          2647:     listed under the description of TRACE.
        !          2648: 
        !          2649: 
        !          2650: 
        !          2651: 
        !          2652: 
        !          2653: 
        !          2654: 
        !          2655: 
        !          2656: 
        !          2657: 
        !          2658: 
        !          2659: 
        !          2660: 
        !          2661: 
        !          2662: 
        !          2663: 
        !          2664: 
        !          2665: 
        !          2666: 
        !          2667:          MACRO SPITBOL V3.5
        !          2668:                                                    PAGE 41 - [5.70]
        !          2669:          Functions
        !          2670: 
        !          2671: 
        !          2672: 
        !          2673:  5.70  SUBSTR * -- Extract Substring
 5.70  SUBSTR * -- Extract Substring
 ____________ _ __ _______ _________
        !          2674: 
        !          2675:     SUBSTR(STRING or BUFFER,INTEGER,INTEGER)
        !          2676: 
        !          2677:     Extracts   a  substring  from  the  first  argument.   The  second
        !          2678:     argument specifies the first character (1 = start of  string)  and
        !          2679:     the  third  argument  gives  the number of characters.  An omitted
        !          2680:     third argument specifies all remaining characters of  the  string.
        !          2681:     Improper substrings cause statement failure.
        !          2682: 
        !          2683:     Note  that  no  conversion  to  string  is needed in the case of a
        !          2684:     BUFFER argument, the substring  is  extracted  directly  from  the
        !          2685:     buffer making SUBSTR quite efficient when working with buffers.
        !          2686: 
        !          2687: 
        !          2688:  5.71  TAB -- Create Tabbing Pattern
 5.71  TAB -- Create Tabbing Pattern
 _________ __ ______ _______ _______
        !          2689: 
        !          2690:     TAB(INTEGER) or TAB(EXPRESSION)
        !          2691: 
        !          2692:     TAB  returns  a pattern which matches from the current location up
        !          2693:     to the point where the indicated number of  characters  have  been
        !          2694:     matched.   The  argument  must  be a non-negative integer.  If the
        !          2695:     argument  is  an  expression,  it  is  evaluated  during   pattern
        !          2696:     matching and must yield a non-negative integer.
        !          2697: 
        !          2698: 
        !          2699:  5.72  TABLE * -- Create Table
 5.72  TABLE * -- Create Table
 ___________ _ __ ______ _____
        !          2700: 
        !          2701:     TABLE(INTEGER,,ARG)
        !          2702: 
        !          2703:     The  TABLE  function  creates  an associative table as in SNOBOL4.
        !          2704:     However in SPITBOL, the table is implemented internally  using  an
        !          2705:     efficient   hashing algorithm.  The integer argument is the number
        !          2706:     of hash headers used.  If it is omitted, 11 is  used  by  default.
        !          2707:     If  N  is  the number of entries in the table, and H is the number
        !          2708:     of hash headers, the average number of probes  to  find  an  entry
        !          2709:     rises  from  about 1.0 for small N, to N/2H if N is large compared
        !          2710:     with H.  Since the overhead for hash headers is small compared  to
        !          2711:     the  size of a table element, a useful guide is to use as argument
        !          2712:     an estimate of the number of entries to be stored  in  the  table.
        !          2713:     Any  second  argument  (permitted  for  SNOBOL4  compatibility) is
        !          2714:     always ignored.  The optional third argument is a value  which  it
        !          2715:     is  desired  to  have  returned  instead of the default NULL, when
        !          2716:     table look-up is performed using a key which has not been  entered
        !          2717:     into  the  TABLE.   This  is similar in effect to the usage of the
        !          2718:     second argument of ARRAY.  In contrast  with  SNOBOL4,  where  the
        !          2719:     first  reference  to an entry automatically creates a table entry,
        !          2720:     in  SPITBOL  an  entry  is  inserted  in  a  table  only  when  an
        !          2721:     assignment   is   explicitly  made.   Thus  table  look-up  for  a
        !          2722:     currently missing key does not create an entry for  that  key  and
        !          2723:     may be freely used.
        !          2724: 
        !          2725: 
        !          2726: 
        !          2727: 
        !          2728: 
        !          2729:          MACRO SPITBOL V3.5
        !          2730:                                                    PAGE 42 - [5.73]
        !          2731:          Functions
        !          2732: 
        !          2733: 
        !          2734: 
        !          2735:  5.73  TIME -- Get Timer Value
 5.73  TIME -- Get Timer Value
 __________ __ ___ _____ _____
        !          2736: 
        !          2737:     TIME()
        !          2738: 
        !          2739:     TIME  returns the integer number of milliseconds of processor time
        !          2740:     since the start of execution.
        !          2741: 
        !          2742: 
        !          2743:  5.74  TRACE * -- Initiate Trace
 5.74  TRACE * -- Initiate Trace
 ___________ _ __ ________ _____
        !          2744: 
        !          2745: 
        !          2746:     The TRACE function, which is quite invaluable as a debugging  aid,
        !          2747:     initiates  a  trace  of  the item whose name is given by the first
        !          2748:     argument.  The second argument specifies the sense  of  the  trace
        !          2749:     as follows -
        !          2750: 
        !          2751: 
        !          2752:             'A' or 'ACCESS'               access
        !          2753:             'V' or 'VALUE' or null        value
        !          2754:             'K' or 'KEYWORD'              keyword
        !          2755:             'L' or 'LABEL'                label
        !          2756:             'F' or 'FUNCTION'             function call and return
        !          2757:             'C' or 'CALL'                 function call
        !          2758:             'R' or 'RETURN'               function return
        !          2759: 
        !          2760:     The  access trace mode introduced in SPITBOL consists of producing
        !          2761:     trace output each  time  an  access  traced  item  is  referenced.
        !          2762:     Attempts  to trace a function before a DEFINE statement for it has
        !          2763:     been executed will fail.  If &STLIMIT  is  negative,  STCOUNT  may
        !          2764:     not  be  traced.  To give a visual impression of depth of nesting,
        !          2765:     a letter "I" is included in the trace output for  each  additional
        !          2766:     level of function call.
        !          2767: 
        !          2768: 
        !          2769:  5.75  TRIM -- Trim Trailing Blanks
 5.75  TRIM -- Trim Trailing Blanks
 __________ __ ____ ________ ______
        !          2770: 
        !          2771:     TRIM(STRING)
        !          2772: 
        !          2773:     TRIM  returns  the  result  of  trimming  trailing blanks from the
        !          2774:     argument string.
        !          2775: 
        !          2776: 
        !          2777:  5.76  UNLOAD * -- Unload Function
 5.76  UNLOAD * -- Unload Function
 ____________ _ __ ______ ________
        !          2778: 
        !          2779:     UNLOAD(NAME)
        !          2780: 
        !          2781:     NAME is the name of an external function which is to be  unloaded.
        !          2782:     The  names  of  user defined functions may also appear in calls to
        !          2783:     UNLOAD in which case the function becomes undefined.
        !          2784: 
        !          2785: 
        !          2786: 
        !          2787: 
        !          2788: 
        !          2789: 
        !          2790: 
        !          2791:          MACRO SPITBOL V3.5
        !          2792:                                                    PAGE 43 - [6]
        !          2793:          Keywords
        !          2794: 
        !          2795: 
        !          2796: 
        !          2797:                             *---------------*
        !          2798:                               [6]  Keywords
                            | [6]  Keywords |
        !          2799:                             *---------------*
        !          2800: 
        !          2801:     The following is a list of the keywords  implemented  in  SPITBOL.
        !          2802:     The  notation  (R)  after  the name indicates that the keyword may
        !          2803:     only be read so that attempts to assign to it will  result  in  an
        !          2804:     error.   With  the  exception  of  &STLIMIT,  values  assigned  to
        !          2805:     numeric keywords  must be in the range 0 to MXLEN .
        !          2806: 
        !          2807: 
        !          2808:      1.  &ABEND : Normally set to zero.  If it is set  to  a  non-zero
        !          2809:          value  at  the  end of execution,  an ABEND dump may be given
        !          2810:          if supported by the implementation.
        !          2811: 
        !          2812:      2.  &ABORT (R) :  Contains the pattern ABORT .
        !          2813: 
        !          2814:      3.  &ALPHABET (R) : Contains the full character set of  the  host
        !          2815:          computer in natural collating sequence.
        !          2816: 
        !          2817:      4.  &ANCHOR  :  Set to one for anchored pattern matching mode and
        !          2818:          to zero for  unanchored  mode.   Initial  value  is  zero  to
        !          2819:          correspond  with  SNOBOL4.   However  unanchored  matching is
        !          2820:          needed only rarely and is liable  to  be  very  expensive  in
        !          2821:          runtime  unless  carefully  used,  so  in  general it is good
        !          2822:          practice to start programs with the statement
        !          2823:              &ANCHOR = 1
        !          2824: 
        !          2825:      5.  &ARB (R) :  Contains the pattern ARB .
        !          2826: 
        !          2827:      6.  &BAL (R) :  Contains the pattern BAL .
        !          2828: 
        !          2829:      7.  &CODE  :  Initially  zero.   In  implementations  where   the
        !          2830:          concept   makes  sense,  values  found  to  be  in  &CODE  at
        !          2831:          termination are used as ending codes (Section 12).
        !          2832: 
        !          2833:      8.  &DUMP : The standard value is zero.  If the value is zero  at
        !          2834:          the  end  of  execution,  then  no symbolic dump is given.  A
        !          2835:          value of one gives a dump including values  of  keywords  and
        !          2836:          natural  variables.   If  the value is two, the dump includes
        !          2837:          non-null array, table and program defined  datatype  elements
        !          2838:          as  well.  The dump format is self explanatory and deals with
        !          2839:          the case of branched  structures  including  circular  lists.
        !          2840:          If  the  value exceeds two, an  ABEND dump may be produced as
        !          2841:          well if the implementation supports this.
        !          2842: 
        !          2843: 
        !          2844: 
        !          2845: 
        !          2846: 
        !          2847: 
        !          2848: 
        !          2849: 
        !          2850: 
        !          2851: 
        !          2852: 
        !          2853:          MACRO SPITBOL V3.5
        !          2854:                                                    PAGE 44 - [6]
        !          2855:          Keywords
        !          2856: 
        !          2857: 
        !          2858:      9.  &ERRLIMIT :  The  maximum  number  of  errors  which  can  be
        !          2859:          trapped  using  the  SETEXIT function. &ERRLIMIT is initially
        !          2860:          zero and when set non-zero by assignment, it  is  decremented
        !          2861:          each  time  a  SETEXIT trap occurs.  SETEXIT has no effect on
        !          2862:          normal error processing if &ERRLIMIT is zero.
        !          2863: 
        !          2864:     10.  &ERRTEXT : If an  execution  error  occurs,  then  the  error
        !          2865:          message  text  corresponding to the error code is stored as a
        !          2866:          string in &ERRTEXT.  It is possible to  assign  a  string  to
        !          2867:          &ERRTEXT  which  is then used in a subsequent error report if
        !          2868:          &ERRTYPE is assigned  a  value  out  of  the  range  used  by
        !          2869:          SPITBOL  itself.  Such an assignment does not signal an error
        !          2870:          as is the case with &ERRTYPE.
        !          2871: 
        !          2872:     11.  &ERRTYPE : If an execution error occurs, then the error  code
        !          2873:          is  stored  as  an  integer  in  &ERRTYPE.  &ERRTYPE  may  be
        !          2874:          assigned  a  value  in  which  case  an  immediate  error  is
        !          2875:          signalled.   This may be useful in reporting program detected
        !          2876:          errors.  Error codes used by  SPITBOL  all  fall  below  300.
        !          2877:          Values  in  &ERRTEXT and &ERRTYPE are useful in SETEXIT error
        !          2878:          intercept routines.
        !          2879: 
        !          2880:     12.  &FAIL (R) :  Contains the pattern FAIL .
        !          2881: 
        !          2882:     13.  &FENCE (R) :  Contains the pattern FENCE .
        !          2883: 
        !          2884:     14.  &FNCLEVEL (R) : Contains the current function nesting  level.
        !          2885: 
        !          2886:     15.  &FTRACE  :  The  standard  value  is  zero.   If  it  is  set
        !          2887:          positive, each function  call  and  return  is  traced.   The
        !          2888:          value  of &FTRACE is decremented  for each trace line printed
        !          2889:          until the value reaches zero again.
        !          2890: 
        !          2891:     16.  &INPUT : Set to one for normal  input  (standard  value).  If
        !          2892:          set to zero, all input associations are ignored.
        !          2893: 
        !          2894:     17.  &LASTNO  (R)  :  Contains  the  number  of the last statement
        !          2895:          executed.
        !          2896: 
        !          2897:     18.  &MAXLNGTH : Contains the  maximum  permitted  string  length.
        !          2898:          At  the  start  of execution its value is that given by MXLEN
        !          2899:          (Section 12). It may be set to  smaller values but not  to  a
        !          2900:          value exceeding MXLEN .
        !          2901: 
        !          2902:     19.  &OUTPUT  :  Set to one for normal output (standard value). If
        !          2903:          set to zero, all output associations are ignored.
        !          2904: 
        !          2905:     20.  &PROFILE :  When  set  to  zero  (the   default),   statement
        !          2906:          profiling  is disabled.  When set to one, statement profiling
        !          2907:          is enabled.  When statement  profiling  is  enabled,  SPITBOL
        !          2908:          keeps  track  of   the  count of each statement executed, and
        !          2909:          the  amount  of  central  processor  time   accumulated   for
        !          2910:          executing  each  statement.   If  profiling is enabled at any
        !          2911:          time during an execution, the accumulated profile is  printed
        !          2912:          on  the  standard output channel when the program terminates.
        !          2913: 
        !          2914: 
        !          2915:          MACRO SPITBOL V3.5
        !          2916:                                                    PAGE 45 - [6]
        !          2917:          Keywords
        !          2918: 
        !          2919:          The profile also indicates the  average  time  for  executing
        !          2920:          each statement.
        !          2921: 
        !          2922:          If  &PROFILE  is  set  to  two,  it  acts  as in the case for
        !          2923:          &PROFILE=1, except that function calls  are  charged  to  the
        !          2924:          statements which contain them.
        !          2925: 
        !          2926:          &PROFILE  is  not  available  in all implementations, and for
        !          2927:          some machines where processor  time  is  not  available,  the
        !          2928:          time  indicated may be wall time.  In all cases, the enabling
        !          2929:          of the profile adds additional time to the execution, so  the
        !          2930:          times indicated should be viewed as relative.
        !          2931: 
        !          2932:     21.  &REM (R) :  Contains the pattern REM .
        !          2933: 
        !          2934:     22.  &RTNTYPE  (R)  :  Contains  'RETURN',  'FRETURN' or 'NRETURN'
        !          2935:          depending on  the  type  of  function  return  most  recently
        !          2936:          executed.
        !          2937: 
        !          2938:     23.  &STCOUNT  :  Contains  a  count  of  the number of statements
        !          2939:          executed unless &STLIMIT is negative.
        !          2940: 
        !          2941:     24.  &STLIMIT : The maximum number of statements permitted  to  be
        !          2942:          executed.    Initially   50000  and  with  an  implementation
        !          2943:          dependent maximum (Section 12)  beyond  which  it  cannot  be
        !          2944:          set.    To  inhibit  this  check  on  numbers  of  statements
        !          2945:          executed, assign a negative value to the keyword.  Thus
        !          2946:                  &STLIMIT = -1
        !          2947:          is equivalent to &STLIMIT = "infinity". This will  result  in
        !          2948:          a  marginal  execution  speed  up  since  count  updating and
        !          2949:          checking is omitted.  The value of  &STCOUNT  remains  frozen
        !          2950:          at  the  value reached when &STLIMIT was set negative and the
        !          2951:          number of statements executed is omitted from  the  execution
        !          2952:          statistics.   Tracing  of  STCOUNT becomes no longer possible
        !          2953:          since its value is not incremented.
        !          2954: 
        !          2955:     25.  &STNO (R) : The number of the current statement.
        !          2956: 
        !          2957:     26.  &SUCCEED (R) :  Contains the pattern SUCCEED .
        !          2958: 
        !          2959:     27.  &TRACE : Initial value of zero suppresses trace  output.   If
        !          2960:          assigned  a positive value, trace output is generated and for
        !          2961:          each line printed &TRACE is  decremented  by  one  until  the
        !          2962:          value reaches zero again.
        !          2963: 
        !          2964:     28.  &TRIM  :  Set  to zero for normal input mode (default value).
        !          2965:          If  the  value  is  set  non-zero,  all  input  records   are
        !          2966:          automatically  trimmed  (trailing  blanks  are removed).  For
        !          2967:          operating systems  having  file  formats  in  which  variable
        !          2968:          length   records  may  have  trailing  blanks  suppressed,  a
        !          2969:          setting of zero does not imply that  padding  to  a  standard
        !          2970:          size  occurs,  merely  that  any  trailing  blanks  which are
        !          2971:          actually present will be preserved.  For  most  applications,
        !          2972:          initialising the value to 1 is to be recommended.
        !          2973: 
        !          2974: 
        !          2975: 
        !          2976: 
        !          2977:          MACRO SPITBOL V3.5
        !          2978:                                                    PAGE 46 - [7]
        !          2979:          Program Listing and Control Cards
        !          2980: 
        !          2981: 
        !          2982: 
        !          2983:                 *----------------------------------------*
        !          2984:                   [7]  Program Listing and Control Cards
                | [7]  Program Listing and Control Cards |
        !          2985:                 *----------------------------------------*
        !          2986: 
        !          2987:     Normally  a  listing  of  the  source program is produced in which
        !          2988:     statements are prefixed with a  statement  number.   This  listing
        !          2989:     usually  starts  with  a  heading identifying the SPITBOL version,
        !          2990:     and giving date  and  time  of  run.   Where  this  is  considered
        !          2991:     inappropriate  it  may  be  suppressed  (Section  12). Many of the
        !          2992:     control cards to be  described  permit  choice  of  other  listing
        !          2993:     options.   Control  cards are identified by a minus sign in column
        !          2994:     one.  They may occur anywhere in a source program and take  effect
        !          2995:     when  they  are encountered.  Most of them are special features of
        !          2996:     SPITBOL and are not available in  SNOBOL4.   The  full  names  are
        !          2997:     given  for  each  of  them, but they may be abbreviated since only
        !          2998:     the first four characters are significant to the compiler.
        !          2999: 
        !          3000: 
        !          3001:  7.1  Listing Control Cards
 7.1  Listing Control Cards
 ____________ _______ _____
        !          3002: 
        !          3003:     Listing control cards are used to  alter  the  appearance  of  the
        !          3004:     listing.   They  have no other effect on compilation or execution.
        !          3005:     Listing control cards always occur individually.
        !          3006: 
        !          3007: 
        !          3008: 
        !          3009: 
        !          3010:  7.1.1  -EJECT
 7.1.1  -EJECT
        !          3011: 
        !          3012:     The -EJECT control card  causes  the  compilation  listing  to  be
        !          3013:     skipped  to  the  top  of  the  next  page.  The current title and
        !          3014:     subtitle (if any) are printed at the top of the page.
        !          3015: 
        !          3016: 
        !          3017: 
        !          3018: 
        !          3019:  7.1.2  -SPACE
 7.1.2  -SPACE
        !          3020: 
        !          3021:     The -SPACE control  card  causes  spaces  to  be  skipped  on  the
        !          3022:     current  page.  If -SPACE occurs with no operand, then one line is
        !          3023:     skipped.  Alternatively, an  unsigned  integer  can  be  given  in
        !          3024:     columns  8-72  which represents the number of lines to be skipped.
        !          3025:     If there is insufficient space on the current  page,  -SPACE  acts
        !          3026:     like  -EJECT  and  the  listing  is  spaced to the top of the next
        !          3027:     page.
        !          3028: 
        !          3029: 
        !          3030: 
        !          3031: 
        !          3032: 
        !          3033: 
        !          3034: 
        !          3035: 
        !          3036: 
        !          3037: 
        !          3038: 
        !          3039:          MACRO SPITBOL V3.5
        !          3040:                                                    PAGE 47 - [7.1.3]
        !          3041:          Program Listing and Control Cards
        !          3042: 
        !          3043:  7.1.3  -TITLE
 7.1.3  -TITLE
        !          3044: 
        !          3045:     This card supplies a title for the source  program  listing.   The
        !          3046:     text  of  the title is taken from columns 8-72 of the -TITLE card.
        !          3047:     The subtitle is cleared to blanks, and an eject to the  next  page
        !          3048:     occurs next time a line is listed.
        !          3049: 
        !          3050: 
        !          3051:  7.1.4  -STITL
 7.1.4  -STITL
        !          3052: 
        !          3053:     The  -STITL  card  is  used  to  supply  a subtitle for the source
        !          3054:     program listing.  The text of the subtitle is taken  from  columns
        !          3055:     8-72  of  the -STITL card.  An eject occurs to the top of the next
        !          3056:     page next time a line is listed and the  current  title  (if  any)
        !          3057:     and  the  newly  supplied subtitle are printed.  If both title and
        !          3058:     subtitle are to be changed, then the -TITLE  card  should  precede
        !          3059:     the -STITL card.
        !          3060: 
        !          3061: 
        !          3062: 
        !          3063: 
        !          3064: 
        !          3065: 
        !          3066: 
        !          3067: 
        !          3068: 
        !          3069: 
        !          3070: 
        !          3071: 
        !          3072: 
        !          3073: 
        !          3074: 
        !          3075: 
        !          3076: 
        !          3077: 
        !          3078: 
        !          3079: 
        !          3080: 
        !          3081: 
        !          3082: 
        !          3083: 
        !          3084: 
        !          3085: 
        !          3086: 
        !          3087: 
        !          3088: 
        !          3089: 
        !          3090: 
        !          3091: 
        !          3092: 
        !          3093: 
        !          3094: 
        !          3095: 
        !          3096: 
        !          3097: 
        !          3098: 
        !          3099: 
        !          3100: 
        !          3101:          MACRO SPITBOL V3.5
        !          3102:                                                    PAGE 48 - [7.2]
        !          3103:          Program Listing and Control Cards
        !          3104: 
        !          3105: 
        !          3106: 
        !          3107:  7.2  Option Control Cards
 7.2  Option Control Cards
 ___________ _______ _____
        !          3108: 
        !          3109:     The  option  control  cards  allow  selection  of various compiler
        !          3110:     options.  In each case, there are two modes and a pair of  control
        !          3111:     cards  which  permit  repeated flipping back and forth of the mode
        !          3112:     within a program.  Several control options  may  be  specified  on
        !          3113:     the  same  control  card  by  separating  the  names  with commas,
        !          3114:     leaving no intervening blanks.  For example
        !          3115:     -FAIL,LIST,PRINT
        !          3116:     In the list below, the default option is named first.
        !          3117: 
        !          3118: 
        !          3119: 
        !          3120: 
        !          3121:  7.2.1  -LIST -NOLIST
 7.2.1  -LIST -NOLIST
        !          3122: 
        !          3123:     The -NOLIST option causes  suppression  of  the  normal  statement
        !          3124:     listing.   This  may  be  useful  for  established program, or for
        !          3125:     terminal  output.   If  compilation  errors  are   detected,   the
        !          3126:     offending  statements are printed regardless of the setting of the
        !          3127:     list mode.  Some implementations provide  a  run  time  option  to
        !          3128:     select  NOLIST  mode  initially without the need to insert -NOLIST
        !          3129:     into the program being run (Section 12).
        !          3130: 
        !          3131: 
        !          3132: 
        !          3133: 
        !          3134:  7.2.2  -NOPRINT -PRINT
 7.2.2  -NOPRINT -PRINT
        !          3135: 
        !          3136:     Normally control cards are not printed.  The -PRINT option  causes
        !          3137:     them  to  be listed, provided the -LIST option is in effect.  This
        !          3138:     option may be useful if serialization is used for updating.
        !          3139: 
        !          3140: 
        !          3141: 
        !          3142: 
        !          3143:  7.2.3  -SINGLE -DOUBLE
 7.2.3  -SINGLE -DOUBLE
        !          3144: 
        !          3145:     The compilation listing is normally singly  spaced.   The  -DOUBLE
        !          3146:     option  causes  double  spacing  to  be  used,  with  a blank line
        !          3147:     folowing each listed line.
        !          3148: 
        !          3149: 
        !          3150: 
        !          3151: 
        !          3152: 
        !          3153: 
        !          3154: 
        !          3155: 
        !          3156: 
        !          3157: 
        !          3158: 
        !          3159: 
        !          3160: 
        !          3161: 
        !          3162: 
        !          3163:          MACRO SPITBOL V3.5
        !          3164:                                                    PAGE 49 - [7.2.4]
        !          3165:          Program Listing and Control Cards
        !          3166: 
        !          3167: 
        !          3168: 
        !          3169:  7.2.4  -INXXX
 7.2.4  -INXXX
        !          3170: 
        !          3171:     XXX in the above stands for an integer indicating  the  number  of
        !          3172:     characters  to  be  read  from  each  record of the SPITBOL source
        !          3173:     file.  The normal default is for  the  compiler  to  read  SPITBOL
        !          3174:     statements  from  columns  1-72  of  the  input  image.  Longer or
        !          3175:     shorter input  records  may  be  read  by  specifying  alternative
        !          3176:     values  for  XXX.  If any value other than 72 is in use at the end
        !          3177:     of translation, it is used as the maximum record length  for  data
        !          3178:     read  from  the  standard  input  file.  For historical reasons, a
        !          3179:     -IN72 card in effect at the end of compilation is taken  to  imply
        !          3180:     a  maximum  record length of 80 for execution time data.  There is
        !          3181:     however no need to restrict records to lengths of 72 or 80.
        !          3182: 
        !          3183: 
        !          3184: 
        !          3185: 
        !          3186:  7.2.5  -ERRORS -NOERRORS
 7.2.5  -ERRORS -NOERRORS
        !          3187: 
        !          3188:     Normally execution is allowed even when compilation errors  occur.
        !          3189:     If  it  is  wished  to inhibit execution if compilation errors are
        !          3190:     detected then the -NOERRORS option should be selected.
        !          3191: 
        !          3192: 
        !          3193: 
        !          3194: 
        !          3195:  7.2.6  -FAIL -NOFAIL
 7.2.6  -FAIL -NOFAIL
        !          3196: 
        !          3197:     In SNOBOL4 and in SPITBOL with the -FAIL mode set, a failure in  a
        !          3198:     statement  with  no  conditional  goto  is ignored and the program
        !          3199:     execution resumes with  the  next  statement  in  sequence.   This
        !          3200:     convention  often leads to errors going undetected, particuarly in
        !          3201:     the case of array references with  out  of  bound  subscripts  and
        !          3202:     pattern  matches  which  the user anticipates will always succeed.
        !          3203:     The -NOFAIL  option  changes  this  convention.   If  a  statement
        !          3204:     lacking  a  conditional goto is compiled under the -NOFAIL option,
        !          3205:     then if a failure occurs when  the  statement  is  executed,  this
        !          3206:     produces  an execution error with a suitable message.  This option
        !          3207:     is especially useful for student jobs and other  situations  where
        !          3208:     many small programs are being debugged.
        !          3209: 
        !          3210: 
        !          3211: 
        !          3212: 
        !          3213:  7.2.7  -EXECUTE -NOEXECUTE
 7.2.7  -EXECUTE -NOEXECUTE
        !          3214: 
        !          3215:     Normally   execution  is  initiated  following  compilation.   The
        !          3216:     -NOEXECUTE  option,  if  in  force  at  the  end  of  compilation,
        !          3217:     inhibits  execution.   A  run  time option may be provided for the
        !          3218:     same purpose (Section 12).
        !          3219: 
        !          3220: 
        !          3221: 
        !          3222: 
        !          3223: 
        !          3224: 
        !          3225:          MACRO SPITBOL V3.5
        !          3226:                                                    PAGE 50 - [8]
        !          3227:          Errors
        !          3228: 
        !          3229: 
        !          3230: 
        !          3231:                              *-------------*
        !          3232:                                [8]  Errors
                             | [8]  Errors |
        !          3233:                              *-------------*
        !          3234: 
        !          3235: 
        !          3236:  8.1  Compilation Error Messages
 8.1  Compilation Error Messages
 ________________ _____ ________
        !          3237: 
        !          3238:     When the compiler detects an error, the offending line is  printed
        !          3239:     with  a  marker  under  the  point at which the error was actually
        !          3240:     detected  and  an  error  code  and  self-explanatory  message  is
        !          3241:     printed.    Processing   of  the  statement  is  discontinued  and
        !          3242:     compilation continues with the next  statement.   Execution  of  a
        !          3243:     program  containing  errors is not suppressed unless the -NOERRORS
        !          3244:     option has  been  set.   If  an  attempt  is  made  to  execute  a
        !          3245:     statement  found  erroneous  by  the  compiler, an execution error
        !          3246:     occurs.
        !          3247: 
        !          3248: 
        !          3249:  8.2  Execution Error Messages
 8.2  Execution Error Messages
 ______________ _____ ________
        !          3250: 
        !          3251:     Extensive error checking is performed at run time.  When an  error
        !          3252:     is  detected,  execution is terminated with an error message which
        !          3253:     refers to the number of  the  erroneous  statement.   However,  as
        !          3254:     described  in  Section  5,  it  is  possible  to  avoid  automatic
        !          3255:     execution  termination  and  to   obtain   user   error   handling
        !          3256:     facilities by means of the SETEXIT function.
        !          3257: 
        !          3258:     In  addition  to  the  errors  listed here, the implementation may
        !          3259:     have additional system errors.  See Section 12.
        !          3260: 
        !          3261: 
        !          3262:  8.3  Error Codes and Messages
 8.3  Error Codes and Messages
 __________ _____ ___ ________
        !          3263: 
        !          3264:     The following list details all error messages with  the  exception
        !          3265:     of any which may be particular to certain implementations.
        !          3266: 
        !          3267:     Code                       Message
    ____                       _______
        !          3268: 
        !          3269:       1   Addition left operand is not numeric
        !          3270:       2   Addition right operand is not numeric
        !          3271:       3   Addition caused integer overflow
        !          3272:       4   Affirmation operand is not numeric
        !          3273:       5   Alternation right operand is not pattern
        !          3274:       6   Alternation left operand is not pattern
        !          3275:       7   Compilation error encountered during execution
        !          3276:       8   Concatenation left opnd is not string or pattern
        !          3277:       9   Concatenation right opd is not string or pattern
        !          3278:      10   Complementation operand is not numeric
        !          3279:      11   Complementation caused integer overflow
        !          3280:      12   Division left operand is not numeric
        !          3281:      13   Division right operand is not numeric
        !          3282:      14   Division caused integer overflow
        !          3283:      15   Exponentiation right operand is not numeric
        !          3284:      16   Exponentiation left operand is not numeric
        !          3285: 
        !          3286: 
        !          3287:          MACRO SPITBOL V3.5
        !          3288:                                                    PAGE 51 - [8.3]
        !          3289:          Errors
        !          3290: 
        !          3291:      17   Exponentiation caused integer overflow
        !          3292:      18   Exponentiation result is undefined
        !          3293:      19   Exponentiation right operand is negative
        !          3294:      20   Goto evaluation failure
        !          3295:      21   Function called by name returned a value
        !          3296:      22   Undefined function called
        !          3297:      23   Goto operand is not a natural variable
        !          3298:      24   Goto operand in direct goto is not code
        !          3299:      25   Immediate assignment left operand is not pattern
        !          3300:      26   Multiplication left operand is not numeric
        !          3301:      27   Multiplication right operand is not numeric
        !          3302:      28   Multiplication caused integer overflow
        !          3303:      29   Undefined operator referenced
        !          3304:      30   Pattern assignment left operand is not pattern
        !          3305:      31   Pattern replacement right operand is not string
        !          3306:      32   Subtraction left operand is not numeric
        !          3307:      33   Subtraction right operand is not numeric
        !          3308:      34   Subtraction caused integer overflow
        !          3309:      35   Unexpected failure in -NOFAIL mode
        !          3310:      36   Goto ABORT with no preceding error
        !          3311:      37   Goto CONTINUE with no preceding error
        !          3312:      38   Goto undefined label
        !          3313:      39   External function argument is not string
        !          3314:      40   External function argument is not integer
        !          3315:      41   FIELD function argument is wrong datatype
        !          3316:      42   Attempt to change value of protected variable
        !          3317:      43   ANY evaluated argument is not string
        !          3318:      44   BREAK evaluated argument is not string
        !          3319:      45   BREAKX evaluated argument is not string
        !          3320:      46   Expression does not evaluate to pattern
        !          3321:      47   LEN evaluated argument is not integer
        !          3322:      48   LEN evaluated argument is negative or too large
        !          3323:      49   NOTANY evaluated argument is not string
        !          3324:      50   POS evaluated argument is not integer
        !          3325:      51   POS evaluated argument is negative or too large
        !          3326:      52   RPOS evaluated argument is not integer
        !          3327:      53   RPOS evaluated argument is negative or too large
        !          3328:      54   RTAB evaluated argument is not integer
        !          3329:      55   RTAB evaluated argument is negative or too large
        !          3330:      56   SPAN evaluated argument is not string
        !          3331:      57   TAB evaluated argument is not integer
        !          3332:      58   TAB evaluated argument is negative or too large
        !          3333:      59   ANY argument is not string or expression
        !          3334:      60   APPLY first arg is not natural variable name
        !          3335:      61   ARBNO argument is not pattern
        !          3336:      62   ARG second argument is not integer
        !          3337:      63   ARG first argument is not program function name
        !          3338:      64   ARRAY first argument is not integer or string
        !          3339:      65   ARRAY first argument lower bound is not integer
        !          3340:      66   ARRAY first argument upper bound is not integer
        !          3341:      67   ARRAY dimension is zero,negative or out of range
        !          3342:      68   ARRAY size exceeds maximum permitted
        !          3343:      69   BREAK argument is not string or expression
        !          3344:      70   BREAKX argument is not string or expression
        !          3345:      71   CLEAR argument is not string
        !          3346:      72   CLEAR argument has null variable name
        !          3347: 
        !          3348: 
        !          3349:          MACRO SPITBOL V3.5
        !          3350:                                                    PAGE 52 - [8.3]
        !          3351:          Errors
        !          3352: 
        !          3353:      73   COLLECT argument is not integer
        !          3354:      74   CONVERT second argument is not string
        !          3355:      75   DATA argument is not string
        !          3356:      76   DATA argument is null
        !          3357:      77   DATA argument is missing a left paren
        !          3358:      78   DATA argument has null datatype name
        !          3359:      79   DATA argument is missing a right paren
        !          3360:      80   DATA argument has null field name
        !          3361:      81   DEFINE first argument is not string
        !          3362:      82   DEFINE first argument is null
        !          3363:      83   DEFINE first argument is missing a left paren
        !          3364:      84   DEFINE first argument has null function name
        !          3365:      85   Null arg name or missing ) in DEFINE first arg.
        !          3366:      86   DEFINE function entry point is not defined label
        !          3367:      87   DETACH argument is not appropriate name
        !          3368:      88   DUMP argument is not integer
        !          3369:      89   DUMP argument is negative or too large
        !          3370:      90   DUPL second argument is not integer
        !          3371:      91   DUPL first argument is not string or pattern
        !          3372:      92   EJECT argument is not a suitable name
        !          3373:      93   EJECT file does not exist
        !          3374:      94   EJECT file does not permit page eject
        !          3375:      95   EJECT caused non-recoverable output error
        !          3376:      96   ENDFILE argument is not a suitable name
        !          3377:      97   ENDFILE argument is null
        !          3378:      98   ENDFILE file does not exist
        !          3379:      99   ENDFILE file does not permit endfile
        !          3380:     100   ENDFILE caused non-recoverable output error
        !          3381:     101   EQ first argument is not numeric
        !          3382:     102   EQ second argument is not numeric
        !          3383:     103   EVAL argument is not expression
        !          3384:     104   EXIT argument is not suitable integer or string
        !          3385:     105   EXIT action not available in this implementation
        !          3386:     106   EXIT action caused irrecoverable error
        !          3387:     107   FIELD second argument is not integer
        !          3388:     108   FIELD first argument is not datatype name
        !          3389:     109   GE first argument is not numeric
        !          3390:     110   GE second argument is not numeric
        !          3391:     111   GT first argument is not numeric
        !          3392:     112   GT second argument is not numeric
        !          3393:     113   INPUT third argument is not a string
        !          3394:     114   Inappropriate second argument for INPUT
        !          3395:     115   Inappropriate first argument for INPUT
        !          3396:     116   Inappropriate file specification for INPUT
        !          3397:     117   INPUT file cannot be read
        !          3398:     118   LE first argument is not numeric
        !          3399:     119   LE second argument is not numeric
        !          3400:     120   LEN argument is not integer or expression
        !          3401:     121   LEN argument is negative or too large
        !          3402:     122   LEQ first argument is not string
        !          3403:     123   LEQ second argument is not string
        !          3404:     124   LGE first argument is not string
        !          3405:     125   LGE second argument is not string
        !          3406:     126   LGT first argument is not string
        !          3407:     127   LGT second argument is not string
        !          3408:     128   LLE first argument is not string
        !          3409: 
        !          3410: 
        !          3411:          MACRO SPITBOL V3.5
        !          3412:                                                    PAGE 53 - [8.3]
        !          3413:          Errors
        !          3414: 
        !          3415:     129   LLE second argument is not string
        !          3416:     130   LLT first argument is not string
        !          3417:     131   LLT second argument is not string
        !          3418:     132   LNE first argument is not string
        !          3419:     133   LNE second argument is not string
        !          3420:     134   LOCAL second argument is not integer
        !          3421:     135   LOCAL first arg is not a program function name
        !          3422:     136   LOAD second argument is not string
        !          3423:     137   LOAD first argument is not string
        !          3424:     138   LOAD first argument is null
        !          3425:     139   LOAD first argument is missing a left paren
        !          3426:     140   LOAD first argument has null function name
        !          3427:     141   LOAD first argument is missing a right paren
        !          3428:     142   LOAD function does not exist
        !          3429:     143   LOAD function caused input error during load
        !          3430:     144   LPAD third argument not a string
        !          3431:     145   LPAD second argument is not integer
        !          3432:     146   LPAD first argument is not string
        !          3433:     147   LT first argument is not numeric
        !          3434:     148   LT second argument is not numeric
        !          3435:     149   NE first argument is not numeric
        !          3436:     150   NE second argument is not numeric
        !          3437:     151   NOTANY argument is not string or expression
        !          3438:     152   OPSYN third argument is not integer
        !          3439:     153   OPSYN third argument is negative or too large
        !          3440:     154   OPSYN second arg is not natural variable name
        !          3441:     155   OPSYN first arg is not natural variable name
        !          3442:     156   OPSYN first arg is not correct operator name
        !          3443:     157   OUTPUT third argument is not a string
        !          3444:     158   Inappropriate second argument for OUTPUT
        !          3445:     159   Inappropriate first argument for OUTPUT
        !          3446:     160   Inappropriate file specification for OUTPUT
        !          3447:     161   OUTPUT file cannot be written to
        !          3448:     162   POS argument is not integer or expression
        !          3449:     163   POS argument is negative or too large
        !          3450:     164   PROTOTYPE argument is not table or array
        !          3451:     165   REMDR second argument is not integer
        !          3452:     166   REMDR first argument is not integer
        !          3453:     167   REMDR caused integer overflow
        !          3454:     168   REPLACE third argument is not string
        !          3455:     169   REPLACE second argument is not string
        !          3456:     170   REPLACE first argument is not string
        !          3457:     171   Null or unequally long 2nd, 3rd args to REPLACE
        !          3458:     172   REWIND argument is not a suitable name
        !          3459:     173   REWIND argument is null
        !          3460:     174   REWIND file does not exist
        !          3461:     175   REWIND file does not permit rewind
        !          3462:     176   REWIND caused non-recoverable error
        !          3463:     177   REVERSE argument is not string
        !          3464:     178   RPAD third argument is not string
        !          3465:     179   RPAD second argument is not integer
        !          3466:     180   RPAD first argument is not string
        !          3467:     181   RTAB argument is not integer or expression
        !          3468:     182   RTAB argument is negative or too large
        !          3469:     183   TAB argument is not integer or expression
        !          3470:     184   TAB argument is negative or too large
        !          3471: 
        !          3472: 
        !          3473:          MACRO SPITBOL V3.5
        !          3474:                                                    PAGE 54 - [8.3]
        !          3475:          Errors
        !          3476: 
        !          3477:     185   RPOS argument is not integer or expression
        !          3478:     186   RPOS argument is negative or too large
        !          3479:     187   SETEXIT argument is not label name or null
        !          3480:     188   SPAN argument is not string or expression
        !          3481:     189   SIZE argument is not string
        !          3482:     190   STOPTR first argument is not appropriate name
        !          3483:     191   STOPTR second argument is not trace type
        !          3484:     192   SUBSTR third argument is not integer
        !          3485:     193   SUBSTR second argument is not integer
        !          3486:     194   SUBSTR first argument is not string
        !          3487:     195   TABLE argument is not integer
        !          3488:     196   TABLE argument is out of range
        !          3489:     197   TRACE fourth arg is not function name or null
        !          3490:     198   TRACE first argument is not appropriate name
        !          3491:     199   TRACE second argument is not trace type
        !          3492:     200   TRIM argument is not string
        !          3493:     201   UNLOAD argument is not natural variable name
        !          3494:     202   Input from file caused non-recoverable error
        !          3495:     203   Input file record has incorrect format
        !          3496:     204   Memory overflow
        !          3497:     205   String length exceeds value of MAXLNGTH keyword
        !          3498:     206   Output caused file overflow
        !          3499:     207   Output caused non-recoverable error
        !          3500:     208   Keyword value assigned is not integer
        !          3501:     209   Keyword in assignment is protected
        !          3502:     210   Keyword value assigned is negative or too large
        !          3503:     211   Value assigned to keyword ERRTEXT not a string
        !          3504:     212   Syntax error.  Value used where name is required
        !          3505:     213   Syntax error.  Statement is too complicated.
        !          3506:     214   Syntax error.  Bad label or misplaced continuation line
        !          3507:     215   Syntax error.  Undefined or erroneous entry label
        !          3508:     216   Syntax error.  Missing END line
        !          3509:     217   Syntax error.  Duplicate label
        !          3510:     218   Syntax error.  Duplicated goto field
        !          3511:     219   Syntax error.  Empty goto field
        !          3512:     220   Syntax error.  Missing operator
        !          3513:     221   Syntax error.  Missing operand
        !          3514:     222   Syntax error.  Invalid use of left bracket
        !          3515:     223   Syntax error.  Invalid use of comma
        !          3516:     224   Syntax error.  Unbalanced right parenthesis
        !          3517:     225   Syntax error.  Unbalanced right bracket
        !          3518:     226   Syntax error.  Missing right paren
        !          3519:     227   Syntax error.  Right paren missing from goto
        !          3520:     228   Syntax error.  Right bracket missing from goto
        !          3521:     229   Syntax error.  Missing right array bracket
        !          3522:     230   Syntax error.  Illegal character
        !          3523:     231   Syntax error.  Invalid numeric item
        !          3524:     232   Syntax error.  Unmatched string quote
        !          3525:     233   Syntax error.  Invalid use of operator
        !          3526:     234   Syntax error.  Goto field incorrect
        !          3527:     235   Subscripted operand is not table or array
        !          3528:     236   Array referenced with wrong number of subscripts
        !          3529:     237   Table referenced with more than one subscript
        !          3530:     238   Array subscript is not integer
        !          3531:     239   Indirection operand is not name
        !          3532:     240   Pattern match right operand is not pattern
        !          3533: 
        !          3534: 
        !          3535:          MACRO SPITBOL V3.5
        !          3536:                                                    PAGE 55 - [8.3]
        !          3537:          Errors
        !          3538: 
        !          3539:     241   Pattern match left operand is not string
        !          3540:     242   Function return from level zero
        !          3541:     243   Function result in NRETURN is not name
        !          3542:     244   Statement count exceeds value of STLIMIT keyword
        !          3543:     245   Translation/execution time expired
        !          3544:     246   Stack overflow
        !          3545:     247   Invalid control card
        !          3546:     248   Attempted redefinition of system function
        !          3547:     249   Expression evaluated by name returned value
        !          3548:     250   Insufficient memory to complete dump
        !          3549:     251   Keyword operand is not name of defined keyword
        !          3550:     252   Error on printing to interactive channel
        !          3551:     253   Print limit exceeded on standard output channel
        !          3552:     254   Erroneous argument to HOST
        !          3553:     255   Error during execution of HOST
        !          3554:     256   SORT/RSORT 1st arg not suitable ARRAY or TABLE
        !          3555:     257   Erroneous 2nd arg in SORT/RSORT of vector
        !          3556:     258   SORT/RSORT 2nd arg out of range or non-integer
        !          3557:     259   FENCE function argument is not pattern
        !          3558:     261   Addition caused real overflow
        !          3559:     262   Division caused real overflow
        !          3560:     263   Multiplication caused real overflow
        !          3561:     264   Subtraction caused real overflow
        !          3562:     265   External function argument is not real
        !          3563:     266   Exponentiation caused real overflow
        !          3564:     267   Exponentiation right operand is real not integer
        !          3565:     268   Inconsistent value assigned to profile keyword
        !          3566:     269   BUFFER first argument is not integer
        !          3567:     270   BUFFER second argument is not string or buffer
        !          3568:     271   BUFFER initial value too big for allocation
        !          3569:     272   BUFFER first argument is not positive
        !          3570:     273   Buffer size is too big
        !          3571:     274   Requested buffer allocation exceeds MXLEN
        !          3572:     275   APPEND first argument is not buffer
        !          3573:     276   APPEND second argument is not string
        !          3574:     277   INSERT third argument not integer
        !          3575:     278   INSERT second argument not integer
        !          3576:     279   INSERT first argument not buffer
        !          3577:     280   INSERT fourth argument not a string
        !          3578:     281   CHAR argument not integer
        !          3579:     282   CHAR argument not in range
        !          3580: 
        !          3581: 
        !          3582: 
        !          3583: 
        !          3584: 
        !          3585: 
        !          3586: 
        !          3587: 
        !          3588: 
        !          3589: 
        !          3590: 
        !          3591: 
        !          3592: 
        !          3593: 
        !          3594: 
        !          3595: 
        !          3596: 
        !          3597:          MACRO SPITBOL V3.5
        !          3598:                                                    PAGE 56 - [9]
        !          3599:          Programming Notes
        !          3600: 
        !          3601: 
        !          3602: 
        !          3603:                         *------------------------*
        !          3604:                           [9]  Programming Notes
                        | [9]  Programming Notes |
        !          3605:                         *------------------------*
        !          3606: 
        !          3607:     The  internal organization of SPITBOL is quite different from that
        !          3608:     of  SNOBOL4.   Consequently  the   relative   speed   of   various
        !          3609:     operations  differs.   This  section attempts to give some idea of
        !          3610:     how to obtain high efficiency in SPITBOL programs.
        !          3611: 
        !          3612: 
        !          3613:  9.1  Space Considerations
 9.1  Space Considerations
 __________ ______________
        !          3614: 
        !          3615:     The ANY, NOTANY, BREAK, BREAKX, SPAN functions use  translate  and
        !          3616:     test  tables  for  arguments  longer  than one character.  A table
        !          3617:     allocated for this purpose will be M words long by  N  bits  wide,
        !          3618:     where  M  is  64, 128 or 256 (machine dependent) and N is the word
        !          3619:     length in bits of the host computer.  For  each  function  call  a
        !          3620:     bit  column  is  used so that a single table suffices for N calls.
        !          3621:     With a constant  argument,  the  table  entry  is  precomputed  at
        !          3622:     compile  time  thus avoiding erosion of space by repeated calls in
        !          3623:     a run time loop.   Single  character  arguments  incur  no   space
        !          3624:     overhead .
        !          3625: 
        !          3626:     Integers  and reals have an overhead of one word above that needed
        !          3627:     by the usual hardware representation.
        !          3628: 
        !          3629:     Multidimensional arrays have a  space  overhead  of  8 + 2D  words
        !          3630:     where  D is the number of dimensions.  One dimensional arrays with
        !          3631:     a low bound of 1 (vectors ) are  treated  specially  and  have  an
        !          3632:     overhead of only three words.
        !          3633: 
        !          3634:     The  space  needed  for  non-null elements of tables is 4 words in
        !          3635:     addition to space  for  the  element  itself.   Each  table   hash
        !          3636:     header  is  one  word.   Thus  the  number  of headers can be made
        !          3637:     reasonably large without using  much  additional  space.   Program
        !          3638:     defined  datatypes  require  3 + F words, where F is the number of
        !          3639:     fields.  They are thus quite  compact  and  can  be  used  freely.
        !          3640:     Each  variable  block requires 8 words plus space for the variable
        !          3641:     name, the characters of  which  are  packed  several  to  a  word,
        !          3642:     usually  using  6,  7 or 8 bits for each character.  This space is
        !          3643:     constant irrespective of whether the name has a single  use     or
        !          3644:     is  used  multiply as a label, function, variable etc.  This space
        !          3645:     is never reclaimed once  it  has  been   allocated.   It  is  thus
        !          3646:     inefficient  to   use  variables  to build tables with the unary $
        !          3647:     operator.  Instead use the TABLE datatype.  The interpretive  code
        !          3648:     produced  by  the  compiler is held in code blocks  and is subject
        !          3649:     to garbage collection when no longer  accessible.   Advantage  can
        !          3650:     be  taken  of  this by writing label-free initialising code at the
        !          3651:     head of a program.  Even if labels are present it is  possible  to
        !          3652:     make  initialising  code   collectable  by the artifice of calling
        !          3653:     CODE with a string argument in which the labels are redeclared.
        !          3654: 
        !          3655: 
        !          3656: 
        !          3657: 
        !          3658: 
        !          3659:          MACRO SPITBOL V3.5
        !          3660:                                                    PAGE 57 - [9.1]
        !          3661:          Programming Notes
        !          3662: 
        !          3663: 
        !          3664:     Considerable amounts of store  are  used  in  repeatedly  building
        !          3665:     patterns.    They  should  either  be  pre-assigned  to  variables
        !          3666:     outside program loops  or  alternatively  if  written  in-line  in
        !          3667:     loops,  should  be  constant  so  that  they may be precomputed at
        !          3668:     compile time in order to avoid this overhead.
        !          3669: 
        !          3670:     Setting &TRIM non-zero  ensures  that  memory  is  not  wasted  in
        !          3671:     storing trailing blanks in strings.
        !          3672: 
        !          3673:     The   COLLECT  function  can  be  used  to  obtain  very  detailed
        !          3674:     information of memory utilization for various structures.
        !          3675: 
        !          3676:     Modifications to a string type require that the string  be  copied
        !          3677:     internally  first.   This  means  that space must be available for
        !          3678:     two copies of the string to  co-exist  in  memory  simultaneously.
        !          3679:     If  the  string  is  large  this  can lead to unanticipated memory
        !          3680:     usage.  For example, consider the input loop:
        !          3681:         LOOP CORPUS = CORPUS INPUT  :S(LOOP)
        !          3682:     As this reads more and more lines, CORPUS grows larger, and  large
        !          3683:     amounts  of  memory  (and  processor  time)  are spent copying the
        !          3684:     'old' value of CORPUS before INPUT is appended to it.  The  buffer
        !          3685:     type  is  helpful in avoiding this situation,  since modifications
        !          3686:     to buffers  (via  APPEND,  INSERT  and  pattern  replacement)  are
        !          3687:     performed directly on the existing buffer contents.
        !          3688: 
        !          3689: 
        !          3690:  9.2  Speed Considerations
 9.2  Speed Considerations
 __________ ______________
        !          3691: 
        !          3692:     To  a  greater  extent  than  is the case with SNOBOL4, there is a
        !          3693:     loss of efficiency in  encoding  complex  structures  as  strings.
        !          3694:     Use  arrays,  tables,  buffers and program defined datatypes where
        !          3695:     possible since all of these are highly efficient in SPITBOL.   The
        !          3696:     fast  associative  lookup  (hashing) feature of the TABLE makes it
        !          3697:     a particularly recommended feature  to  be  exploited  in  a  wide
        !          3698:     range of applications.
        !          3699: 
        !          3700:     Programmers  frequently  do  not  appreciate that execution speeds
        !          3701:     may be reduced  by  an  order  of  magnitude  if  poorly  designed
        !          3702:     patterns  fruitlessly  scan  data  in   unanchored mode.  With the
        !          3703:     pattern  matching  primitives  of  SPITBOL,  it   is   rare   that
        !          3704:     unanchored  matching  is  necessary and since anchored matching is
        !          3705:     much less expensive it is worth  acquiring the habit of  initially
        !          3706:     setting  &ANCHOR  non-zero.   If unanchored matching is needed for
        !          3707:     some purpose, take care that it is not unduly wasteful  with  data
        !          3708:     for which match failure is common.
        !          3709: 
        !          3710:     The  binary  $ pattern assignment is rather faster than the binary
        !          3711:     . pattern assignment and may be used freely.  SPITBOL  precomputes
        !          3712:     constant  expressions  before execution.  No efficiency is lost by
        !          3713:     writing pre-evaluable patterns  in-line  rather  than  predefining
        !          3714:     them.    Use of the unary * to defer computation is useful in some
        !          3715:     cases.  For example, consider the in-line matches -
        !          3716:         X ANY('PQR') BAL PAT 'X' RPOS(0)
        !          3717:         X ANY('PQR') BAL *PAT 'X' RPOS(0)
        !          3718:     The  second  form  is  more  efficient,  since  the  compiler  can
        !          3719: 
        !          3720: 
        !          3721:          MACRO SPITBOL V3.5
        !          3722:                                                    PAGE 58 - [9.2]
        !          3723:          Programming Notes
        !          3724: 
        !          3725:     precompute  the  entire  pattern  where  PAT  occurs as a deferred
        !          3726:     expression.
        !          3727: 
        !          3728:     The ANY, NOTANY, BREAK, BREAKX, SPAN,  RSORT, SORT  functions  are
        !          3729:     fast and highly recommended.
        !          3730: 
        !          3731:     ARB  and  ARBNO  are  slow  and can very often be avoided by using
        !          3732:     other  constructions.   Time  for  datatype  conversions  may   be
        !          3733:     significant.    Where  efficiency  is  important,  avoid  repeated
        !          3734:     unnecessary conversions.
        !          3735: 
        !          3736:     The SETEXIT error intercepts are fast and may be used for  program
        !          3737:     control as well as for debugging.
        !          3738: 
        !          3739:     Tracing  or  I/O  associating  a variable substantially slows down
        !          3740:     references to it but there is no residual access  penalty  if  the
        !          3741:     trace or I/O associations  are removed by STOPTR or DETACH.
        !          3742: 
        !          3743:     The  unary  $  (indirect) operator applied to a string argument in
        !          3744:     SPITBOL corresponds to a hash search of existing  variables.   The
        !          3745:     process  of  applying $ to a NAME (including the name of a natural
        !          3746:     variable),  is  much  faster,  which  is  why   unary  dot   (name
        !          3747:     operator)  returns  a NAME instead of a string.  It is thus better
        !          3748:     to use names rather than strings in applications such  as  passing
        !          3749:     variable names or labels indirectly as in
        !          3750:         F(.X)            rather than
        !          3751:         F("X") .
        !          3752: 
        !          3753:     Use  of the REPLACE function is optimised when, on repeated calls,
        !          3754:     the second and third arguments are found to  be  unchanged,  since
        !          3755:     in this case the previously constructed replace table is re-used.
        !          3756: 
        !          3757:     The  buffer  type  is  recommended for containing and manipulating
        !          3758:     large strings.   Pattern  replacement  can  be  specified  with  a
        !          3759:     buffer  name as the subject; the replacement is done on the buffer
        !          3760:     contents corresponding  to  the  substring  matched  as  with  the
        !          3761:     INSERT function.
        !          3762: 
        !          3763: 
        !          3764:  9.3  Other Notes
 9.3  Other Notes
 __________ _____
        !          3765: 
        !          3766:     The pattern match
        !          3767:        &ALPHABET LEN(N) LEN(1) $ CHAR
        !          3768:     is  useful  to  put  into  "CHAR"  the  Nth  character of the host
        !          3769:     machine character set.
        !          3770: 
        !          3771: 
        !          3772:     The interrogation operator, unary ? , is useful to  annihilate  an
        !          3773:     expression  which  is  evaluated  for its side effects rather than
        !          3774:     for its value.  For example
        !          3775:        S BREAK(*DELIM) $ K *?(TABLE<K> = TABLE<K> + 1)
        !          3776: 
        !          3777: 
        !          3778: 
        !          3779: 
        !          3780: 
        !          3781: 
        !          3782: 
        !          3783:          MACRO SPITBOL V3.5
        !          3784:                                                    PAGE 59 - [10]
        !          3785:          Specimen Programs
        !          3786: 
        !          3787: 
        !          3788: 
        !          3789:                         *------------------------*
        !          3790:                           [10] Specimen Programs
                        | [10] Specimen Programs |
        !          3791:                         *------------------------*
        !          3792: 
        !          3793:     Specimen programs of several  different  types  are  listed.   The
        !          3794:     first  one  is  especially  simple and uses no special facilities.
        !          3795:     The second and third are a little more ambitious and make  use  of
        !          3796:     program  defined  datatypes  and  tables  respectively.  Program 4
        !          3797:     serves no function apart from showing some of the  techniques  for
        !          3798:     producing  trace  output  and  providing  user handling of errors.
        !          3799:     The  job  control  commands  needed  to  run  these  programs  are
        !          3800:     implementation dependent and hence are listed in Section 12.
        !          3801: 
        !          3802: 
        !          3803: 
        !          3804: 
        !          3805: 
        !          3806: 
        !          3807: 
        !          3808:  10.1  Program 1
 10.1  Program 1
 _____________ _
        !          3809: 
        !          3810:     This  program reads data appended to its end and scans each record
        !          3811:     to count the number of vowels  it  contains.   A  listing  of  all
        !          3812:     records  constituting  the  program  and data is shown and this is
        !          3813:     followed by a copy of  the  output  produced  on  compilation  and
        !          3814:     execution.   The  -NOLIST  card  indicates  that no listing of the
        !          3815:     program is required.   Note  the  use  of  the  SPITBOL  selection
        !          3816:     feature  in  the  statement labelled NOMORE and the plus used as a
        !          3817:     statement continuation symbol in column 1 of the next  card.   The
        !          3818:     data  for  the  run   follows  the  END label of the program.  The
        !          3819:     output includes  the version number of the SPITBOL compiler  which
        !          3820:     will  be  updated  as  new  versions are introduced.  Compile time
        !          3821:     statistics, output  from  the  program  execution  and  statistics
        !          3822:     relating to the run are listed.
        !          3823: 
        !          3824: 
        !          3825: 
        !          3826: 
        !          3827: 
        !          3828: 
        !          3829: 
        !          3830: 
        !          3831: 
        !          3832: 
        !          3833: 
        !          3834: 
        !          3835: 
        !          3836: 
        !          3837: 
        !          3838: 
        !          3839: 
        !          3840: 
        !          3841: 
        !          3842: 
        !          3843: 
        !          3844: 
        !          3845:          MACRO SPITBOL V3.5
        !          3846:                                                    PAGE 60 - [10.1]
        !          3847:          Specimen Programs
        !          3848: 
        !          3849:   -NOLIST
        !          3850:   -TITLE  P R O G R A M   1
        !          3851:   *
        !          3852:   *    PROGRAM TO COUNT THE VOWELS IN LINES OF TEXT
        !          3853:   *
        !          3854:             &ANCHOR  = &TRIM = 1
        !          3855:             VOWELS   = BREAK('AEIOU') LEN(1)
        !          3856:   *
        !          3857:   *    LOOP TO READ NEXT LINE OF INPUT
        !          3858:   *
        !          3859:   INP       INP      = COPY = INPUT                     :F(END)
        !          3860:             N        = 0
        !          3861:   *
        !          3862:   *    LOOP TO SEARCH FOR VOWELS
        !          3863:   *
        !          3864:   FINDVWLS  INP VOWELS =                                :F(NOMORE)
        !          3865:             N        = N + 1                            :(FINDVWLS)
        !          3866:   *
        !          3867:   *    ALL VOWELS HAVE BEEN FOUND
        !          3868:   *
        !          3869:   NOMORE    OUTPUT   = RPAD(N,2) (EQ(N,1) ' VOWEL ' , ' VOWELS')
        !          3870:   +           ' FOUND IN "' COPY '"'                    :(INP)
        !          3871:   END
        !          3872:   QWERTY
        !          3873:   1900 AND DECSYSTEM-10 SPITBOL
        !          3874:   THE SLITHY TOVES DID GYRE AND GIMBLE IN THE WABE
        !          3875:   12 * 2 = 24
        !          3876: 
        !          3877: 
        !          3878: 
        !          3879: 
        !          3880:   STORE USED     1360
        !          3881:   STORE LEFT     4477
        !          3882:   COMP ERRORS    0
        !          3883:   REGENERATIONS  0
        !          3884:   COMP TIME-MSEC 160
        !          3885: 
        !          3886: 
        !          3887:   1  VOWEL  FOUND IN "QWERTY"
        !          3888:   5  VOWELS FOUND IN "1900 AND DECSYSTEM-10 SPITBOL"
        !          3889:   13 VOWELS FOUND IN "THE SLITHY TOVES DID GYRE AND GIMBLE IN THE WABE"
        !          3890:   0  VOWELS FOUND IN "12 * 2 = 24"
        !          3891: 
        !          3892: 
        !          3893:   NORMAL END
        !          3894:   IN STATEMENT   8
        !          3895:   STMTS EXECUTED 58
        !          3896:   RUN TIME-MSEC  100
        !          3897:   MCSEC / STMT   1724
        !          3898:   REGENERATIONS  0
        !          3899: 
        !          3900: 
        !          3901: 
        !          3902: 
        !          3903: 
        !          3904: 
        !          3905: 
        !          3906: 
        !          3907:          MACRO SPITBOL V3.5
        !          3908:                                                    PAGE 61 - [10.2]
        !          3909:          Specimen Programs
        !          3910: 
        !          3911: 
        !          3912: 
        !          3913:  10.2  Program 2
 10.2  Program 2
 _____________ _
        !          3914: 
        !          3915:     This  is  a  somewhat  more  complex  program for sorting a set of
        !          3916:     records.  There is no -NOLIST card present and  so  a  listing  of
        !          3917:     the  program  is  produced  by the compiler with statement numbers
        !          3918:     placed on the left.  The output includes the sorted list and  then
        !          3919:     following  the  execution  statistics is a dump resulting from the
        !          3920:     assignment to keyword &DUMP in statement 2.  This illustrates  the
        !          3921:     excellent  diagnostic  assistance  available  should a program not
        !          3922:     behave as  expected.   The  structure  of  the  trees  is  readily
        !          3923:     discernible   in   the  dump  of  the  NODEs  of  which  they  are
        !          3924:     constituted.   (Note  that  this  program  could  also  have  been
        !          3925:     written using the SORT feature.)
        !          3926: 
        !          3927: 
        !          3928:   P R O G R A M   2                                               PAGE 1
        !          3929: 
        !          3930:           *    PROGRAM TO SORT A SET OF RECORDS ON A KEY USING A TREE SORTING
        !          3931:           *    TECHNIQUE.
        !          3932:           *
        !          3933:           *    DATATYPE WITH THE NECESSARY 4 FIELDS
        !          3934:           *
        !          3935:   1                 DATA('NODE(KEY,DAT,PRED,SUCC)')
        !          3936:   2                 &DUMP    = 2; &ANCHOR = &TRIM = 1
        !          3937:           *
        !          3938:           *    ROUTINE TO ADD "DATA" TO A TREE SORTED BY "KEY".
        !          3939:           *    "ROOT" IS PASSED BY REFERENCE (IT IS A SPITBOL NAME)
        !          3940:           *    AND POINTS TO THE TREE TO BE USED.
        !          3941:           *
        !          3942:   4                 DEFINE('ADNODE(KEY,DATA,ROOT)PTR')          :(ADNEND)
        !          3943:           *
        !          3944:           *    CREATE TREE INITIALLY IF NOT YET IN EXISTENCE
        !          3945:           *
        !          3946:   5       ADNODE    $ROOT    = IDENT($ROOT) NODE(KEY,DATA)      :S(RETURN)
        !          3947:   6                 PTR      = $ROOT
        !          3948:           *
        !          3949:           *    SEARCH TO FIND INSERTION POINT IN TREE
        !          3950:           *
        !          3951:   7       SEARCH    LLE(KEY,KEY(PTR))                           :S(BEFORE)
        !          3952:           *
        !          3953:           *    HERE IF NODE FOLLOWS THAT IN TREE
        !          3954:           *
        !          3955:   8       AFTER     PTR      = DIFFER(SUCC(PTR)) SUCC(PTR)      :S(SEARCH)
        !          3956:   9                 SUCC(PTR) = NODE(KEY,DATA)                  :S(RETURN)
        !          3957:           *
        !          3958:           *    HERE IF KEY PRECEDES THAT IN TREE
        !          3959:           *
        !          3960:   10      BEFORE    PTR      = DIFFER(PRED(PTR)) PRED(PTR)      :S(SEARCH)
        !          3961:   11                PRED(PTR) = NODE(KEY,DATA)                  :(RETURN)
        !          3962:   12      ADNEND
        !          3963: 
        !          3964: 
        !          3965: 
        !          3966: 
        !          3967: 
        !          3968: 
        !          3969:          MACRO SPITBOL V3.5
        !          3970:                                                    PAGE 62 - [10.2]
        !          3971:          Specimen Programs
        !          3972: 
        !          3973:           *
        !          3974:           *    ROUTINE TO PRINT A SORTED BINARY TREE
        !          3975:           *
        !          3976:   13                DEFINE('PRINTREE(TREE)')                    :(ENDPRT)
        !          3977:   14      PRINTREE  DIFFER(PRED(TREE)) PRINTREE(PRED(TREE))
        !          3978:   15                OUTPUT   = KEY(TREE) '  ' DAT(TREE)
        !          3979:   16                DIFFER(SUCC(TREE)) PRINTREE(SUCC(TREE))     :(RETURN)
        !          3980:   17      ENDPRT
        !          3981:           *
        !          3982:           *    RECORDS OF WHICH
        !          3983:           *    '1609   GALILEO :   TELESCOPE'
        !          3984:           *    IS TYPICAL ARE TO BE SORTED BY DATE AND BY INVENTOR.
        !          3985:           *    SPLIT OUT THE RECORDS AND ADD TO TWO SORTED TREES.
        !          3986:           *
        !          3987:   18      SORT      INP      = INPUT                            :F(PRINT)
        !          3988:   19                INP LEN(4) $ DATE SPAN(' ') (BREAK(':') ':') $ INVR
        !          3989:           .               SPAN(' ') REM $ INVN
        !          3990:   20                ADNODE(DATE,RPAD(INVR,16) INVN,.DATREE)
        !          3991:   21                ADNODE(RPAD(INVR,16),DATE '  ' INVN,.INVRTREE) :(SORT)
        !          3992:           *
        !          3993:           *    JOB DONE APART FROM PRINTING THE SORTED TREES
        !          3994:           *
        !          3995:   22      PRINT     OUTPUT   = 'INVENTIONS SORTED BY DATE'; OUTPUT =
        !          3996:   24                PRINTREE(DATREE) ; OUTPUT =
        !          3997:   26                OUTPUT   = 'INVENTIONS SORTED BY INVENTOR'; OUTPUT =
        !          3998:   28                PRINTREE(INVRTREE)
        !          3999:   29      END
        !          4000: 
        !          4001: 
        !          4002:   INVENTIONS SORTED BY DATE
        !          4003: 
        !          4004:   1609  GALILEO :         TELESCOPE
        !          4005:   1835  TALBOT W F :      PHOTOGRAPHY
        !          4006:   1876  BELL A G :        TELEPHONE
        !          4007:   1896  DIESEL R :        DIESEL ENGINE
        !          4008:   1896  MARCONI G :       RADIO
        !          4009:   1903  WRIGHT O & W :    POWERED FLIGHT
        !          4010: 
        !          4011:   INVENTIONS SORTED BY INVENTOR
        !          4012: 
        !          4013:   BELL A G :        1876  TELEPHONE
        !          4014:   DIESEL R :        1896  DIESEL ENGINE
        !          4015:   GALILEO :         1609  TELESCOPE
        !          4016:   MARCONI G :       1896  RADIO
        !          4017:   TALBOT W F :      1835  PHOTOGRAPHY
        !          4018:   WRIGHT O & W :    1903  POWERED FLIGHT
        !          4019: 
        !          4020: 
        !          4021:   NORMAL END
        !          4022:   IN STATEMENT   29
        !          4023:   STMTS EXECUTED 146
        !          4024:   RUN TIME-MSEC  160
        !          4025:   MCSEC / STMT   1095
        !          4026:   REGENERATIONS  0
        !          4027: 
        !          4028: 
        !          4029: 
        !          4030: 
        !          4031:          MACRO SPITBOL V3.5
        !          4032:                                                    PAGE 63 - [10.2]
        !          4033:          Specimen Programs
        !          4034: 
        !          4035:     DUMP OF NATURAL VARIABLES
        !          4036: 
        !          4037:   DATE = '1896'
        !          4038:   DATREE = NODE `1
        !          4039:   INP = '1896    DIESEL R :          DIESEL ENGINE'
        !          4040:   INPUT = '1896    DIESEL R :          DIESEL ENGINE'
        !          4041:   INVN = 'DIESEL ENGINE'
        !          4042:   INVR = 'DIESEL R :'
        !          4043:   INVRTREE = NODE `2
        !          4044:   OUTPUT = 'WRIGHT O & W :    1903  POWERED FLIGHT'
        !          4045:   REM = PATTERN
        !          4046: 
        !          4047: 
        !          4048:   DUMP OF KEYWORD VALUES
        !          4049: 
        !          4050:   &ANCHOR = 1
        !          4051:   &CODE = 0
        !          4052:   &DUMP = 2
        !          4053:   &ERRLIMIT = 0
        !          4054:   &ERRTEXT = ''
        !          4055:   &ERRTYPE = 0
        !          4056:   &FNCLEVEL = 0
        !          4057:   &FTRACE = 0
        !          4058:   &INPUT = 1
        !          4059:   &LASTNO = 28
        !          4060:   &MAXLNGTH = 3104
        !          4061:   &OUTPUT = 1
        !          4062:   &RTNTYPE = 'RETURN'
        !          4063:   &STCOUNT = 146
        !          4064:   &STLIMIT = 50000
        !          4065:   &STNO = 29
        !          4066:   &TRACE = 0
        !          4067:   &TRIM = 1
        !          4068: 
        !          4069: 
        !          4070:   NODE `1
        !          4071:   KEY(DATREE) = '1876'
        !          4072:   DAT(DATREE) = 'BELL A G :      TELEPHONE'
        !          4073:   PRED(DATREE) = NODE `5
        !          4074:   SUCC(DATREE) = NODE `3
        !          4075: 
        !          4076:   NODE `2
        !          4077:   KEY(INVRTREE) = 'BELL A G :      '
        !          4078:   DAT(INVRTREE) = '1876  TELEPHONE'
        !          4079:   SUCC(INVRTREE) = NODE `4
        !          4080: 
        !          4081:   NODE `3
        !          4082:   KEY(NODE `3) = '1896'
        !          4083:   DAT(NODE `3) = 'MARCONI G :     RADIO'
        !          4084:   PRED(NODE `3) = NODE `11
        !          4085:   SUCC(NODE `3) = NODE `7
        !          4086: 
        !          4087: 
        !          4088: 
        !          4089: 
        !          4090: 
        !          4091: 
        !          4092: 
        !          4093:          MACRO SPITBOL V3.5
        !          4094:                                                    PAGE 64 - [10.2]
        !          4095:          Specimen Programs
        !          4096: 
        !          4097:   NODE `4
        !          4098:   KEY(NODE `4) = 'MARCONI G :     '
        !          4099:   DAT(NODE `4) = '1896  RADIO'
        !          4100:   PRED(NODE `4) = NODE `6
        !          4101:   SUCC(NODE `4) = NODE `8
        !          4102: 
        !          4103:   NODE `5
        !          4104:   KEY(NODE `5) = '1609'
        !          4105:   DAT(NODE `5) = 'GALILEO :       TELESCOPE'
        !          4106:   SUCC(NODE `5) = NODE `9
        !          4107: 
        !          4108:   NODE `6
        !          4109:   KEY(NODE `6) = 'GALILEO :       '
        !          4110:   DAT(NODE `6) = '1609  TELESCOPE'
        !          4111:   PRED(NODE `6) = NODE `12
        !          4112: 
        !          4113:   NODE `7
        !          4114:   KEY(NODE `7) = '1903'
        !          4115:   DAT(NODE `7) = 'WRIGHT O & W :  POWERED FLIGHT'
        !          4116: 
        !          4117:   NODE `8
        !          4118:   KEY(NODE `8) = 'WRIGHT O & W :  '
        !          4119:   DAT(NODE `8) = '1903  POWERED FLIGHT'
        !          4120:   PRED(NODE `8) = NODE `10
        !          4121: 
        !          4122:   NODE `9
        !          4123:   KEY(NODE `9) = '1835'
        !          4124:   DAT(NODE `9) = 'TALBOT W F :    PHOTOGRAPHY'
        !          4125: 
        !          4126:   NODE `10
        !          4127:   KEY(NODE `10) = 'TALBOT W F :    '
        !          4128:   DAT(NODE `10) = '1835  PHOTOGRAPHY'
        !          4129: 
        !          4130:   NODE `11
        !          4131:   KEY(NODE `11) = '1896'
        !          4132:   DAT(NODE `11) = 'DIESEL R :      DIESEL ENGINE'
        !          4133: 
        !          4134:   NODE `12
        !          4135:   KEY(NODE `12) = 'DIESEL R :      '
        !          4136:   DAT(NODE `12) = '1896  DIESEL ENGINE'
        !          4137: 
        !          4138: 
        !          4139: 
        !          4140: 
        !          4141: 
        !          4142: 
        !          4143: 
        !          4144: 
        !          4145: 
        !          4146: 
        !          4147: 
        !          4148: 
        !          4149: 
        !          4150: 
        !          4151: 
        !          4152: 
        !          4153: 
        !          4154: 
        !          4155:          MACRO SPITBOL V3.5
        !          4156:                                                    PAGE 65 - [10.3]
        !          4157:          Specimen Programs
        !          4158: 
        !          4159: 
        !          4160: 
        !          4161:  10.3  Program 3
 10.3  Program 3
 _____________ _
        !          4162: 
        !          4163:     This  program reads a set of keywords and then processes a file in
        !          4164:     order to count the number of occurrences of the  keywords  in  the
        !          4165:     text  held  in the file.  Notice the simple method of making input
        !          4166:     and output associations to the various input and output  files  in
        !          4167:     statements  2,  3  and  4.   A  table  created  in  statement 7 is
        !          4168:     initialised with the keywords at statement 8.   The  pattern  used
        !          4169:     to  break out words is written out of line since this ensures that
        !          4170:     matching in the inner loop at label WORDLOOP executes  at  maximum
        !          4171:     speed.   In a similar application where an in-line pattern must be
        !          4172:     used (e.g. if the string value  of  PUNCTUATION  were  subject  to
        !          4173:     change  during  execution),  then  the  statement  would  best  be
        !          4174:     written using deferred expressions as
        !          4175: 
        !          4176:       WORDLOOP INP BREAK(*PUNCTUATION) . WORD SPAN(*PUNCTUATION) =
        !          4177: 
        !          4178:     since,  being  constant,  the  pattern  can  be  pre-evaluated  at
        !          4179:     compile  time.   This saves repeatedly building the pattern in the
        !          4180:     loop, leaving only the necessary processing of the current  string
        !          4181:     in  PUNCTUATION  as  additional  work to be done compared with the
        !          4182:     version in  the  program.   The  searching  for  and  counting  of
        !          4183:     keywords  in statement 11  is done using the inherently efficient,
        !          4184:     system-provided hashing capability  of  the  TABLE  datatype.   To
        !          4185:     economise  in  table  lookups,  the  table  entry is assigned to a
        !          4186:     temporary variable in statement 10  whilst  a  check  is  made  to
        !          4187:     ensure  that  it  is non-null.  The call of CONVERT used to access
        !          4188:     non-null entries in the table does not sort the keys,  so  that  a
        !          4189:     separate  sorting process would be necessary if sorted output were
        !          4190:     required.  A listing of the filed output is given.
        !          4191: 
        !          4192: 
        !          4193: 
        !          4194: 
        !          4195: 
        !          4196: 
        !          4197: 
        !          4198: 
        !          4199: 
        !          4200: 
        !          4201: 
        !          4202: 
        !          4203: 
        !          4204: 
        !          4205: 
        !          4206: 
        !          4207: 
        !          4208: 
        !          4209: 
        !          4210: 
        !          4211: 
        !          4212: 
        !          4213: 
        !          4214: 
        !          4215: 
        !          4216: 
        !          4217:          MACRO SPITBOL V3.5
        !          4218:                                                    PAGE 66 - [10.3]
        !          4219:          Specimen Programs
        !          4220: 
        !          4221:     Contents of file KEYWDS
    ________ __ ____ ______
        !          4222: 
        !          4223:     BREEZE
        !          4224:     DAY
        !          4225:     MOON
        !          4226:     OCEAN
        !          4227:     SEA
        !          4228:     SHIP
        !          4229:     SUN
        !          4230:     THE
        !          4231:     TWAS
        !          4232:     WATER
        !          4233: 
        !          4234:     Contents of file KEYTXT
    ________ __ ____ ______
        !          4235: 
        !          4236:     THE FAIR BREEZE BLEW, THE WHITE FOAM FLEW,
        !          4237:     THE FURROW FOLLOWED FREE:
        !          4238:     WE WERE THE FIRST THAT EVER BURST
        !          4239:     INTO THAT SILENT SEA.
        !          4240: 
        !          4241:     DOWN DROPT THE BREEZE, THE SAILS DROPT DOWN,
        !          4242:     'TWAS SAD AS SAD COULD BE;
        !          4243:     AND WE DID SPEAK ONLY TO BREAK
        !          4244:     THE SILENCE OF THE SEA!
        !          4245: 
        !          4246:     DAY AFTER DAY, DAY AFTER DAY,
        !          4247:     WE STUCK, NOR BREATH NOR MOTION;
        !          4248:     AS IDLE AS A PAINTED SHIP
        !          4249:     UPON A PAINTED OCEAN.
        !          4250: 
        !          4251:     WATER, WATER, EVERY WHERE,
        !          4252:     AND ALL THE BOARDS DID SHRINK;
        !          4253:     WATER, WATER, EVERY WHERE,
        !          4254:     NOR ANY DROP TO DRINK.
        !          4255: 
        !          4256:             SAMUEL TAYLOR COLERIDGE
        !          4257: 
        !          4258: 
        !          4259:     Contents of file KEYOUT at end of run
    ________ __ ____ ______ __ ___ __ ___
        !          4260: 
        !          4261:          KEYWORD    NUMBER OF OCCURRENCES
        !          4262:          -------    --------------------
        !          4263: 
        !          4264:              SUN .  .  .  .  . 0
        !          4265:             MOON .  .  .  .  . 0
        !          4266:             SHIP .  .  .  .  . 1
        !          4267:             TWAS .  .  .  .  . 1
        !          4268:              DAY .  .  .  .  . 4
        !          4269:              SEA .  .  .  .  . 2
        !          4270:              THE .  .  .  .  . 9
        !          4271:           BREEZE .  .  .  .  . 2
        !          4272:            OCEAN .  .  .  .  . 1
        !          4273:            WATER .  .  .  .  . 4
        !          4274: 
        !          4275: 
        !          4276: 
        !          4277: 
        !          4278: 
        !          4279:          MACRO SPITBOL V3.5
        !          4280:                                                    PAGE 67 - [10.3]
        !          4281:          Specimen Programs
        !          4282: 
        !          4283: 
        !          4284:   P R O G R A M   3                                               PAGE 1
        !          4285: 
        !          4286:           -PRINT
        !          4287:           -IN80
        !          4288:           *    PROGRAM TO COUNT THE OCCURRENCES OF KEYWORDS IN A PIECE
        !          4289:           *    OF TEXT.  THE SEARCH FOR KEYWORDS IS EFFICIENTLY PERFORMED
        !          4290:           *    BY HASHING INTO A TABLE.
        !          4291:           *
        !          4292:   1                 &ANCHOR = &TRIM = 1
        !          4293:   2                 INPUT(.KEYS,1,'KEYWDS')                     :F(NOFILE)
        !          4294:   3                 INPUT(.INPUT,2,'KEYTXT')                    :F(NOFILE)
        !          4295:   4                 OUTPUT(.OUT,3,)
        !          4296:   5                 PUNCTUATION = " .,;:'!"
        !          4297:   6                 WORDPAT  = BREAK(PUNCTUATION) $ WORD SPAN(PUNCTUATION)
        !          4298:   7                 KEYTABLE = TABLE(31)
        !          4299:           *
        !          4300:           *    LOOP IN WHICH KEYWORDS ARE READ IN AND HASHED INTO KEYTABLE
        !          4301:           *
        !          4302:   8       KEYLOOP   KEYTABLE<KEYS> = 0                          :S(KEYLOOP)
        !          4303:           *
        !          4304:           *    A SPACE IS ADDED TO LINES OF TEXT TO ENSURE MATCH SUCCESS
        !          4305:           *
        !          4306:   9       READLOOP  INP      = INPUT ' '                        :F(CONVERT)
        !          4307:           *
        !          4308:           *    INDIVIDUAL WORDS ARE EXTRACTED BY PATTERN MATCHING
        !          4309:           *
        !          4310:   10      WORDLOOP  INP WORDPAT =
        !          4311:   11                KEYTABLE<WORD> = DIFFER(ENTRY = KEYTABLE<WORD>) ENTRY + 1
        !          4312:   12                DIFFER(INP)                       :S(WORDLOOP)F(READLOOP)
        !          4313:           *
        !          4314:           *    FAILURE POINT
        !          4315:           *
        !          4316:   13      NOFILE    OUTPUT  = 'MISSING INPUT FILE'              :(END)
        !          4317:   14      CONVFL    OUTPUT  = 'NO KEYWORDS FOUND'               :(END)
        !          4318:           *
        !          4319:           *    EXTRACT THE ENTRIES FROM THE TABLE INTO AN ARRAY
        !          4320:           *
        !          4321:   15      CONVERT   A        = CONVERT(KEYTABLE,'ARRAY')        :F(CONVFL)
        !          4322:   16                OUT      = '     KEYWORD    NUMBER OF OCCURRENCES'
        !          4323:   17                OUT      = '     -------    ---------------------'
        !          4324:   18                OUT      =
        !          4325:           *
        !          4326:           *    PRINT THE ENTRIES
        !          4327:           *
        !          4328:   19                 I        = 1
        !          4329:   20      PRINT    OUT   = LPAD(A[I,1],13) DUPL(' . ',5) A[I,2] :F(END)
        !          4330:   21                I        = I + 1                            :(PRINT)
        !          4331:   22      END
        !          4332: 
        !          4333: 
        !          4334: 
        !          4335: 
        !          4336: 
        !          4337: 
        !          4338: 
        !          4339: 
        !          4340: 
        !          4341:          MACRO SPITBOL V3.5
        !          4342:                                                    PAGE 68 - [10.4]
        !          4343:          Specimen Programs
        !          4344: 
        !          4345: 
        !          4346: 
        !          4347:  10.4  Program 4
 10.4  Program 4
 _____________ _
        !          4348: 
        !          4349:     This program  is  included  merely  to  show  how  errors  may  be
        !          4350:     handled,  use  of  the  -NOFAIL  option  and  the  nature of trace
        !          4351:     output.
        !          4352: 
        !          4353: 
        !          4354:     Statement 1 sets the keyword &TRACE to permit printing  of  up  to
        !          4355:     40  lines of trace output and the next two statements indicate the
        !          4356:     items to be traced.  In statement 4 a limit of 10 is  set  on  the
        !          4357:     number  of  errors  to be intercepted and processed by the program
        !          4358:     itself, whilst the destination label in  the  event  of  an  error
        !          4359:     occurring  is  identified  in  the  next statement.  The next line
        !          4360:     contains a syntax error which results in the printing of an  error
        !          4361:     message.   Following  statement  14 is a -NOFAIL control card, the
        !          4362:     effect of which  is  to  cause  generation  of  special  code  for
        !          4363:     subsequent  statements  containing  no conditional goto so that if
        !          4364:     such a  statement  does,  contrary  to  the  implied  expectation,
        !          4365:     actually  fail,  an  error  message  is  produced.  This can be of
        !          4366:     great diagnostic value.   The  output  from  the  run  illustrates
        !          4367:     various  points.   Execution  of  the program was not inhibited by
        !          4368:     the compilation error.  The number of any statement where a  trace
        !          4369:     association  is active is embedded in asterisks and printed on the
        !          4370:     left so that starting with statement 4, we can trace the  flow  of
        !          4371:     control  through the program on account of the trace intercept set
        !          4372:     on the keyword &STCOUNT.  It will be  seen  that  the  compilation
        !          4373:     error  in  statement 6 results in an execution error and that this
        !          4374:     in turn causes a transfer of control to statement  18  where  user
        !          4375:     processing  of  the error message is provided.  At statement 7 the
        !          4376:     ACCESS trace of the INPUT variable produces lines of trace  output
        !          4377:     indicating  the  value  which  it  currently  holds.   The jump to
        !          4378:     statement 10 followed by the STOPTR statement results  in  turning
        !          4379:     off  the  &STCOUNT trace.   An attempt to jump to the non-existent
        !          4380:     label L100 produces a failure,  followed  immediately  by  another
        !          4381:     when  an  attempt is made to form the sum 3 + 'L200'.  The loop at
        !          4382:     statements 16 and 17 reads 10 elements into the array A  and  then
        !          4383:     as  the  array  is  accessed outside its bounds, a statement error
        !          4384:     occurs which is converted  to  a  run  time  failure  because  the
        !          4385:     statement  was  compiled  in  -NOFAIL mode.  Had this not been the
        !          4386:     case the loop could have run for many seconds before  the  integer
        !          4387:     value  in I finally overflowed.  A correct program of course would
        !          4388:     have had a conditional goto such as
        !          4389: 
        !          4390:                               :F(ARRAY.FULL.OR.DATA.USED.UP)
        !          4391: 
        !          4392:     in statement 16.  The  failure  terminates  execution  because  at
        !          4393:     statement  13  the  limit  on the number of errors to be tolerated
        !          4394:     was reset to zero.
        !          4395: 
        !          4396: 
        !          4397: 
        !          4398: 
        !          4399: 
        !          4400: 
        !          4401: 
        !          4402: 
        !          4403:          MACRO SPITBOL V3.5
        !          4404:                                                    PAGE 69 - [10.4]
        !          4405:          Specimen Programs
        !          4406: 
        !          4407:     P R O G R A M   4                                              PAGE 1
        !          4408: 
        !          4409:           -PRINT
        !          4410:           *
        !          4411:           *    PROGRAM TO DEMONSTRATE TRACING AND ERROR HANDLING
        !          4412:           *
        !          4413:   1                 &TRACE   = &ANCHOR = &TRIM = 40
        !          4414:   2                 TRACE(.INPUT,'ACCESS')
        !          4415:   3                 TRACE(.STCOUNT,'K')
        !          4416:   4                 &ERRLIMIT = 10
        !          4417:   5                 SETEXIT(.ERROR)
        !          4418:   6                 STATEMENT , WHICH SHOULD FAIL TO COMPILE
        !          4419:                               ^
        !          4420:   ERROR 223 -- SYNTAX ERROR.  INVALID USE OF COMMA
        !          4421: 
        !          4422:   7       LOOP                                             :S($INPUT)F(FAIL)
        !          4423:   8       L1        OUTPUT   = '"L1"'                           :(LOOP)
        !          4424:   9       L2        OUTPUT   = '"L2"'                           :(LOOP)
        !          4425:   10      STOPTR    OUTPUT   = 'STOPTR'
        !          4426:   11                STOPTR(.STCOUNT,'K')                        :(LOOP)
        !          4427:   12      FAIL      X        = 3 + INPUT
        !          4428:   13                &ERRLIMIT =
        !          4429:   14                A        = ARRAY(10);     I = 1
        !          4430:           -NOFAIL
        !          4431:   16      READ      A<I>     = INPUT
        !          4432:   17                I        = I + 1                            :(READ)
        !          4433:           *
        !          4434:           *    ERROR INTERCEPT ROUTINE
        !          4435:           *
        !          4436:   18      ERROR     OUTPUT   = 'ERROR NO.  '  &ERRTYPE '  IN STATEMENT'
        !          4437:           .            &LASTNO
        !          4438:   19                OUTPUT   = 'REASON FOR FAILURE :- '  &ERRTEXT
        !          4439:   20                OUTPUT   =
        !          4440:   21                SETEXIT(.ERROR)                             :(CONTINUE)
        !          4441:   22      END
        !          4442: 
        !          4443: 
        !          4444:   STORE USED     1279
        !          4445:   STORE LEFT     4558
        !          4446:   COMP ERRORS    1
        !          4447:   REGENERATIONS  0
        !          4448:   COMP TIME-MSEC 400
        !          4449: 
        !          4450: 
        !          4451: 
        !          4452: 
        !          4453: 
        !          4454: 
        !          4455: 
        !          4456: 
        !          4457: 
        !          4458: 
        !          4459: 
        !          4460: 
        !          4461: 
        !          4462: 
        !          4463: 
        !          4464: 
        !          4465:          MACRO SPITBOL V3.5
        !          4466:                                                    PAGE 70 - [10.4]
        !          4467:          Specimen Programs
        !          4468: 
        !          4469:   ****4*******  &STCOUNT = 4
        !          4470:   ****5*******  &STCOUNT = 5
        !          4471:   ****6*******  &STCOUNT = 6
        !          4472:   ****18******  &STCOUNT = 7
        !          4473:   ERROR NO.  7  IN STATEMENT  6
        !          4474:   ****19******  &STCOUNT = 8
        !          4475:   REASON FOR FAILURE :- COMPILATION ERROR ENCOUNTERED DURING EXECUTION
        !          4476:   ****20******  &STCOUNT = 9
        !          4477: 
        !          4478:   ****21******  &STCOUNT = 10
        !          4479: 
        !          4480:   ****7*******  &STCOUNT = 11
        !          4481:   ****7*******  INPUT = 'L2'
        !          4482:   ****9*******  &STCOUNT = 12
        !          4483:   "L2"
        !          4484:   ****7*******  &STCOUNT = 13
        !          4485:   ****7*******  INPUT = 'STOPTR'
        !          4486:   ****10******  &STCOUNT = 14
        !          4487:   STOPTR
        !          4488:   ****11******  &STCOUNT = 15
        !          4489:   ****7*******  INPUT = 'L1'
        !          4490:   "L1"
        !          4491:   ****7*******  INPUT = 'L100'
        !          4492: 
        !          4493: 
        !          4494:   ERROR NO.  38  IN STATEMENT  7
        !          4495:   REASON FOR FAILURE :- GOTO UNDEFINED LABEL
        !          4496: 
        !          4497:   ****12******  INPUT = 'L200'
        !          4498:   ERROR NO.  2  IN STATEMENT  12
        !          4499:   REASON FOR FAILURE :- ADDITION RIGHT OPERAND IS NOT NUMERIC
        !          4500: 
        !          4501:   ****16******  INPUT = '1.111111'
        !          4502:   ****16******  INPUT = '2.2'
        !          4503:   ****16******  INPUT = '3.3'
        !          4504:   ****16******  INPUT = '4.4'
        !          4505:   ****16******  INPUT = '5.5'
        !          4506:   ****16******  INPUT = '6.6'
        !          4507:   ****16******  INPUT = '7.7'
        !          4508:   ****16******  INPUT = '8.8'
        !          4509:   ****16******  INPUT = '9.9'
        !          4510:   ****16******  INPUT = '10.10'
        !          4511: 
        !          4512: 
        !          4513:   ERROR 035 -- UNEXPECTED FAILURE IN -NOFAIL MODE
        !          4514: 
        !          4515:   IN STATEMENT   16
        !          4516:   STMTS EXECUTED 51
        !          4517:   RUN TIME-MSEC  280
        !          4518:   MCSEC / STMT   5490
        !          4519:   REGENERATIONS  0
        !          4520: 
        !          4521: 
        !          4522: 
        !          4523: 
        !          4524: 
        !          4525: 
        !          4526: 
        !          4527:          MACRO SPITBOL V3.5
        !          4528:                                                    PAGE 71 - [11]
        !          4529:          Implementation Information
        !          4530: 
        !          4531: 
        !          4532: 
        !          4533:                    *---------------------------------*
        !          4534:                      [11] Implementation Information
                   | [11] Implementation Information |
        !          4535:                    *---------------------------------*
        !          4536: 
        !          4537:     SPITBOL  is  implemented  on  a   wide   variety   of   computers.
        !          4538:     Condsiderable  efforts have been made to achieve compatibility and
        !          4539:     portability between versions but inevitably  there  are  features,
        !          4540:     values  or  limitations  particular  to each implementation.  This
        !          4541:     section gives details for the VAX/VMS implementation.
        !          4542: 
        !          4543:     Note that version BCAB-2132  of  SPITBOL  or  higher  requires  at
        !          4544:     least VMS version 2.
        !          4545: 
        !          4546: 
        !          4547:  11.1  &CODE
 11.1  &CODE
 ___________
        !          4548:     The  default  value  for  &CODE  in  VAX/VMS SPITBOL is one.  This
        !          4549:     avoids a "successful completion" message  from  VMS  which  occurs
        !          4550:     when &CODE is zero on exit.
        !          4551: 
        !          4552:     The  value  of  &CODE  is  used on exit as the return code to VMS.
        !          4553:       There are two exceptions:
        !          4554: 
        !          4555:     - &CODE = 998 will print a message on termination  to  the  effect
        !          4556:       that the standard output channel is not available.
        !          4557: 
        !          4558:     - &CODE  =  999  will print a message on termination to the effect
        !          4559:       that execution was suppressed  (either  via  startup  switch  or
        !          4560:       control card).
        !          4561: 
        !          4562:     The  VMS message number 196648 corresponds to "CLI-F-ABORT" and is
        !          4563:     useful to signal general program failure  to  the  command  stream
        !          4564:     via $STATUS/$SEVERITY.
        !          4565: 
        !          4566: 
        !          4567:  11.2  &ERRTEXT
 11.2  &ERRTEXT
 ______________
        !          4568:     The  initial  value  of &ERRTEXT contains the startup command line
        !          4569:     text, excluding the command name and any trailing  comment.   When
        !          4570:     reloading  from  a saved EXIT(n) file, if the value of n was -2 or
        !          4571:     -1, the new command line will replace the value of &ERRTEXT.
        !          4572: 
        !          4573: 
        !          4574:  11.3  &STLIMIT
 11.3  &STLIMIT
 ______________
        !          4575:     The default value for &STLIMIT is one billion.  Maximum  value  is
        !          4576:     2,147,403,647.   Note  that statement counting and checking can be
        !          4577:     disabled by setting the value of &STLIMIT to -1.
        !          4578: 
        !          4579: 
        !          4580: 
        !          4581: 
        !          4582: 
        !          4583: 
        !          4584: 
        !          4585: 
        !          4586: 
        !          4587: 
        !          4588: 
        !          4589:          MACRO SPITBOL V3.5
        !          4590:                                                    PAGE 72 - [11.4]
        !          4591:          Implementation Information
        !          4592: 
        !          4593:  11.4  &TRIM
 11.4  &TRIM
 ___________
        !          4594:     Records are never implicitly padded with blanks  on  output.   For
        !          4595:     input,  any  trailing  blanks  received depend on the file and the
        !          4596:     value of &TRIM.
        !          4597: 
        !          4598: 
        !          4599:  11.5  Buffers
 11.5  Buffers
 _____________
        !          4600:     VAX/VMS  SPITBOL  contains  an  additional  datatype  called   the
        !          4601:     BUFFER.   This  is  described  in  the  section  on datatypes.  In
        !          4602:     addition, new functions BUFFER, INSERT and APPEND have been  added
        !          4603:     to  support  buffers.   These functions are described in detail in
        !          4604:     Section 5.
        !          4605: 
        !          4606: 
        !          4607: 
        !          4608: 
        !          4609: 
        !          4610: 
        !          4611: 
        !          4612: 
        !          4613: 
        !          4614: 
        !          4615: 
        !          4616: 
        !          4617: 
        !          4618: 
        !          4619: 
        !          4620: 
        !          4621: 
        !          4622: 
        !          4623: 
        !          4624: 
        !          4625: 
        !          4626: 
        !          4627: 
        !          4628: 
        !          4629: 
        !          4630: 
        !          4631: 
        !          4632: 
        !          4633: 
        !          4634: 
        !          4635: 
        !          4636: 
        !          4637: 
        !          4638: 
        !          4639: 
        !          4640: 
        !          4641: 
        !          4642: 
        !          4643: 
        !          4644: 
        !          4645: 
        !          4646: 
        !          4647: 
        !          4648: 
        !          4649: 
        !          4650: 
        !          4651:          MACRO SPITBOL V3.5
        !          4652:                                                    PAGE 73 - [11.6]
        !          4653:          Implementation Information
        !          4654: 
        !          4655: 
        !          4656: 
        !          4657:  11.6  Character Set for VAX/VMS SPITBOL
 11.6  Character Set for VAX/VMS SPITBOL
 _______________ ___ ___ _______ _______
        !          4658: 
        !          4659:     Character codes can  be  a  considerable  locus  of  confusion  in
        !          4660:     SPITBOL.   The  SNOBOL4  language  does  not  define  a "standard"
        !          4661:     graphic set, so in general an attempt has been made to conform  to
        !          4662:     the   original  IBM/360 EBCDIC symbology where possible (excluding
        !          4663:     the 'extended graphics').  This is the character style most  often
        !          4664:     used in references and manuals.
        !          4665: 
        !          4666:     The  point where this is most likely to cause problems is with the
        !          4667:     binary   bar   (alternation),   which   in   many   other    ASCII
        !          4668:     implementations  is  the exclamation point.  Such programs as make
        !          4669:     use of this convention must be editted -  OPSYN cannot be used  to
        !          4670:     redefine  a  system  operator's  semantics in MACRO SPITBOL.  Note
        !          4671:     also that the unary not-sign may be different.
        !          4672: 
        !          4673:     The correspondence between the  SNOBOL4 and VAX/VMS Macro  SPITBOL
        !          4674:     source program character set is as follows:
        !          4675: 
        !          4676:     Character Name
    _________ ____
        !          4677:                         IBM SNOBOL4
                        ___ _______
        !          4678:                                        VAX/VMS SPITBOL
                                       _______ _______
        !          4679: 
        !          4680:     Digits
        !          4681:                         0..9
        !          4682:                                        0..9
        !          4683:     Letters
        !          4684:                         A..Z
        !          4685:                                        A..Z a..z
        !          4686:     Left Parenthesis
        !          4687:                         (
        !          4688:                                        (
        !          4689:     Right Parenthesis
        !          4690:                         )
        !          4691:                                        )
        !          4692:     Left Angle Bracket
        !          4693:                         <
        !          4694:                                        < or [
        !          4695:     Right Angle Bracket
        !          4696:                         >
        !          4697:                                        > or ]
        !          4698:     Colon
        !          4699:                         :
        !          4700:                                        :
        !          4701:     Semicolon
        !          4702:                         ;
        !          4703:                                        ;
        !          4704:     Comma
        !          4705:                         ,
        !          4706:                                        ,
        !          4707:     Equal Sign
        !          4708:                         =
        !          4709:                                        =
        !          4710:     Double Quote
        !          4711: 
        !          4712: 
        !          4713:          MACRO SPITBOL V3.5
        !          4714:                                                    PAGE 74 - [11.6]
        !          4715:          Implementation Information
        !          4716: 
        !          4717:                         "
        !          4718:                                        "
        !          4719:     Single Quote
        !          4720:                         '
        !          4721:                                        '
        !          4722:     Negation
        !          4723:                         <Not-Sign>
        !          4724:                                        ~
        !          4725:     Query
        !          4726:                         ?
        !          4727:                                        ?
        !          4728:     Dollar Sign
        !          4729:                         $
        !          4730:                                        $
        !          4731:     Point
        !          4732:                         .
        !          4733:                                        .
        !          4734:     Exponentiation
        !          4735:                         **
        !          4736:                                        ** or !
        !          4737:     Percent
        !          4738:                         %
        !          4739:                                        %
        !          4740:     Asterisk
        !          4741:                         *
        !          4742:                                        *
        !          4743:     Divide
        !          4744:                         /
        !          4745:                                        /
        !          4746:     Plus
        !          4747:                         +
        !          4748:                                        +
        !          4749:     Minus
        !          4750:                         -
        !          4751:                                        -
        !          4752:     At
        !          4753:                         @
        !          4754:                                        @
        !          4755:     Blank
        !          4756:                         <Blank>
        !          4757:                                        <Blank> or <Tab>
        !          4758:     Alternation
        !          4759:                         |
        !          4760:                                        |
        !          4761:     Number Sign
        !          4762:                         #
        !          4763:                                        #
        !          4764:     Ampersand
        !          4765:                         &
        !          4766:                                        &
        !          4767:     Underscore
        !          4768:                         not avail.
        !          4769:                                        _
        !          4770: 
        !          4771: 
        !          4772: 
        !          4773: 
        !          4774: 
        !          4775:          MACRO SPITBOL V3.5
        !          4776:                                                    PAGE 75 - [11.7]
        !          4777:          Implementation Information
        !          4778: 
        !          4779: 
        !          4780: 
        !          4781:  11.7  Form of DATE String
 11.7  Form of DATE String
 __________ __ ____ ______
        !          4782:     DATE() returns an 22 character string of the form:
        !          4783: 
        !          4784:                           MM-DD-YYYY HH:MM:SS.CC
        !          4785: 
        !          4786:                                                            M      D
    These  wall-time  components  designate  respectively: _onth, _ay,
        !          4787:     Y     H     M       S                      C
    _ear, _our, _inute, _econd and Hundredths (_enti-) seconds.
        !          4788: 
        !          4789: 
        !          4790:  11.8  Errors
 11.8  Errors
 ____________
        !          4791:     In addition to the errors  issued  by  the  interpreter,  the  VMS
        !          4792:     interface  may  detect a number of conditions which it will report
        !          4793:     using the default VMS condition handler.
        !          4794: 
        !          4795:     There follows the list of SPITBOL's VMS-specific errors,  and  the
        !          4796:     severity  of  the  error.  Errors which have a severity of warning
        !          4797:     or less can be suppressed  with the /NOWARN startup  command  line
        !          4798:     switch.   (An  exception are the messages generated as a result of
        !          4799:     an exception caused by a LOADed function image.)   Errors  with  a
        !          4800:     listed  severity  of "Severe" will generally cause execution to be
        !          4801:     aborted  with  the  DCL   $STATUS  and   $SEVERITY   symbols   set
        !          4802:     appropriately.   Although  more  messages  may  be  added  in  the
        !          4803:     future, existing message symbols and values will not.
        !          4804: 
        !          4805: 
        !          4806:      Error Name    Severity          Description
        !          4807: 
        !          4808:      EXIT           Info     EXIT Module Saved - <Filename>
        !          4809: 
        !          4810:      EXSUP          Info     Execution Suppressed
        !          4811: 
        !          4812:      INSVIRMEM      Severe   Insufficient Virtual Memory
        !          4813:        This can occur if the value specified on the /MINT switch, or
        !          4814:     if
        !          4815:        the value of the system VIRTUALPAGECNT parameter is too low (it
        !          4816:        should generally be at least 4000.)
        !          4817: 
        !          4818:      LINETRUNC      Warning  Input Source Line Truncated
        !          4819: 
        !          4820:      LOADCRC        Severe   Load Incompatible, Please Retranslate
        !          4821:     Source
        !          4822:        SPITBOL has been modified since the EXIT(-n) module was saved.
        !          4823: 
        !          4824:      LOADMEM        Severe   <No longer used>
        !          4825: 
        !          4826:      LOADOPEN       Severe   Can't Open LOAD File - <Filename>
        !          4827: 
        !          4828:      LOADMAP        Severe   Error Mapping LOAD File - <Filename>
        !          4829: 
        !          4830:      LOADUNEXCOND   Warning  Loaded Function Failed To Handle
        !          4831:                                Condition At PC=<Hex PC>
        !          4832:        An external LOADed function was invoked and generated an
        !          4833:     exception
        !          4834:        condition which it did not handle.  Check to see that the image
        !          4835: 
        !          4836: 
        !          4837:          MACRO SPITBOL V3.5
        !          4838:                                                    PAGE 76 - [11.8]
        !          4839:          Implementation Information
        !          4840: 
        !          4841:        base address was properly specified.
        !          4842: 
        !          4843:      LOADUNEXTRY    Warning  Will Attempt to Recover By Forcing
        !          4844:     Failure
        !          4845:        A loaded function was unable to return an acceptable result, so
        !          4846:        SPITBOL attempts to continue execution by simulating failure.
        !          4847: 
        !          4848:      LOADVERS       Severe   Load Versions Incompatible,
        !          4849:                                Please Retranslate Source
        !          4850:        The version of SPITBOL used to save an EXIT(-n) module was not
        !          4851:        the same as the one being used to load it.
        !          4852: 
        !          4853:      NOSYSOUT       Severe   Output File Not Accessable
        !          4854:        The /LIST= or /OUT= device/file could not be opened for
        !          4855:     writing.
        !          4856: 
        !          4857:      NOTEXITMOD     Severe   File is Not a Saved EXIT File -
        !          4858:     <Filename>
        !          4859:        The file implied or specified by /LOAD was not a saved SPITBOL
        !          4860:        EXIT(-n) file.
        !          4861: 
        !          4862:      OPENOUT        Severe   Error Opening <Filename> as Output
        !          4863: 
        !          4864:      OPENIN         Severe   Error Opening <Filename> as Input
        !          4865: 
        !          4866:      PAUSE          Info     Paused at Statement <Stmt #>
        !          4867:        This is issued as a consequence of executing an EXIT(0).  Enter
        !          4868:        CONTINUE to resume execution.
        !          4869: 
        !          4870:      STACKOVFL      Severe   Virtual Stack Space Exhausted
        !          4871:        This is a severe stack overflow which will not be seen (SPITBOL
        !          4872:        will issue its own stack overflow through the standard error
        !          4873:        handling mechanism) unless SPITBOL is improperly linked.
        !          4874: 
        !          4875:      SYNTAX         Severe   Syntax Error In Command Line
        !          4876: 
        !          4877:      BADLINK        Severe   Incorrectly specified BASE(s) in SPITBOL
        !          4878:     link
        !          4879:        The symbol LOAD_BASE is higher than the start of the
        !          4880:     interpreter
        !          4881:        (BASE=) or STACK_LIMIT is too close to LOAD_BASE.
        !          4882: 
        !          4883:      LOADBADINT     Warning  Loaded function returned invalid
        !          4884:                                integer result pointer
        !          4885: 
        !          4886:      LOADBADREAL    Warning  Loaded function returned invalid real
        !          4887:                                number result ptr
        !          4888: 
        !          4889:      LOADBADSTRING  Warning  Loaded function returned invalid string
        !          4890:                                descriptor
        !          4891: 
        !          4892:      LOADBADUNCONV  Warning  Loaded function returned bad block for
        !          4893:                                unconverted result
        !          4894: 
        !          4895: 
        !          4896: 
        !          4897: 
        !          4898: 
        !          4899:          MACRO SPITBOL V3.5
        !          4900:                                                    PAGE 77 - [11.9]
        !          4901:          Implementation Information
        !          4902: 
        !          4903: 
        !          4904: 
        !          4905:  11.9  EXIT Function Usage
 11.9  EXIT Function Usage
 __________ ________ _____
        !          4906:     The EXIT  function  has  been  implemented  in  all  forms  except
        !          4907:     positive  integer  arguments  (that  is  to say, there is no total
        !          4908:     image save).  Each of the forms is described below.
        !          4909: 
        !          4910: 
        !          4911:  11.9.1  EXIT(0) Usage
 11.9.1  EXIT(0) Usage
        !          4912:     EXIT(0) will pause the program with a message;  a  DCL  "CONTINUE"
        !          4913:     command  will  continue  execution.  The message can be suppressed
        !          4914:     with the /NOWARN command line option.
        !          4915: 
        !          4916: 
        !          4917:  11.9.2  EXIT(String) Usage
 11.9.2  EXIT(String) Usage
        !          4918:     EXIT(string) will cause SPITBOL  to  exit  and  "string"  will  be
        !          4919:     given  to  the command interpreter as the next command.  Note that
        !          4920:     this subsumes the normal SPITBOL  semantics  of  EXIT(string)  for
        !          4921:     chain  execution  if the string is of the form "RUN image".  It is
        !          4922:     also possible to initiate a command file  (including  one  written
        !          4923:     by   the   program   itself)   if  the  string  is  of  the  form:
        !          4924:     "@command-file".
        !          4925: 
        !          4926: 
        !          4927:  11.9.3  EXIT(-n) Usage
 11.9.3  EXIT(-n) Usage
        !          4928:     EXIT(-n) is implemented, and will save the impure segments of  the
        !          4929:     interpreter  in  a  specially formatted block mode file.  The name
        !          4930:     for this file is the same as the  standard  input  file,  with  an
        !          4931:                       S       EX
    extension ".SEX" (SPITBOL EXit!) under the default directory.   If
        !          4932:     such  a  file already exists, it will be reused (with an extension
        !          4933:     of space if required), otherwise a new file  is  allocated.    The
        !          4934:     startup   switch   "/LOAD[=filename]"   can  be  used  to  load  a
        !          4935:     previously saved .SEX file.  If the "=filename" is  not  specified
        !          4936:     on  the  load, the default LOAD name is the same as that described
        !          4937:     above.  Specification of  /LOAD  does  not  obviate  the  need  to
        !          4938:     specify  a standard input file, although it need not have the same
        !          4939:     name as the save file,  and trivially could be "NL:" if no use  is
        !          4940:     to be made of the standard input channel.
        !          4941: 
        !          4942:     Certain  remarks are in order regarding this form of EXIT.  When a
        !          4943:     previously saved .SEX file is loaded, SPITBOL  performs  a  number
        !          4944:     of  fairly  extensive  checks to verify that the segment was saved
        !          4945:     under the same version of SPITBOL that is being used to  load  it.
        !          4946:     If  it is not, the load will not work and one of a number of fatal
        !          4947:     errors will be issued.  The conclusion should  be  that  the  file
        !          4948:     created  by  EXIT  is not really analogous to a "permanent" object
        !          4949:     or executable binary.   The  original  source  and  data  must  be
        !          4950:     retained in the event that a retranslation is indicated.
        !          4951: 
        !          4952:     One  other point should be noted as regards EXIT(-n).  Neither the
        !          4953:     status of open files, nor the contents of LOAD(...)  functions  is
        !          4954:     preserved  across  an  EXIT(-n);  this includes the standard input
        !          4955:     and output files, which are instead associated anew when the  exit
        !          4956:     module  is reloaded using the filenames given on the /LOAD startup
        !          4957:     line.   In general, INPUT(...), OUTPUT(...)  and  LOAD(...)  calls
        !          4958:     must  be  made  after  the  call  to  EXIT(-n).   In addition, the
        !          4959: 
        !          4960: 
        !          4961:          MACRO SPITBOL V3.5
        !          4962:                                                    PAGE 78 - [11.9.3]
        !          4963:          Implementation Information
        !          4964: 
        !          4965:     load-time  values  (default  or  explicit)  of  /MINC  and   /MINT
        !          4966:     override  whatever  values were in effect when the exit module was
        !          4967:     saved (SPITBOL will, however,  always  attempt  to  obtain  enough
        !          4968:     virtual  space  to  hold  the  impure  data  of  the  exit module,
        !          4969:     regardless of the setting of /MINT.)  If the EXIT(-1) or  EXIT(-2)
        !          4970:     forms  are  used,  then  the load-time values of the other startup
        !          4971:     command line switches override the  values  at  the  time  of  the
        !          4972:     EXIT.
        !          4973: 
        !          4974: 
        !          4975:  11.10  FENCE(PATTERN)
 11.10  FENCE(PATTERN)
 _____________________
        !          4976:     VAX/VMS  SPITBOL contains an additional intrinsic pattern matching
        !          4977:     function called FENCE.  This function is described  in  Section  5
        !          4978:     in detail.
        !          4979: 
        !          4980: 
        !          4981:  11.11  HOST
 11.11  HOST
 ___________
        !          4982:     The  only defined entry to HOST is when all arguments are null, in
        !          4983:     which case, HOST() returns the identifying string of the form:
        !          4984: 
        !          4985:                   VAX:VMS:sitename:username:accountname
        !          4986: 
        !          4987:     "Sitename" is derived from  a  translation  of  the  logical  name
        !          4988:     "SYS$SITENAME"  to  obtain  a  site name both for HOST and for the
        !          4989:     banner.  The translated string must be 28 or fewer characters.
        !          4990: 
        !          4991: 
        !          4992:  11.12  Range of Integers
 11.12  Range of Integers
 ____________ __ ________
        !          4993:     Integers are represented in a single  VAX  32-bit  longword.   The
        !          4994:     range for integers is: [ -2,147,483,648 , +2,147,483,647 ].
        !          4995: 
        !          4996: 
        !          4997: 
        !          4998: 
        !          4999: 
        !          5000: 
        !          5001: 
        !          5002: 
        !          5003: 
        !          5004: 
        !          5005: 
        !          5006: 
        !          5007: 
        !          5008: 
        !          5009: 
        !          5010: 
        !          5011: 
        !          5012: 
        !          5013: 
        !          5014: 
        !          5015: 
        !          5016: 
        !          5017: 
        !          5018: 
        !          5019: 
        !          5020: 
        !          5021: 
        !          5022: 
        !          5023:          MACRO SPITBOL V3.5
        !          5024:                                                    PAGE 79 - [11.13]
        !          5025:          Implementation Information
        !          5026: 
        !          5027: 
        !          5028: 
        !          5029:  11.13  INPUT/OUTPUT
 11.13  INPUT/OUTPUT
 ___________________
        !          5030:     All  VAX/VMS  Macro  SPITBOL  I/O is processed through RMS (Record
        !          5031:     Management Services).  The general form of the  INPUT/OUTPUT  call
        !          5032:     in Macro SPITBOL is:
        !          5033: 
        !          5034:                       XXXPUT(Var,Filearg1,Filearg2)
        !          5035: 
        !          5036:     "Filearg1"  may  be any Macro SPITBOL object that can be converted
        !          5037:     to a name (e.g. number or string).  It has no significance to  the
        !          5038:     I/O  system  as  such,  however  it represents a unique binding to
        !          5039:     this I/O channel,  and it can thus be used in subsequent calls  to
        !          5040:     INPUT,  OUTPUT,  REWIND,  ENDFILE and EJECT.  If Filearg1 is null,
        !          5041:     an INPUT call refers to the standard  input  channel  association,
        !          5042:     and  an  OUTPUT  call  similarly  refers  to  the  standard output
        !          5043:     channel.   It  is  permitted  to  reassign  these   channels   via
        !          5044:     INPUT/OUTPUT,  but note that SPITBOL does not allow null arguments
        !          5045:     to REWIND or ENDFILE.
        !          5046: 
        !          5047:     "Filearg2" differs slightly from the form shown in Section  5  for
        !          5048:     the INPUT and OUTPUT functions, and has the form:
        !          5049: 
        !          5050:                        "Filespec/Switch/Switch/..."
        !          5051: 
        !          5052:     where  all  components,  including  "Filespec"  are  optional.  If
        !          5053:     Filespec is given, the current channel (if any) is closed out  and
        !          5054:     a  new  association  to the given Filespec is created.  "Filespec"
        !          5055:     is  given   in   standard   VMS/RMS   form   for   a   device/file
        !          5056:     specification.   If  the  Filespec  is  omitted  then any switches
        !          5057:     specified are processed  for  the  association,  but  the  present
        !          5058:     association  to  the  channel  remains  unchanged.   If the entire
        !          5059:     Filearg2 is null, then this  reduces  to  simply  I/O  associating
        !          5060:     "Var" to the channel designated by Filearg1.
        !          5061: 
        !          5062:     Any  given "Filearg1" channel can be associated for both INPUT and
        !          5063:     OUTPUT, however any such dual associations must  be  formed  prior
        !          5064:     to  opening  the  channel  in order to avoid an RMS error when the
        !          5065:     channel is used in a  manner  for  which  is  was  not  originally
        !          5066:     opened.   A  channel  is opened for I/O activity indirectly due to
        !          5067:     the first I/O reference to it.  The call to  INPUT  or  OUTPUT  by
        !          5068:     itself  causes no I/O activity, but only establishes the nature of
        !          5069:     the variable-to-channel and channel-to-file associations that  can
        !          5070:     be   used  later.   The  first  I/O  reference  to  a  channel  or
        !          5071:     channel-associated variable causes either an OPEN or CREATE to  be
        !          5072:     issued.   The  OPEN  (an existing file) is issued unless an OUTPUT
        !          5073:     association to the channel has been made, in which case  a  CREATE
        !          5074:     (new  file)  will  be issued.  The occurrence of some switches can
        !          5075:     modify this default action.
        !          5076: 
        !          5077:     Note that all I/O sequential in nature; the default mode  of  file
        !          5078:     creation  is  variable-length,  carriage  return  delimited record
        !          5079:     attributes.   It is possible to  process  existing  indexed  files
        !          5080:     transparently  through RMS, however, sequential access is the only
        !          5081:     processing   mode   available,   regardless    of    the    file's
        !          5082:     characteristics.
        !          5083: 
        !          5084: 
        !          5085:          MACRO SPITBOL V3.5
        !          5086:                                                    PAGE 80 - [11.13.1]
        !          5087:          Implementation Information
        !          5088: 
        !          5089: 
        !          5090: 
        !          5091:  11.13.1  FILEARG2 SWITCHES
 11.13.1  FILEARG2 SWITCHES
        !          5092:     The   following   switches  are  available  for  specification  on
        !          5093:     Filearg2.  They must be specified in upper-case.  In  many  cases,
        !          5094:     it  is  possible  to  precede  the  switch name by the prefix "NO"
        !          5095:     which indicates that the condition indicated by the switch  is  to
        !          5096:     be  inverted  for  this channel.  For switches which apply only to
        !          5097:     terminal I/O, their presence is ignored when  dealing  with  other
        !          5098:     devices or files.
        !          5099: 
        !          5100:         SWITCH           _ _ _ _ _ _ _ _ _ _ _
        ______           D_E_S_C_R_I_P_T_I_O_N
        !          5101: 
        !          5102:          /CCO   Cancel   terminal   control  O  on  subsequent  output
        !          5103:                 operations.
        !          5104:          /CIF   If  the  named  file  already  exists,  it  is   used.
        !          5105:                 Otherwise,  a  new  file  is created.  Note that if an
        !          5106:                 existing  sequential  variable-length  file  is  being
        !          5107:                 processed,  /EOF  must  also  be  specified  since RMS
        !          5108:                 cannot  rewrite   records   in   such   files.    This
        !          5109:                 restriction does not apply to indexed files.
        !          5110:          /CR    Set  CR/LF  file  attributes  for  CREATE  operations.
        !          5111:                 Note that an  output  association  to  "TT:/-CR"  will
        !          5112:                 thus  suppress the usual carriage return and line feed
        !          5113:                 after each output assignment to the terminal.
        !          5114:          /DLT   Delete the file when it is closed.
        !          5115:          /EOF   Position  to  end-of-file  on  open.   If  an   OUTPUT
        !          5116:                 association  has  been made, the presence of /EOF will
        !          5117:                 cause an OPEN to be issued rather than a CREATE.
        !          5118:          /FTN   Set  FORTRAN-type  carriage  control  attributes   for
        !          5119:                 CREATE.   This  switch  is mutually exclusive with the
        !          5120:                 "CR" switch.
        !          5121:          /MXV   Maximize the version number of the file  on  a  CREATE
        !          5122:                 between  any specified version and one higher than the
        !          5123:                 highest existing verion.
        !          5124:          /PTA   Purge the terminal type-ahead  buffer  for  subsequent
        !          5125:                 terminal input on this channel.
        !          5126:          /RNE   For  a  terminal  input-associated channel, subsequent
        !          5127:                 input is not to be echoed.
        !          5128:          /RNF   For terminal-associated  input,  control-U,  control-R
        !          5129:                 and  DELETE  characters are passed in the input string
        !          5130:                 and are not taken as control characters.
        !          5131:          /SCF   Submit this file to the system standard  batch  stream
        !          5132:                 when it is closed.
        !          5133:          /SPL   Submit  this  file  to the system standard spool queue
        !          5134:                 when it is closed.
        !          5135:          /SUP   Supercede any existing file on CREATE.
        !          5136:          /TEF   Truncate the file to actual EOF when it is closed.
        !          5137: 
        !          5138: 
        !          5139: 
        !          5140: 
        !          5141: 
        !          5142: 
        !          5143: 
        !          5144: 
        !          5145: 
        !          5146: 
        !          5147:          MACRO SPITBOL V3.5
        !          5148:                                                    PAGE 81 - [11.13.2]
        !          5149:          Implementation Information
        !          5150: 
        !          5151: 
        !          5152: 
        !          5153:  11.13.2  I/O EXAMPLES
 11.13.2  I/O EXAMPLES
        !          5154:     Here are a few examples of INPUT/OUTPUT calls.  The  colons  (":")
        !          5155:     represent code sequences which are not shown.
        !          5156: 
        !          5157:     1. Attach  the user's terminal for input without echoing the first
        !          5158:        line read in.
        !          5159: 
        !          5160:             INPUT(.TTNE,1,'TT:/RNE')
        !          5161:                      :
        !          5162:             FIRST_LINE = TTNE
        !          5163:             INPUT(.TTNE,1,'/NORNE')
        !          5164:                      :
        !          5165: 
        !          5166: 
        !          5167:     2. Write  to  a  new  file  OUT.DAT  and  spool  it  when  SPITBOL
        !          5168:        terminates.
        !          5169: 
        !          5170:             OUTPUT(.OUTFILE,1,'OUT.DAT/SPL')
        !          5171: 
        !          5172: 
        !          5173:     3. Write  to  an  intermediate  file, then rewind it, read through
        !          5174:        it, and delete it.
        !          5175: 
        !          5176:             INPUT(.INTER,1,'SCRATCH.DAT/DLT')
        !          5177:             OUTPUT(.INTER,1)
        !          5178:                     :
        !          5179:        WRITELOOP
        !          5180:             INTER = X
        !          5181:                     :
        !          5182:             REWIND(1)
        !          5183:        READLOOP
        !          5184:             X = INTER   :F(EXIT)
        !          5185:                     :
        !          5186:        EXIT
        !          5187:             ENDFILE(1)
        !          5188:        END
        !          5189: 
        !          5190: 
        !          5191:     4. Append the record "***END***" to an existing file:
        !          5192: 
        !          5193:             OUTPUT(.OLDFILE,1,'OLDFILE.DAT/EOF/CIF')
        !          5194:             OLDFILE = '***END***'
        !          5195:        END
        !          5196: 
        !          5197: 
        !          5198: 
        !          5199: 
        !          5200: 
        !          5201: 
        !          5202: 
        !          5203: 
        !          5204: 
        !          5205: 
        !          5206: 
        !          5207: 
        !          5208: 
        !          5209:          MACRO SPITBOL V3.5
        !          5210:                                                    PAGE 82 - [11.14]
        !          5211:          Implementation Information
        !          5212: 
        !          5213: 
        !          5214: 
        !          5215:  11.14  Linking SPITBOL
 11.14  Linking SPITBOL
 ______________ _______
        !          5216: 
        !          5217: 
        !          5218:     SPITBOL is delivered pre-linked and ready for use.  Some sites  or
        !          5219:     users  may  wish  to  link their own copies.  Modifications to the
        !          5220:     source are not encouraged, as it renders much more  difficult  the
        !          5221:     process  of  diagnosing  trouble  reports.  If trouble reports are
        !          5222:     submitted, the implementor requests that the original,  unmodified
        !          5223:     interpreter be used to provide the necessary information.
        !          5224: 
        !          5225:     The normal link command is:
        !          5226: 
        !          5227:          $
         _ LINK/SYMB=SYS$SYSTEM:SPITBOL/EXE=SYS$SYSTEM:SPITBOL -
        !          5228:          $
         __     SYS$LIBRARY:SPITBOL/OPT
        !          5229: 
        !          5230:     The recommended SPITBOL.OPT linker options file is:
        !          5231: 
        !          5232:          SPITV35,SPITGO,SPITMSGS,SPITSYS,SPITIOSYS,-
        !          5233:          SYS$SYSTEM:SYS.STB/SELECT
        !          5234:          BASE=%X100000
        !          5235:          IOSEGMENT=128
        !          5236:          STACK=10
        !          5237:          SYMBOL=LOAD_BASE,%X7FE00
        !          5238:          SYMBOL=STACK_LIMIT,%X10000
        !          5239: 
        !          5240:     Note  that  VAX/VMS  SPITBOL  is  a  licensed product and sources,
        !          5241:     objects and executable images are for use only  on  the  system(s)
        !          5242:     where  the  license  applies.   This applies both to the delivered
        !          5243:     files as well as any modified versions of them.
        !          5244: 
        !          5245: 
        !          5246:  11.15  Terminal Listing Options
 11.15  Terminal Listing Options
 _______________ _______ _______
        !          5247:     If  the  standard  output  channel  is  a  terminal   device,   an
        !          5248:     abbreviated  listing  format  is  used  by default.  See below for
        !          5249:     details.
        !          5250: 
        !          5251: 
        !          5252: 
        !          5253: 
        !          5254: 
        !          5255: 
        !          5256: 
        !          5257: 
        !          5258: 
        !          5259: 
        !          5260: 
        !          5261: 
        !          5262: 
        !          5263: 
        !          5264: 
        !          5265: 
        !          5266: 
        !          5267: 
        !          5268: 
        !          5269: 
        !          5270: 
        !          5271:          MACRO SPITBOL V3.5
        !          5272:                                                    PAGE 83 - [11.16]
        !          5273:          Implementation Information
        !          5274: 
        !          5275: 
        !          5276: 
        !          5277:  11.16  LOAD Function Usage
 11.16  LOAD Function Usage
 ___________ ________ _____
        !          5278:     The LOAD function is implemented with the  general  philosophy  of
        !          5279:     permitting  a  true  dynamic  load  of  externally  linked  images
        !          5280:     without  any  necessity  for  resorting  to  MACRO-32  or  similar
        !          5281:     machine-level  coding.  The first argument to LOAD is as described
        !          5282:     in Section 5.  The second argument  string  is  the  name  of  the
        !          5283:     image  to  be  loaded.   The usual defaults (those of the process)
        !          5284:     apply to this  name;   the  default  extension  is  ".EXE".   This
        !          5285:     string  should  never  be null, that form is reserved for a future
        !          5286:     implementation of a static LOAD.
        !          5287: 
        !          5288:     The  general  process  for  creating  a  LOADable  image  can   be
        !          5289:     summarized as follows:
        !          5290: 
        !          5291:       1. Prepare  and  debug  the  external  subroutine(s) you want to
        !          5292:          link into  a  loadable  function.   The  code  should  be  as
        !          5293:          thoroughly   checked   out  as  possible.    Debugging  under
        !          5294:          control of SPITBOL is difficult, and in extreme  cases,  bugs
        !          5295:          can  corrupt  the  interpreter's  store,  making them all but
        !          5296:          impossible to locate.
        !          5297: 
        !          5298:          Any language(s) can  be  used  to  program  the  subprograms,
        !          5299:          however  users of high-level languages usually need to follow
        !          5300:          some special guidelines (see below).
        !          5301: 
        !          5302:       2. Link an image consisting of the modules required.  The  image
        !          5303:          must  be  linked  at  a  suitable base address if it contains
        !          5304:          positionally dependent content (see below).  The link  should
        !          5305:          incorporate  a  search  of  SPITBOL's  symbol  table to avoid
        !          5306:          duplication of  the  run-time  library  in  the  image's  own
        !          5307:          virtual  space.   The  image  must  have  a  defined transfer
        !          5308:          address in user space.
        !          5309: 
        !          5310:       3. Run the  SPITBOL  program  and  issue  the  LOAD  call.   The
        !          5311:          function can now be used as an ordinary SPITBOL function.
        !          5312: 
        !          5313:     Details on each of these steps follow.
        !          5314: 
        !          5315: 
        !          5316: 
        !          5317: 
        !          5318: 
        !          5319: 
        !          5320: 
        !          5321: 
        !          5322: 
        !          5323: 
        !          5324: 
        !          5325: 
        !          5326: 
        !          5327: 
        !          5328: 
        !          5329: 
        !          5330: 
        !          5331: 
        !          5332: 
        !          5333:          MACRO SPITBOL V3.5
        !          5334:                                                    PAGE 84 - [11.16.1]
        !          5335:          Implementation Information
        !          5336: 
        !          5337: 
        !          5338: 
        !          5339:  11.16.1  High-Level Languages and LOAD
 11.16.1  High-Level Languages and LOAD
        !          5340:     Images  invoked  by  LOAD are not entered via the image activator.
        !          5341:     Instead,  SPITBOL  gets  to  them  via   an   ordinary   CALL-type
        !          5342:     instruction  to  the  entry  point  of  the image.  Note that most
        !          5343:     "high-level  languages"  do  not  support  the  declaration  of  a
        !          5344:     parameterized subprogram as an image entry point.
        !          5345: 
        !          5346:     To  permit  the use of such languages for LOAD functions, a module
        !          5347:     to solve the problem just described is provided with  the  SPITBOL
        !          5348:     delivery  in  SYS$LIBRARY:SPITHLS.OBJ.   This  module  defines  an
        !          5349:     entry point, and  then  jumps  one  word  past  the  global  label
        !          5350:     SPIT$LOAD_ENTRY.   (The  one  word  is  to  bypass the procedure's
        !          5351:     register save mask.)  This means that the entry subprogram of  any
        !          5352:     LOADable   function    which   uses   SPITHLS.OBJ  must  be  named
        !          5353:     SPIT$LOAD_ENTRY.
        !          5354: 
        !          5355: 
        !          5356:  11.16.2  Calling Conventions for LOAD
 11.16.2  Calling Conventions for LOAD
        !          5357:     All  arguments  to  LOAD  are  transmitted  to  the  function   by
        !          5358:     reference  pointers  to  values  on the stack (in P1 space).  (The
        !          5359:     only exception  is  unconverted  arguments  which  are  passed  by
        !          5360:     reference  to  a  block  in SPITBOL's dynamic area.)  The function
        !          5361:     may  overwrite  these  stacked  values  freely,  since  they   are
        !          5362:     discarded  when  the  function  returns.   It goes without further
        !          5363:     comment that in no case should an attempt ever be  made  to  store
        !          5364:     outside the defined length of the value.
        !          5365: 
        !          5366:     If  a  LOADed function requires a dynamically sized memory area to
        !          5367:     work in, the LOAD prototype can specify a 'junk'  parameter  which
        !          5368:     can  be  a  string  of the appropriate length when the function is
        !          5369:     called.  LOADed functions should under  no  circumstances  attempt
        !          5370:     to  dynamically  map  their  own  virtual  memory since this would
        !          5371:     likely interfere with SPITBOL's own allocation process.
        !          5372: 
        !          5373:     It may, for  some  applications,  be  helpful  to  be  aware  that
        !          5374:     arbitrary binary data can be stored in strings and buffers.
        !          5375: 
        !          5376: 
        !          5377:  11.16.3  Return Conventions for LOAD
 11.16.3  Return Conventions for LOAD
        !          5378:     When  an  external  function  is  ready  to  return, it may signal
        !          5379:     success or  failure,  and  if  it  succeeds,  it  must  return  an
        !          5380:     appropriate  result  of  the  type described by the LOAD prototype
        !          5381:     for the function.
        !          5382: 
        !          5383:     Success or failure is indicated on return by the low order bit  of
        !          5384:     R0,  according  to the normal VAX/VMS convention (the remainder of
        !          5385:     the register is ignored).
        !          5386: 
        !          5387:     If the low bit of R0 is set on  return,  this  indicates  success,
        !          5388:     and  R1  points  to  an  integer  value,  real  value,  or  string
        !          5389:     descriptor as appropriate for the function.   This  is  the  value
        !          5390:     that will be returned to SPITBOL as the result of the call.
        !          5391: 
        !          5392: 
        !          5393: 
        !          5394: 
        !          5395:          MACRO SPITBOL V3.5
        !          5396:                                                    PAGE 85 - [11.16.3]
        !          5397:          Implementation Information
        !          5398: 
        !          5399:     Many   high-level   languages   do  not  have  the  capability  of
        !          5400:     returning  values  in  this  manner,  so   SYS$LIBRARY:SPITHLS.OBJ
        !          5401:     contains  two  additional  entry  points, SPIT$SUCCESS_RETURN(obj)
        !          5402:     and SPIT$FAIL_RETURN().  These are co-routine  entry  points  that
        !          5403:     can  be called using the VAX/VMS standard calling conventions, and
        !          5404:     will make adjustments to the  stack,  R0  and  R1  and  return  to
        !          5405:     SPITBOL.   "Obj" is the address of the returned value when success
        !          5406:                                                         must
    is  to  be  indicated.   Both of these entry points must be called
        !          5407:     from the same level as when the function was  originally  entered,
        !          5408:     that  is,  at the same point in execution where the function would
        !          5409:     normally return.
        !          5410: 
        !          5411:     Before the LOADed function is invoked, and also  when  the  result
        !          5412:     is  being  checked,  SPITBOL  establishes a condition handler that
        !          5413:     will receive control if any exceptions  occur.   These  exceptions
        !          5414:     typically  are  the result of an error in the function itself,  an
        !          5415:     improper specification of argument or result  types  in  the  LOAD
        !          5416:     call,    or  an  improper  link  of a non-PIC function (see below)
        !          5417:     causing invalid addresses to  be  returned  to  SPITBOL.   In  any
        !          5418:     event,  this handler will, after printing a message indicating the
        !          5419:     cause of the error, attempt recovery by  forcing  failure  of  the
        !          5420:     function  call.   This  will  generally allow SPITBOL execution to
        !          5421:     continue.  Note that this handler will  only  receive  control  in
        !          5422:     the  event  that  the  user's function does not properly field the
        !          5423:     condition itself.
        !          5424: 
        !          5425: 
        !          5426:  11.16.4  Linking External Functions
 11.16.4  Linking External Functions
        !          5427:     Like the old saw  about   how  to  shave  a  gorilla,  linking  an
        !          5428:                                          very
    function image for LOAD must be done ____ carefully.  As  a  rule,
        !          5429:     you  will  have  an  easier  time  of it if the image to be linked
        !          5430:     contains solely position independent content  (PIC),  though  this
        !          5431:     is not absolutely necessary.
        !          5432: 
        !          5433:     SPITBOL  reserves a set of pages between an address defined by the
        !          5434:     link-time symbol LOAD_BASE, and the bottom of the interpreter  for
        !          5435:     loading  images.    LOAD_BASE  is  defined in the SPITBOL.OPT link
        !          5436:     options file and is normally hex 7FE00
        !          5437: 
        !          5438:     When requested by a LOAD(...) call  to  load  an  external  image,
        !          5439:     SPITBOL  first  allocates the next available page in this area for
        !          5440:     image information, and maps the image itself directly  above  this
        !          5441:     page,  taking  as  many  pages  as required.  The base address (if
        !          5442:     any) specified to the linker when the image was generated  has  no
        !          5443:     effect  on the base address of the load.   So even if the image is
        !          5444:     not PIC, it is possible to predict  in  advance  where  the  image
        !          5445:     will  be  loaded.  Knowing this, the image can be linked with this
        !          5446:     location as the  base  address.   Note  that  if  several  non-PIC
        !          5447:     images  are to be loaded with different LOAD(...) calls, the order
        !          5448:     of the loading is significant.
        !          5449: 
        !          5450:     As an example, suppose you have an object module called  PROCSTATS
        !          5451:     produced  by VAX/VMS Fortran V2 (non-PIC) which you wish to use as
        !          5452:     a LOAD function.  You would link the image with a  linker  command
        !          5453:     such as:
        !          5454: 
        !          5455: 
        !          5456: 
        !          5457:          MACRO SPITBOL V3.5
        !          5458:                                                    PAGE 86 - [11.16.4]
        !          5459:          Implementation Information
        !          5460: 
        !          5461:            $ LINK/MAP PROCSTATS,SYS$LIBRARY:SPITHLS,-
        !          5462:              SYS$SYSTEM:SPITBOL/SELECTIVE_SEARCH,PROCSTATS/OPT
        !          5463: 
        !          5464:     The  reason for linking against SPITBOL's symbol table is to avoid
        !          5465:     including the VMS shareable run-time library  in  the  image.   In
        !          5466:     some  cases,  there will also be global symbols of interest in the
        !          5467:     interpreter  to  which  the  program  will   need   access.    The
        !          5468:     PROCSTATS.OPT  options  file  would contain at least one statement
        !          5469:     to  define  the  base  address  of  the   image   of   the   form:
        !          5470:     "BASE=%X80000".    This  is  one  page  above  the usual LOAD_BASE
        !          5471:     (%X7FE00) to leave room for the image data page  which  is  always
        !          5472:     allocated first by SPITBOL.
        !          5473: 
        !          5474:     If  additional  non-PIC images were to be linked, the total amount
        !          5475:     of virtual space used by images to be loaded first would  have  to
        !          5476:     be  calculated,  in  order  to  determine  the  actual load (base)
        !          5477:     address. For images which are entirely PIC, the  base  address  is
        !          5478:     irrelevant.   Note that for languages such as Fortran, the code is
        !          5479:     PIC but the pure data is not.
        !          5480: 
        !          5481: 
        !          5482:  11.16.5  Unconverted Values and Results for LOAD
 11.16.5  Unconverted Values and Results for LOAD
        !          5483:     If a type other than "INTEGER", "STRING", or "REAL"  is  indicated
        !          5484:     in  the  first  argument of the call to LOAD, the value is said to
        !          5485:     be "unconverted."
        !          5486: 
        !          5487:     In the case of passed arguments, a pointer to the  internal  block
        !          5488:     for  the  argument is given to the program.  The first longword of
        !          5489:     any such block is a SPITBOL block-type  word.   The  remainder  of
        !          5490:     the  block  is vertically encoded depending on the block-type.  No
        !          5491:     discussion of the internals of the interpreter are provided  here.
        !          5492:     The  source  listing  gives  a complete description of the storage
        !          5493:     blocks  for  SPITBOL   and   should   be   consulted   by   anyone
        !          5494:     contemplating using unconverted values.
        !          5495: 
        !          5496:     In  the  case  of  returned  values,  a pointer to the unconverted
        !          5497:     result must  be  in  R1  (returned  value  register).   The  block
        !          5498:     pointed  to must be in SPITBOL-correct format, including the value
        !          5499:     of the block-type  word.   It  will  be  copied  by  SPITBOL  into
        !          5500:     dynamic memory upon return.
        !          5501: 
        !          5502: 
        !          5503: 
        !          5504: 
        !          5505: 
        !          5506: 
        !          5507: 
        !          5508: 
        !          5509: 
        !          5510: 
        !          5511: 
        !          5512: 
        !          5513: 
        !          5514: 
        !          5515: 
        !          5516: 
        !          5517: 
        !          5518: 
        !          5519:          MACRO SPITBOL V3.5
        !          5520:                                                    PAGE 87 - [11.17]
        !          5521:          Implementation Information
        !          5522: 
        !          5523: 
        !          5524: 
        !          5525:  11.17  MXLEN
 11.17  MXLEN
 ____________
        !          5526:     The   value   of   MXLEN  is  approximately  1,000,000.   This  is
        !          5527:     controlled by the "BASE=..." option  in  the  SPITBOL.OPT   linker
        !          5528:     options  file.   It is not recommended that this value be reduced,
        !          5529:     as it will limit the size  of  objects,  and  reduce  the  virtual
        !          5530:     space available for mapping in external (LOAD) images.
        !          5531: 
        !          5532: 
        !          5533:  11.18  Real Arithmetic
 11.18  Real Arithmetic
 ___________ __________
        !          5534:     Available  in  single  precision  with  a  printing  accuracy of 6
        !          5535:     digits.
        !          5536: 
        !          5537: 
        !          5538:  11.19  Extended Character Set
 11.19  Extended Character Set
 _______________ _________ ___
        !          5539:     All 256 8-bit ASCII codes are in  &ALPHABET.   The  tab  character
        !          5540:     may be used lexically in place of the space.
        !          5541: 
        !          5542: 
        !          5543:  11.20  REWIND
 11.20  REWIND
 _____________
        !          5544:     Available.
        !          5545: 
        !          5546: 
        !          5547:  11.21  Running SPITBOL
 11.21  Running SPITBOL
 ______________ _______
        !          5548: 
        !          5549: 
        !          5550:     SPITBOL  must  be  started with a command line in order to specify
        !          5551:     filenames for the standard channels, and  to  explicitly  override
        !          5552:     any  default  processing options.  This means that SPITBOL must be
        !          5553:     installed as a foreign command so that it can  recieve  a  command
        !          5554:     line.   If  SPITBOL  has  not been installed as a foreign command,
        !          5555:     this can be done individually by the  user  by  entering  the  VMS
        !          5556:     command:
        !          5557: 
        !          5558:                          $
                         _ SPIT*BOL :== $SPITBOL
        !          5559: 
        !          5560:     The  system  manager  normally  adds  this to the systemwide login
        !          5561:     command file as a part of the SPITBOL  delivery  process,  so  the
        !          5562:     above should not be necessary.
        !          5563: 
        !          5564:     The general form of the SPITBOL startup command line is:
        !          5565: 
        !          5566:             $ SPITBOL/switch... input-file/switch... "Any Text
        !          5567: 
        !          5568:     The  input-file  sets  the  identity of the standard input channel
        !          5569:     for SPITBOL.   The default extension  for  this  file  is  ".SPT".
        !          5570:     The  standard input channel represents the program source, and any
        !          5571:     data for  the  preassociated  INPUT  variable.   Such  data  input
        !          5572:     should  thus  immediately  follow the END statement of the source.
        !          5573:     All switches are optional.
        !          5574: 
        !          5575:     If no input-file is given, or  if  SPITBOL  is  unable  to  get  a
        !          5576:     command line, the default input-file will be SYS$INPUT.
        !          5577: 
        !          5578: 
        !          5579: 
        !          5580: 
        !          5581:          MACRO SPITBOL V3.5
        !          5582:                                                    PAGE 88 - [11.21]
        !          5583:          Implementation Information
        !          5584: 
        !          5585:     The  initial  value of the startup command line as provided by the
        !          5586:     VMS Command Line Interpreter (CLI) is  assigned  to  the  &ERRTEXT
        !          5587:     keyword.  This makes it possible to examine the command line as it
        !          5588:     is given to SPITBOL, in order  to  determine  filenames,  switches
        !          5589:     and  the like.   (The assignment to &ERRTEXT is made just prior to
        !          5590:     execution, and is  not  affected  by  any  preceeding  compilation
        !          5591:     errors.)   Note that the CLI will compress runs of tabs and blanks
        !          5592:     into single blanks, and place all unquoted  text  in  upper  case.
        !          5593:     Also  note that the command string begins with the first non-blank
        !          5594:                following
    character  _________  the VMS command name.   CLI "comments" (text
        !          5595:     following an unquoted "!" on the  command  line)  are  not  passed
        !          5596:     either.
        !          5597: 
        !          5598:     SPITBOL  recognizes  a  double-quote (") as an end-of-command line
        !          5599:     delimiter.  Any text following the double-quote  will  be  ignored
        !          5600:     by  SPITBOL,  but  will  appear  intact  in  the  initial value of
        !          5601:     &ERRTEXT.  This provides a mechanism for  passing  arbitrary  text
        !          5602:     into  the  program  from the command line.  The CLI will not alter
        !          5603:     the text following this double quote.
        !          5604: 
        !          5605:     It should be pointed out that the availability of startup  command
        !          5606:     line  text  in  &ERRTEXT is an addition in VAX/VMS SPITBOL, and is
        !          5607:     not  necessarily  portable  to  other   implementations   of   the
        !          5608:     language.
        !          5609: 
        !          5610:     In  some  cases,  there  may  be  a SPITBOL application or utility
        !          5611:     program for which a "custom" command  may  be  desired.   This  is
        !          5612:     easily achieved with a definition something like:
        !          5613: 
        !          5614:         $
        _ SPUTIL :== $SPITBOL/OUT=TT:/LOAD=SYS$LIBRARY:SPUTIL NL:
        !          5615: 
        !          5616:              $
    Typing  "_SPUTIL"  as  a VMS command will then load the saved EXIT
        !          5617:     file named SPUTIL in SYS$LIBRARY and execute it with the  standard
        !          5618:     output  file assigned to the terminal.  Other permutations will be
        !          5619:     useful depending on the particular application.
        !          5620: 
        !          5621: 
        !          5622: 
        !          5623: 
        !          5624: 
        !          5625: 
        !          5626: 
        !          5627: 
        !          5628: 
        !          5629: 
        !          5630: 
        !          5631: 
        !          5632: 
        !          5633: 
        !          5634: 
        !          5635: 
        !          5636: 
        !          5637: 
        !          5638: 
        !          5639: 
        !          5640: 
        !          5641: 
        !          5642: 
        !          5643:          MACRO SPITBOL V3.5
        !          5644:                                                    PAGE 89 - [11.21.1]
        !          5645:          Implementation Information
        !          5646: 
        !          5647: 
        !          5648: 
        !          5649:  11.21.1  Startup Switches
 11.21.1  Startup Switches
        !          5650:     Startup switches are optional in the sense that there are  defined
        !          5651:     defaults  for  all  of  them  that  should be adequate most of the
        !          5652:     time.  Switch names can be abbreviated to the minimum  unambiguous
        !          5653:     length.  A syntax error in the startup command line will cause the
        !          5654:     interpreter to exit with a message.
        !          5655: 
        !          5656:     Switches may appear at any point in the command  line;   they  are
        !          5657:     processed  left-to-right.   There  are no 'file-specific' switches
        !          5658:     as with some VMS languages, all switches are global.  The  use  of
        !          5659:     multiple  input  files separated either by commas or plus signs is
        !          5660:     not
    ___ supported.
        !          5661: 
        !          5662:     These are the switches provided on  the  SPITBOL  startup  command
        !          5663:     line:
        !          5664: 
        !          5665: 
        !          5666:      1.  /CRC /NOCRC
        !          5667:          This  switch  is  only  meaningful  on a /LOAD=... operation,
        !          5668:          where the specification of  /NOCRC  will  bypass  the  cyclic
        !          5669:          reducdancy  check of the SPITBOL code region.  The purpose of
        !          5670:          this check is to insure that the  version  of  SPITBOL  being
        !          5671:          used  is  the same as the version under which the exit module
        !          5672:          was saved.  As SPITBOL  also  checks  version  identification
        !          5673:          data  and  other  parameters, the overhead for this check may
        !          5674:          be considered unnecessary for frequently used  load  modules.
        !          5675:          In  such  cases,  /NOCRC  can  be  profitably specified.  The
        !          5676:          default is /CRC.
        !          5677: 
        !          5678:      2.  /CSTATS /NOCSTATS
        !          5679:          This  switch  will  suppress  the  printing  of   compilation
        !          5680:          statistics  on  the  output  file.  "/CSTATS" is the default.
        !          5681:          If /NOLIST has been specified, the default is /NOCSTATS.
        !          5682: 
        !          5683:      3.  /ESTATS /NOESTATS
        !          5684:          This  switch  will  suppress  the   printing   of   execution
        !          5685:          statistics  on  the  output  file.  "/ESTATS" is the default.
        !          5686:          If  /NOLIST  has  been  specified,  then   the   default   is
        !          5687:          /NOESTATS.
        !          5688: 
        !          5689:      4.  /EXECUTE /NOEXECUTE
        !          5690:          This  switch  has  the  same  logical effect as a  -NOEXECUTE
        !          5691:          control card in the source  program.   SPITBOL  will  process
        !          5692:          the  source  program,  and  then  exit  with  a  message that
        !          5693:          Execution Was Suppressed.  The default is "/EXECUTE".
        !          5694: 
        !          5695:      5.  /LIST[=filename] /NOLIST
        !          5696:          The /LIST switch allows specification  of  the  filename  for
        !          5697:          the  standard  output  channel.   If  a  terminal  device  is
        !          5698:          specified for the  /LIST  switch,  then  form  feeds  in  the
        !          5699:          program  listing  will be suppressed.  The default device and
        !          5700:          account for this  file  is  the  same  as  that  under  which
        !          5701:          SPITBOL  is  being run.  The default name for the output file
        !          5702:          is the input  file's  name,  and  the  default  extension  is
        !          5703: 
        !          5704: 
        !          5705:          MACRO SPITBOL V3.5
        !          5706:                                                    PAGE 90 - [11.21.1]
        !          5707:          Implementation Information
        !          5708: 
        !          5709:          ".LIS".   The  program listing and compilation statistics are
        !          5710:          sent to this file.  If neither of  /OUTPUT=...  or  /NOOUTPUT
        !          5711:          are  also  specified  on  the  command  line,  then execution
        !          5712:          output is also directed to this file.  This  includes  OUTPUT
        !          5713:          assigned text and TRACE and DUMP output.
        !          5714: 
        !          5715:          The  /NOLIST  switch  indicates that source listing is not to
        !          5716:          be generated. /NOLIST also causes an implicit  /NOESTATS  and
        !          5717:          /NOCSTATS.   Note  that  the  appearance  of /NOLIST does not
        !          5718:          mean that no output will  be  sent  to  the  standard  output
        !          5719:          channel.   However,  if the program makes no reference to the
        !          5720:          standard output channel, then if /NOLIST is  specified,  this
        !          5721:          channel will never be opened.
        !          5722: 
        !          5723:          /LIST  with  no  filename  inverts  the  effect of a previous
        !          5724:          /NOLIST  spec.   That  is,   enables   source   listing   and
        !          5725:          compilation statistics.
        !          5726: 
        !          5727:      6.  /MINC=nnn
        !          5728:          This  switch  controls the number of pages by which SPITBOL's
        !          5729:          working store is expanded when it becomes  exhausted.   Under
        !          5730:          normal  circumstances,  it should not be necessary to specify
        !          5731:          this switch, however, "/MINC=0" will prevent  any  additional
        !          5732:          allocation  to SPITBOL past the MINT allocation, and may thus
        !          5733:          be useful  in  preventing  the  unrestrained  growth  of  the
        !          5734:          interpreter.
        !          5735: 
        !          5736:          Even  if  MINC is non-zero, there are three cases which could
        !          5737:          concievably cause dynamic allocation of a SPITBOL  object  to
        !          5738:          fail.  These are:
        !          5739: 
        !          5740:             - The  size  of  the object exceeds &MAXLNGTH (MXLEN).  As
        !          5741:               this is initially greater than one million,  this  fault
        !          5742:               is  very  unlikely  to  occur  except as the result of a
        !          5743:               programming error.
        !          5744: 
        !          5745:             - If allocation would cause the virtual  memory  quota  to
        !          5746:               be  exceeded,  SPITBOL  will  print  a  MEMORY  OVERFLOW
        !          5747:               error, and terminate execution.  This is  also  unlikely
        !          5748:               on most systems.
        !          5749: 
        !          5750:             - If  SPITBOL  has  been  linked  allowing  RMS buffers to
        !          5751:               extend  in   P0  space  (linker  option  P0BUFS  -   the
        !          5752:               default),  then  with  a  large number of simultaneously
        !          5753:               open files  an  RMS  space  extension  would  block  the
        !          5754:               contiguous  growth  of  the  dynamic  area  and  cause a
        !          5755:               memory overflow.
        !          5756: 
        !          5757:          The default for this switch is "/MINC=20" which is 10K  bytes
        !          5758:          or about 2,000 SPITBOL 'words.'
        !          5759: 
        !          5760:      7.  /MINT=nnn
        !          5761:          This  switch  controls  the amount of  virtual memory (in 512
        !          5762:          Byte pages) that will be  initally  allocated  for  SPITBOL's
        !          5763:          working   storage   areas.   The  SPITBOL  VMS  interface  is
        !          5764:          designed to  permit  these  working  storage  areas  to  grow
        !          5765: 
        !          5766: 
        !          5767:          MACRO SPITBOL V3.5
        !          5768:                                                    PAGE 91 - [11.21.1]
        !          5769:          Implementation Information
        !          5770: 
        !          5771:          indefinitely,  as  long as the region remains contiguous, and
        !          5772:          there are pages available  in  the  process'  virtual  quota.
        !          5773:          However,  SPITBOL will not request additional memory from VMS
        !          5774:          unless it cannot get  enough  by  regenerating  its  existing
        !          5775:          store.   So,  this switch may be useful in some situations to
        !          5776:          avoid garbage collector  thrashing.   The  default  for  this
        !          5777:          switch  is  "/MINT=200"  which  is  equivalent to  about 100K
        !          5778:          bytes, or 25,000 SPITBOL 'words' (VAX Longwords).
        !          5779: 
        !          5780:          For most applications, the performance  will  increase  quite
        !          5781:          dramatically  as  real  memory  is made available.  Past that
        !          5782:          point, additional working set will improve  performance  only
        !          5783:          marginally.   As  the  dynamic  space  is  allowed  to become
        !          5784:          increasingly  virtual,  performance   will   very   gradually
        !          5785:          deteriorate  because  of  the  thrashing caused (principally)
        !          5786:          during garbage collection.  Thus as a general  guide,  it  is
        !          5787:          usually  best  to  minimize garbage collection at the expense
        !          5788:          of additional memory.
        !          5789: 
        !          5790:          Stack space is not included in the  MINT  allocation.   Stack
        !          5791:          is allocated automatically as needed.
        !          5792: 
        !          5793:      8.  /OUTPUT[=Filename]
        !          5794:          The  /OUTPUT=filename  switch  requests an alternate file for
        !          5795:          the standard output  channel  at  execution  time.   If  this
        !          5796:          switch  is  not  specified, then execution output is directed
        !          5797:          at the same file  as  the  source  listing  (/LIST=filename).
        !          5798:          This  file  is not opened until execution begins.  If at that
        !          5799:          time the channel cannot  be  opened,  SPITBOL  exits  with  a
        !          5800:          fatal status.
        !          5801: 
        !          5802:          /NOOUTPUT   directs  any  execution-time  references  to  the
        !          5803:          standard output channel to the null device (NL:)
        !          5804: 
        !          5805:          /OUTPUT with no  filename  restores  the  default  condition.
        !          5806:          That is, execution output is appended to the listing output.
        !          5807: 
        !          5808:          Note that /OUTPUT and /LIST are not synonymous.
        !          5809: 
        !          5810:      9.  /PAGE /NOPAGE
        !          5811:          If  this  switch  is specified, page separators in the source
        !          5812:          listing and statistics will be a few blank lines, instead  of
        !          5813:          form  feeds.   "/PAGE"  is  the  default, unless the standard
        !          5814:          output channel (see /OUTPUT switch) is a terminal,  in  which
        !          5815:          case "/NOPAGE" is the default.
        !          5816: 
        !          5817:          At  startup,  LIB$LP_LINES  is called to get the page length.
        !          5818:          From  the  value  returned  (66  unless  the   logical   name
        !          5819:          SYS$LP_LINES  is  assigned), six  is subtracted to leave room
        !          5820:          for page shoulders.
        !          5821: 
        !          5822:     10.  /WARN /NOWARN
        !          5823:          When /NOWARN is indicated on the command  line,  only  errors
        !          5824:          and  severe  errors  in  the  VMS  interface  logic  will  be
        !          5825:          reported on  SYS$ERROR.   This  can  be  useful  to  suppress
        !          5826:          messages  regarding source line truncation, exit module saves
        !          5827: 
        !          5828: 
        !          5829:          MACRO SPITBOL V3.5
        !          5830:                                                    PAGE 92 - [11.21.1]
        !          5831:          Implementation Information
        !          5832: 
        !          5833:          and similar messages. /WARN, the  default,  causes  reporting
        !          5834:          of such conditions.
        !          5835: 
        !          5836:          This  switch does not affect in any way SPITBOL's handling of
        !          5837:          errors with respect to the program.
        !          5838: 
        !          5839:     11.  /WIDTH=nnn
        !          5840:          SPITBOL attempts to compute a proper width for  the  standard
        !          5841:          output  file.   The switch "/WIDTH=n" can be used to override
        !          5842:          any  default.    Otherwise,   if   the   output   device   is
        !          5843:          record-oriented  (including  spooled  files),  the default is
        !          5844:          the buffer for the  device  as  indicated  by  VMS.   If  the
        !          5845:          buffer  size  cannot  be  obtained,  or  is outside the range
        !          5846:          [0..255], then a final default of 132 (decimal) is applied.
        !          5847: 
        !          5848: 
        !          5849: 
        !          5850: 
        !          5851: 
        !          5852: 
        !          5853: 
        !          5854: 
        !          5855: 
        !          5856: 
        !          5857: 
        !          5858: 
        !          5859: 
        !          5860: 
        !          5861: 
        !          5862: 
        !          5863: 
        !          5864: 
        !          5865: 
        !          5866: 
        !          5867: 
        !          5868: 
        !          5869: 
        !          5870: 
        !          5871: 
        !          5872: 
        !          5873: 
        !          5874: 
        !          5875: 
        !          5876: 
        !          5877: 
        !          5878: 
        !          5879: 
        !          5880: 
        !          5881: 
        !          5882: 
        !          5883: 
        !          5884: 
        !          5885: 
        !          5886: 
        !          5887: 
        !          5888: 
        !          5889: 
        !          5890: 
        !          5891:          MACRO SPITBOL V3.5
        !          5892:                                                    PAGE 93 - [11.22]
        !          5893:          Implementation Information
        !          5894: 
        !          5895: 
        !          5896: 
        !          5897:  11.22  Stack Overflow
 11.22  Stack Overflow
 ____________ ________
        !          5898:     SPITBOL  stack  is  located  in  P0  (program)  space.   It  grows
        !          5899:     downwards  as  needed  from  LOAD_BASE  to STACK_LIMIT.  These two
        !          5900:     values are defined in the SPITBOL Link options file.  In  general,
        !          5901:     these  values  are  set  such  that stack overflow is not possible
        !          5902:     unless a program is truly out of control.
        !          5903: 
        !          5904: 
        !          5905:  11.23  TERMINAL
 11.23  TERMINAL
 _______________
        !          5906:     TERMINAL  is  available  and  is  associated  with  SYS$INPUT  and
        !          5907:     SYS$OUTPUT.   The  first  assignment  or  access to TERMINAL opens
        !          5908:     this channel.
        !          5909: 
        !          5910: 
        !          5911:  11.24  Time
 11.24  Time
 ___________
        !          5912:     All execution times in the VAX/VMS Macro  SPITBOL  system  are  in
        !          5913:     CPU  time  increments  of 10 (milliseconds).  This covers both the
        !          5914:     times shown in the statistics, and  the  time  retrieved  via  the
        !          5915:     system TIME function.  Wall time is available through DATE.
        !          5916: 
        !          5917: 
        !          5918: 
        !          5919: 
        !          5920: 
        !          5921: 
        !          5922: 
        !          5923: 
        !          5924: 
        !          5925: 
        !          5926: 
        !          5927: 
        !          5928: 
        !          5929: 
        !          5930: 
        !          5931: 
        !          5932: 
        !          5933: 
        !          5934: 
        !          5935: 
        !          5936: 
        !          5937: 
        !          5938: 
        !          5939: 
        !          5940: 
        !          5941: 
        !          5942: 
        !          5943: 
        !          5944: 
        !          5945: 
        !          5946: 
        !          5947: 
        !          5948: 
        !          5949: 
        !          5950: 
        !          5951: 
        !          5952: 
        !          5953:          MACRO SPITBOL V3.5
        !          5954:                                                    PAGE 94 - [12]
        !          5955:          Implementation Information
        !          5956: 
        !          5957: 
        !          5958: 
        !          5959:                     *--------------------------------*
        !          5960:                       [12] Installation and Delivery
                    | [12] Installation and Delivery |
        !          5961:                     *--------------------------------*
        !          5962: 
        !          5963:     This  section  of  the  SPITBOL  manual  describes the process for
        !          5964:     unpackaging and installing the  VAX/VMS  MACRO  SPITBOL  software.
        !          5965:     This  section  is  also provided in hardcopy form with the 1600BPI
        !          5966:     tape to facilitate the  installation  process.   If  this  is  the
        !          5967:     first  time  you  have performed the delivery, please read through
        !          5968:     these directions before starting;  the  delivery  process  is  not
        !          5969:     highly  automated, and there will be a number of decisions for you
        !          5970:     to make.
        !          5971: 
        !          5972:     There are four steps to be  initially  performed  to  deliver  and
        !          5973:     install the software package.
        !          5974: 
        !          5975: 
        !          5976:      1.  Get  the files from the tape into the proper directories, and
        !          5977:          link  the  interpreter.    The   directories   involved   are
        !          5978:          SYS$LIBRARY:,  SYS$HELP:,  and  SYS$SYSTEM:.  Be certain that
        !          5979:          these VMS standard logical names are  defined  to  correspond
        !          5980:          to  valid  directories  on the system disk before undertaking
        !          5981:          the software installation.
        !          5982: 
        !          5983:      2.  Establish the  VMS  environment  and  commands  necessary  to
        !          5984:          execute MACRO SPITBOL.
        !          5985: 
        !          5986:      3.  Generate  the  reference  manual  and help file.  The program
        !          5987:          which does this is a SPITBOL program, so this  serves  as  an
        !          5988:          installation checkout.
        !          5989: 
        !          5990:      4.  Delete  and/or  copy  off  any optional files which you don't
        !          5991:          want to keep.
        !          5992: 
        !          5993:     Each of these steps is now detailed in turn.
        !          5994: 
        !          5995: 
        !          5996:     NOTE:
    NOTE:
    _____ This  version  of  MACRO  SPITBOL requires version 2 of VMS.
        !          5997:     If you are running any  version  1  of  VMS  you  cannot  use  the
        !          5998:     interpreter.   You  must first upgrade your system to version 2 of
        !          5999:     VMS before attempting to install MACRO SPITBOL.
        !          6000: 
        !          6001: 
        !          6002: 
        !          6003: 
        !          6004: 
        !          6005: 
        !          6006: 
        !          6007: 
        !          6008: 
        !          6009: 
        !          6010: 
        !          6011: 
        !          6012: 
        !          6013: 
        !          6014: 
        !          6015:          MACRO SPITBOL V3.5
        !          6016:                                                    PAGE 95 - [12.1]
        !          6017:          Implementation Information
        !          6018: 
        !          6019: 
        !          6020: 
        !          6021:  12.1  Transferring Delivery Files
 12.1  Transferring Delivery Files
 __________________ ________ _____
        !          6022: 
        !          6023: 
        !          6024:     Follow these steps:
        !          6025: 
        !          6026: 
        !          6027:      1.  Log on to the hardcopy system console  using  the  privileged
        !          6028:          SYSTEM  account.   Be certain that your default is set to the
        !          6029:          system  disk.   "BYPASS"  privilege  is  recommended  as   it
        !          6030:          insures  that  there  will be no snags in renaming or copying
        !          6031:          files.
        !          6032: 
        !          6033:      2.  If there  are  any  existing  files  or  directories  for  an
        !          6034:          earlier  version  of  SPITBOL,  they should be deleted.  (The
        !          6035:          new version  is  strictly  upward  compatible  with  previous
        !          6036:          versions.)   If  it  does  not already exist, create an empty
        !          6037:          scratch directory named SYS$DISK:[SPITBOL] with the command:
        !          6038: 
        !          6039:                          $
                         _ CRE/DIR SYS$DISK:[SPITBOL]
        !          6040: 
        !          6041: 
        !          6042:      3.  Set your default to the SPITBOL directory using the command:
        !          6043: 
        !          6044:                        $
                       _ SET DEFAULT SYS$DISK:[SPITBOL]
        !          6045: 
        !          6046: 
        !          6047:      4.  Mount the delivery tape on a drive with a command such as:
        !          6048: 
        !          6049:                               $
                              _ MOUNT MT:/OVER=ID
        !          6050: 
        !          6051: 
        !          6052:      5.  Copy all files from the  tape  into  the  directory  using  a
        !          6053:          command similar to:
        !          6054: 
        !          6055:                                 $
                                _ COPY MT:*.* *
        !          6056: 
        !          6057: 
        !          6058:      6.  Dismount the tape with a command such as:
        !          6059: 
        !          6060:                                 $
                                _ DISMOUNT MT:
        !          6061: 
        !          6062: 
        !          6063:      7.  Enter the command:
        !          6064: 
        !          6065:                                   $
                                  _ @SPITBOL
        !          6066: 
        !          6067:          This   command   file  will  rename  files  to  their  proper
        !          6068:          directories, and link the interpreter image.
        !          6069: 
        !          6070:     Sites with a previous release  of  the  interpreter  may  want  to
        !          6071:     print  a  copy of [SPITBOL]RELNOTES.LIS which documents changes in
        !          6072:     this release.
        !          6073: 
        !          6074: 
        !          6075: 
        !          6076: 
        !          6077:          MACRO SPITBOL V3.5
        !          6078:                                                    PAGE 96 - [12.2]
        !          6079:          Implementation Information
        !          6080: 
        !          6081: 
        !          6082: 
        !          6083:  12.2  Installing MACRO SPITBOL
 12.2  Installing MACRO SPITBOL
 ________________ _____ _______
        !          6084: 
        !          6085: 
        !          6086:      1.  Enter the commands:
        !          6087: 
        !          6088:                     $
                    _ SPIT*BOL :== $SYS$SYSTEM:SPITBOL
        !          6089:                     $
                    _ ASSIGN/SYS "<site-name>" SYS$SITENAME
        !          6090: 
        !          6091:          In the above, "<site-name>" is  any  text  string  of  28  or
        !          6092:          fewer   characters  which  SPITBOL  will  use  for  the  site
        !          6093:          identification.
        !          6094: 
        !          6095:          Using an editor, place the first of the above definitions  in
        !          6096:          the  systemwide  login  command  file  to define them for all
        !          6097:          users.   (The  name  of  this  file  varies  from  system  to
        !          6098:          system,  SYLOGIN.COM  and  SYSLOGIN.COM  in  SYS$MANAGER:  is
        !          6099:          typical.  If your site has not established such a file,  then
        !          6100:          users   will  have  to  define  this  command  in  their  own
        !          6101:          LOGIN.COM files.)   The ASSIGN  command  should  be  inserted
        !          6102:          into SYS$MANAGER:SYSTARTUP.COM .
        !          6103: 
        !          6104:      2.  In  general,  if  SPITBOL  is  to  be  used frequently, it is
        !          6105:          recommended that it be installed as a shareable image.   This
        !          6106:          can  be  done  (from  the  SYSTEM  account) using the command
        !          6107:          lines:
        !          6108: 
        !          6109:                    $ MCR INSTALL
        !          6110:                    SYS$SYSTEM:SPITBOL.EXE/SHARE/OPEN/HEADER
        !          6111: 
        !          6112:          SPITBOL  should  not   normally   be   installed   with   any
        !          6113:          privileges.
        !          6114: 
        !          6115: 
        !          6116: 
        !          6117:  12.3  Interpreter Checkout and Documentation Generation
 12.3  Interpreter Checkout and Documentation Generation
 _________________ ________ ___ _____________ __________
        !          6118: 
        !          6119: 
        !          6120:      1.  Set your default to SYS$LIBRARY:
        !          6121: 
        !          6122:      2.  Enter the command:
        !          6123: 
        !          6124:                     $
                    _ SPIT GPMDOC " {SET INPUT,SPITBOL.GPM}
        !          6125: 
        !          6126:          Note the blank  following  the  double  quote  in  the  above
         ____ ___ _____  _________  ___  ______  _____  __  ___  _____
        !          6127:          command.  This blank is significant and must be  included  as
         ________  ____ _____ __ ___________ ___ ____ __  ________  __
        !          6128:          shown.
         ______  If all is well, this will cause the system to ask  if
        !          6129:          you  want  to  produce the manual.  Answer "yes".  Generating
        !          6130:          the approximately 100 page manual takes about  5  minutes  on
        !          6131:          an  unloaded  VAX 11/780.  If it is working, a message should
        !          6132:          appear on your console for every page produced.
        !          6133: 
        !          6134: 
        !          6135: 
        !          6136: 
        !          6137: 
        !          6138: 
        !          6139:          MACRO SPITBOL V3.5
        !          6140:                                                    PAGE 97 - [12.3]
        !          6141:          Implementation Information
        !          6142: 
        !          6143:          After this, you will be asked if you  want  to  generate  the
        !          6144:          help  file.   Again  answer  "yes".   The generated file is a
        !          6145:          reformatted  version  of  the  manual  itself,  in  VMS  help
        !          6146:          library format.
        !          6147: 
        !          6148:          When this concludes, the GPMDOC program exits.
        !          6149: 
        !          6150:      3.  Print  SYS$LIBRARY:GPMDOC.LIS  on  a  132 column line printer
        !          6151:          and examine the listing to be sure that  the  interpreter  is
        !          6152:          functioning  properly.   Look  at  the  2  line header on the
        !          6153:          first listing page and be certain  that  the  site  name  you
        !          6154:          defined above appears there.
        !          6155: 
        !          6156:      4.  Print  SYS$LIBRARY:SPITBOL.MAN on (if possible) an 80 column,
        !          6157:          8.5x11 inch, white paper printer.  An  LA120  DECwriter  will
        !          6158:          do  if there is plenty of time available.  If any interactive
        !          6159:                                                    $
         device is  used,  be  certain  to  type  "_ SET TERM/NOBROAD"
        !          6160:          before  starting.   The table of contents is at the back - it
        !          6161:          should be moved to the indicated place at the beginning.
        !          6162: 
        !          6163:      5.  You should now decide if you  want  to  add  the  SPITBOL.HLP
        !          6164:          help  file to the system help file.  (The only reason for not
        !          6165:          so doing would be that it consumes about 300 blocks  of  disk
        !          6166:          space).   If  you  decide  to  do  this,  set your default to
        !          6167:          SYS$HELP: and enter the following commands:
        !          6168: 
        !          6169:                       $
                      _ LIB/COMPR=KEYSIZ:31/HELP HELPLIB
        !          6170:                       $
                      _ LIB/REPLACE/HELP HELPLIB SPITBOL
        !          6171:                       $
                      _ LIB/COMPRESS/HELP HELPLIB
        !          6172:                       $
                      _ PURGE HELPLIB.HLB
        !          6173: 
        !          6174: 
        !          6175: 
        !          6176: 
        !          6177:  12.4  Delivery File Cleanup
 12.4  Delivery File Cleanup
 ______________ ____ _______
        !          6178: 
        !          6179: 
        !          6180:     The delivery and  installation  process  is  concluded.   At  this
        !          6181:     point,  some  sites  may  choose  to  delete some of the delivered
        !          6182:     files in order to free up as much system disk space  as  possible.
        !          6183:     To  such  an  end,  a list of all delivered and generated files is
        !          6184:     given here, grouped by  their  function.   Examine  the  list  and
        !          6185:     delete the ones you don't want.
        !          6186: 
        !          6187: 
        !          6188:      1.  BASIC INTERPRETER:
        !          6189:          Basic  interpreter  files  consist  of  the executable image,
        !          6190:          objects, and sources.
        !          6191: 
        !          6192:          The executable image  is  built  as  SYS$SYSTEM:SPITBOL.EXE .
        !          6193:          This  file must not be deleted.  Also, SYS$SYSTEM:SPITBOL.STB
        !          6194:          is the corresponding symbol table  file  which  can  be  used
        !          6195:          when  linking images for use by LOAD(...).  It should also be
        !          6196:          retained.
        !          6197: 
        !          6198: 
        !          6199: 
        !          6200: 
        !          6201:          MACRO SPITBOL V3.5
        !          6202:                                                    PAGE 98 - [12.4]
        !          6203:          Implementation Information
        !          6204: 
        !          6205:          The  objects  are  in  SYS$LIBRARY:  and  named  SPITSYS.OBJ,
        !          6206:          SPITIOSYS,  SPITGO,  SPITMSGS and SPITV35.  It is recommended
        !          6207:          that    these    files     be     kept.      In     addition,
        !          6208:          SYS$LIBRARY:SPITBOL.OPT  is the standard SPITBOL link options
        !          6209:          file and should be retained if the objects are.
        !          6210: 
        !          6211:          The sources are in SYS$LIBRARY and have  the  same  names  as
        !          6212:          the  objects  except  that the file extensions are different.
        !          6213:          SPITGO.MAR is the entry  point,  and  provides  command  line
        !          6214:          processing,   initialization   and   basic  file  assignment.
        !          6215:          SPITSYS.MAR   contains   the    VMS    interface    routines.
        !          6216:          SPITIOSYS.MAR  contains  the VMS interface routines for input
        !          6217:          and output operations.  SPITV35.MAR is  the  source  for  the
        !          6218:          interpreter  itself.  SPITMSGS.MSG is the source text for the
        !          6219:          error messages  of  the  system.  It  is  input  to  the  VMS
        !          6220:          "MESSAGE" processor.
        !          6221: 
        !          6222:          SPITMACS.MAR  and  SPITMACS.MLB  comprise  the  macro library
        !          6223:          which is required for assembling any of these sources.
        !          6224: 
        !          6225:          These source files will  be  of  academic  interest  to  most
        !          6226:          sites,  and  can  be  profitably deleted since they consume a
        !          6227:          substantial quantity of disk space.
        !          6228: 
        !          6229:      2.  INTERPRETER SUPPORT FILES:
        !          6230:          On SYS$LIBRARY: will be found SPITHLS in .OBJ and .MAR  form.
        !          6231:          These  files  are  used  in  conjunction  with  the LOAD(...)
        !          6232:          feature and should not be deleted.  In  any  event  they  are
        !          6233:          quite small.
        !          6234: 
        !          6235:      3.  DOCUMENTATION FILES:
        !          6236:          The   delivery  process  outlined  above  uses  and  produces
        !          6237:          several files that relate to MACRO SPITBOL documentation.
        !          6238: 
        !          6239:          In SYS$LIBRARY: will be found SPITBOL.GPM and  SPITTEXT.GPM .
        !          6240:          These  two  files,  together, comprise the needed information
        !          6241:          to generate both the manual and help file text.  They can  be
        !          6242:          deleted once the manual and/or help file has been produced.
        !          6243: 
        !          6244:          The    delivery    process    generates    the    manual   in
        !          6245:          SYS$LIBRARY:SPITBOL.MAN. Once a good copy of  this  has  been
        !          6246:          printed, this file can be deleted.
        !          6247: 
        !          6248:          The  help  file  text  is  produced  in SYS$HELP:SPITBOL.HLP.
        !          6249:          This should be deleted only if no use is made of it.  If  you
        !          6250:          have  added it to the system help library, keep the .HLP file
        !          6251:          in case a future VMS delivery reinitializes the  system  help
        !          6252:          file.
        !          6253: 
        !          6254:          The   delivery   process   generates  a  SPITBOL  listing  in
        !          6255:          SYS$LIBRARY:GPMDOC.LIS.  This file is of  no  value  once  it
        !          6256:          has been checked out, and can be deleted.
        !          6257: 
        !          6258: 
        !          6259: 
        !          6260: 
        !          6261: 
        !          6262: 
        !          6263:          MACRO SPITBOL V3.5
        !          6264:                                                    PAGE 99 - [12.4]
        !          6265:          Implementation Information
        !          6266: 
        !          6267:      4.  GPMDOC:
        !          6268:          GPMDOC  is  the  text processing program (written in SPITBOL)
        !          6269:          that produces the manual and  help  text  files.   It  is  an
        !          6270:          interesting  program  in  its  own right, and for that reason
        !          6271:          you may wish to keep it.  Otherwise, all of the GPMDOC  files
        !          6272:          can be deleted, they are in SYS$LIBRARY:
        !          6273: 
        !          6274:          GPMDOC.SPT is the basic GPMDOC program source.
        !          6275: 
        !          6276:          GPMBIF.GPM  is  a  file  of  auxiliary  definitions needed by
        !          6277:          GPMDOC when it starts up.
        !          6278: 
        !          6279:          GPMDOC.GPM  is  part  of  the  reference  documentation   for
        !          6280:          GPMDOC.   To  generate this documentation, set the default to
        !          6281:          SYS$LIBRARY: and enter the commands:
        !          6282: 
        !          6283:               $
              _ SPIT GPMDOC -
        !          6284:               $
              __ " {SET OUTPUT,GPMDOC.MAN}{SET INPUT,GPMDOC.GPM}
        !          6285:               $
              _ PRINT/DELETE GPMDOC.MAN
        !          6286:               $
              _ DELETE GPMDOC.LIS;*
        !          6287: 
        !          6288: 
        !          6289:          JUSTIFY (.FOR, .OBJ, .EXE and .OPT) is a LOAD image  used  by
        !          6290:          GPMDOC  that   performs  right-justification of text strings.
        !          6291:          It is not essential to the operation  of  GPMDOC  (though  it
        !          6292:          runs  slightly  faster  with it.)  However, JUSTIFY is a good
        !          6293:          example of use of the LOAD(...) function feature, and  should
        !          6294:          be retained for that reason.
        !          6295: 
        !          6296:      5.  MISCELLANEOUS FILES:
        !          6297:          The  file  [SPITBOL]SPITBOL.COM  and  it's  scratch directory
        !          6298:          [SPITBOL]  are  of  no  use  once  the  delivery   has   been
        !          6299:          successfully   completed,   and  should  be  deleted.    This
        !          6300:          directory also contains RELNOTES.LIS.   These  release  notes
        !          6301:          are  primarily  directed  at sites with an earlier release of
        !          6302:          the system, and may be kept or deleted as desired.
        !          6303: 
        !          6304:          SYS$LIBRARY:DIF.SPT is a file comparator program  similar  to
        !          6305:          the   PDP-11  "CMP"  program.   It  runs significantly faster
        !          6306:          and, in  most  cases,  more  accurately  than  the  V2.4  VMS
        !          6307:          "DIFFERENCES"  command and for that reason may be of value to
        !          6308:          some sites.  The command format for DIF is described  in  its
        !          6309:          source.
        !          6310: 
        !          6311: 
        !          6312: 
        !          6313: 
        !          6314: 
        !          6315: 
        !          6316: 
        !          6317: 
        !          6318: 
        !          6319: 
        !          6320: 
        !          6321: 
        !          6322: 
        !          6323: 
        !          6324: 
        !          6325: 
        !          6326: 
        !          6327: 
        !          6328:     ! ...................................... 16, 17
        !          6329:     $ ...................................... 16, 56, 57, 58
        !          6330:     $SEVERITY .............................. 75
        !          6331:     $STATUS ................................ 75
        !          6332:     % ...................................... 16
        !          6333:     & ...................................... 16
        !          6334: 
        !          6335:     &ABEND ................................. 43
        !          6336:     &ABORT ................................. 43
        !          6337:     &ALPHABET .............................. 43, 58
        !          6338:     &ANCHOR ................................ 4, 43, 57
        !          6339:     &ARB ................................... 43
        !          6340: 
        !          6341:     &BAL ................................... 43
        !          6342:     &CODE .................................. 43, 71
        !          6343:     &DUMP .................................. 43
        !          6344:     &ERRLIMIT .............................. 44
        !          6345:     &ERRTEXT ............................... 5, 21, 25, 38, 44, 71, 88
        !          6346: 
        !          6347:     &ERRTYPE ............................... 38, 44
        !          6348:     &FAIL .................................. 44
        !          6349:     &FENCE ................................. 44
        !          6350:     &FNCLEVEL .............................. 38, 44
        !          6351:     &FTRACE ................................ 44
        !          6352: 
        !          6353:     &FULLSCAN .............................. 3
        !          6354:     &INPUT ................................. 44
        !          6355:     &LASTNO ................................ 44
        !          6356:     &MAXLNGTH .............................. 5, 9, 44, 90
        !          6357:     &OUTPUT ................................ 44
        !          6358: 
        !          6359:     &PROFILE ............................... 5, 44
        !          6360:     &REM ................................... 45
        !          6361:     &RTNTYPE ............................... 45
        !          6362:     &STCOUNT ............................... 45
        !          6363:     &STFCOUNT .............................. 3
        !          6364: 
        !          6365:     &STLIMIT ............................... 6, 42, 45, 71
        !          6366:     &STNO .................................. 45
        !          6367:     &SUCCEED ............................... 45
        !          6368:     &TRACE ................................. 45
        !          6369:     &TRIM .................................. 5, 45, 57, 71
        !          6370: 
        !          6371:     * ...................................... 16, 57
        !          6372:     + ...................................... 16
        !          6373:     - ...................................... 16
        !          6374:     -DOUBLE ................................ 48
        !          6375:     -EJECT ................................. 46
        !          6376: 
        !          6377: 
        !          6378: 
        !          6379: 
        !          6380: 
        !          6381: 
        !          6382:                                      Index - i
        !          6383: 
        !          6384: 
        !          6385: 
        !          6386: 
        !          6387: 
        !          6388:     -EXECUTE ............................... 49
        !          6389:     -FAIL .................................. 49
        !          6390:     -IN .................................... 49
        !          6391:     -LIST .................................. 21, 48
        !          6392:     -NOERRORS .............................. 49, 50
        !          6393:     -NOEXECUTE ............................. 49, 89
        !          6394: 
        !          6395:     -NOFAIL ................................ 25, 49
        !          6396:     -NOLIST ................................ 48
        !          6397:     -NOPRINT ............................... 48
        !          6398:     -PRINT ................................. 48
        !          6399:     -SINGLE ................................ 48
        !          6400: 
        !          6401:     -SPACE ................................. 46
        !          6402:     -TITLE ................................. 46
        !          6403:     . ...................................... 16, 57
        !          6404:     .EXE ................................... 83
        !          6405:     .SEX ................................... 77
        !          6406: 
        !          6407:     .SPT ................................... 87
        !          6408:     / ...................................... 16
        !          6409:     /CCO ................................... 80
        !          6410:     /CIF ................................... 80
        !          6411:     /CR .................................... 80
        !          6412: 
        !          6413:     /CRC ................................... 89
        !          6414:     /CSTATS ................................ 89
        !          6415:     /DLT ................................... 80
        !          6416:     /EOF ................................... 80
        !          6417:     /ESTATS ................................ 89
        !          6418: 
        !          6419:     /EXECUTE ............................... 89
        !          6420:     /FTN ................................... 80
        !          6421:     /LIST .................................. 89
        !          6422:     /LOAD .................................. 71, 77
        !          6423:     /MINC .................................. 77, 90
        !          6424: 
        !          6425:     /MINT .................................. 77, 90
        !          6426:     /MXV ................................... 80
        !          6427:     /NOCRC ................................. 89
        !          6428:     /NOCSTATS .............................. 89
        !          6429:     /NOESTATS .............................. 89
        !          6430: 
        !          6431:     /NOEXECUTE ............................. 89
        !          6432:     /NOLIST ................................ 89
        !          6433:     /NOOUTPUT .............................. 91
        !          6434:     /NOPAGE ................................ 91
        !          6435:     /NOWARN ................................ 75, 91
        !          6436: 
        !          6437: 
        !          6438: 
        !          6439: 
        !          6440: 
        !          6441: 
        !          6442:                                      Index - ii
        !          6443: 
        !          6444: 
        !          6445: 
        !          6446: 
        !          6447: 
        !          6448:     /OUTPUT ................................ 91
        !          6449:     /PAGE .................................. 91
        !          6450:     /PTA ................................... 80
        !          6451:     /RNE ................................... 80
        !          6452:     /RNF ................................... 80
        !          6453:     /SCF ................................... 80
        !          6454: 
        !          6455:     /SPL ................................... 80
        !          6456:     /SUP ................................... 80
        !          6457:     /TEF ................................... 80
        !          6458:     /WARN .................................. 91
        !          6459:     /WIDTH ................................. 92
        !          6460: 
        !          6461:     <> ..................................... 7
        !          6462:     = ...................................... 6, 7, 16
        !          6463:     ? ...................................... 6, 7, 16, 58
        !          6464:     @ ...................................... 16
        !          6465:     ABEND .................................. 43, 43
        !          6466: 
        !          6467:     ABORT .................................. 4, 38, 43
        !          6468:     ALTERNATION ............................ 73
        !          6469:     ALTERNATIVE ............................ 5, 7
        !          6470:     ANCHOR ................................. 43
        !          6471:     ANCHORED MATCHING ...................... 57
        !          6472: 
        !          6473:     ANY .................................... 18, 56, 58
        !          6474:     APPEND ................................. 5, 10, 18, 57
        !          6475:     APPLY .................................. 18
        !          6476:     ARB .................................... 4, 20, 43, 58
        !          6477:     ARBNO .................................. 19, 58
        !          6478: 
        !          6479:     ARG .................................... 19
        !          6480:     ARRAY .................................. 9, 15, 18, 19, 39, 41
        !          6481:     ARRAYS ................................. 19, 56, 57
        !          6482:     ASSOCIATIVE LOOKUP ..................... 57
        !          6483:     BACKSPACE .............................. 3
        !          6484: 
        !          6485:     BAL .................................... 4, 43
        !          6486:     BLOCK .................................. 3
        !          6487:     BREAK .................................. 19, 56, 58
        !          6488:     BREAKX ................................. 5, 20, 56, 58
        !          6489:     BUFFER ................................. 5, 20
        !          6490: 
        !          6491:     BUFFERS ................................ 6, 10, 30, 57, 57, 58, 72
        !          6492:     CHAR ................................... 5, 21
        !          6493:     CHARACTER SET .......................... 6, 73, 87
        !          6494:     CLEAR .................................. 21
        !          6495:     CLI .................................... 88
        !          6496: 
        !          6497: 
        !          6498: 
        !          6499: 
        !          6500: 
        !          6501: 
        !          6502:                                     Index - iii
        !          6503: 
        !          6504: 
        !          6505: 
        !          6506: 
        !          6507: 
        !          6508:     CMP .................................... 99
        !          6509:     CODE ................................... 10, 21, 38, 56
        !          6510:     CODE BLOCKS ............................ 56
        !          6511:     COLLECT ................................ 22, 57
        !          6512:     COMMAND LINE ........................... 87
        !          6513:     CONDITION HANDLERS ..................... 85
        !          6514: 
        !          6515:     CONTINUE ............................... 38
        !          6516:     CONTROL CARDS .......................... 6, 46
        !          6517:     CONVERT ................................ 5, 22, 39
        !          6518:     COPY ................................... 22
        !          6519:     CPU TIME ............................... 93
        !          6520: 
        !          6521:     DATA ................................... 18, 23, 39
        !          6522:     DATATYPE ............................... 4, 23
        !          6523:     DATATYPE CONVERSIONS ................... 4, 11, 12, 58
        !          6524:     DATE ................................... 23, 75
        !          6525:     DCL .................................... 75
        !          6526: 
        !          6527:     DEBUGGING .............................. 42, 58, 83
        !          6528:     DEFERRED EXPRESSION .................... 58, 65
        !          6529:     DEFINE ................................. 18, 23
        !          6530:     DELIVERY ............................... 94
        !          6531:     DETACH ................................. 23, 58
        !          6532: 
        !          6533:     DIF.SPT ................................ 99
        !          6534:     DIFFER ................................. 4, 24
        !          6535:     DUMP ................................... 5, 24
        !          6536:     DUPL ................................... 24
        !          6537:     EBCDIC ................................. 73
        !          6538: 
        !          6539:     EJECT .................................. 5, 24, 79
        !          6540:     END .................................... 4
        !          6541:     ENDFILE ................................ 25, 79
        !          6542:     ERRORS ................................. 50, 75
        !          6543:     EVAL ................................... 25, 38
        !          6544: 
        !          6545:     EXIT ................................... 5, 25, 71, 77
        !          6546:     EXPRESSION ............................. 10
        !          6547:     FAIL ................................... 4, 44
        !          6548:     FENCE .................................. 4, 27, 44, 78
        !          6549:     FIELD .................................. 27
        !          6550: 
        !          6551:     FRETURN ................................ 38
        !          6552:     FULLSCAN ............................... 3
        !          6553:     FUNCTION ............................... 56
        !          6554:     FUNCTIONS .............................. 18
        !          6555:     GARBAGE COLLECTION ..................... 5, 22, 25, 56, 91
        !          6556: 
        !          6557: 
        !          6558: 
        !          6559: 
        !          6560: 
        !          6561: 
        !          6562:                                      Index - iv
        !          6563: 
        !          6564: 
        !          6565: 
        !          6566: 
        !          6567: 
        !          6568:     GE ..................................... 27
        !          6569:     GORILLA ................................ 85
        !          6570:     GOTOS .................................. 6
        !          6571:     GPMDOC ................................. 96, 99
        !          6572:     GT ..................................... 27
        !          6573:     HASH ................................... 56
        !          6574: 
        !          6575:     HASHING ................................ 4, 41, 57
        !          6576:     HELP LIBRARY ........................... 97
        !          6577:     HOST ................................... 5, 27, 78
        !          6578:     I/O .................................... 79
        !          6579:     I/O ASSOCIATION ........................ 58
        !          6580: 
        !          6581:     I/O SWITCHES ........................... 79
        !          6582:     IBM .................................... 1, 73
        !          6583:     IDENT .................................. 4, 28
        !          6584:     IF-THEN-ELSE ........................... 7
        !          6585:     INPUT .................................. 23, 25, 29, 36, 77, 79
        !          6586: 
        !          6587:     INSERT ................................. 5, 10, 30, 57
        !          6588:     INSTALL ................................ 96
        !          6589:     INSTALLATION ........................... 94, 96
        !          6590:     INTEGER ................................ 9, 14, 31, 39
        !          6591:     INTEGERS ............................... 56, 78
        !          6592: 
        !          6593:     INTERROGATION .......................... 58
        !          6594:     ITEM ................................... 7, 31
        !          6595:     JUSTIFY ................................ 99
        !          6596:     KEYWORDS ............................... 43
        !          6597:     LABEL .................................. 56
        !          6598: 
        !          6599:     LE ..................................... 31
        !          6600:     LEN .................................... 32
        !          6601:     LEQ .................................... 5, 32
        !          6602:     LGE .................................... 5, 32
        !          6603:     LGT .................................... 32
        !          6604: 
        !          6605:     LIB$LP_LINES ........................... 91
        !          6606:     LINKER ................................. 82, 82, 87
        !          6607:     LISTING ................................ 46
        !          6608:     LISTING OPTIONS ........................ 82
        !          6609:     LLE .................................... 5, 32
        !          6610: 
        !          6611:     LLT .................................... 5, 33
        !          6612:     LNE .................................... 5, 33
        !          6613:     LOAD ................................... 33, 77, 77, 83, 99
        !          6614:     LOAD MODULE ............................ 25
        !          6615:     LOAD_BASE .............................. 82, 85, 86, 93
        !          6616: 
        !          6617: 
        !          6618: 
        !          6619: 
        !          6620: 
        !          6621: 
        !          6622:                                      Index - v
        !          6623: 
        !          6624: 
        !          6625: 
        !          6626: 
        !          6627: 
        !          6628:     LOCAL .................................. 33
        !          6629:     LONGWORD ............................... 91
        !          6630:     LPAD ................................... 5, 34
        !          6631:     LT ..................................... 34
        !          6632:     MACRO-32 ............................... 83
        !          6633:     MATRIX ................................. 39
        !          6634: 
        !          6635:     MAXIMUM SIZE ........................... 5
        !          6636:     MXLEN .................................. 5, 9, 9, 9, 43, 44, 87, 90
        !          6637:     NAME ................................... 4, 9, 15, 39, 58
        !          6638:     NE ..................................... 34
        !          6639:     NL: .................................... 77
        !          6640: 
        !          6641:     NOTANY ................................. 34, 56, 58
        !          6642:     NRETURN ................................ 38
        !          6643:     NULL STRING ............................ 39
        !          6644:     NUMERIC ................................ 4, 39
        !          6645:     ON-LINE TERMINAL ....................... 6
        !          6646: 
        !          6647:     OPERATORS .............................. 16
        !          6648:     OPSYN .................................. 35, 73
        !          6649:     OPTIONS FILE ........................... 82
        !          6650:     OUTPUT ................................. 23, 24, 25, 29, 35, 36,
        !          6651:                                             77, 79
        !          6652: 
        !          6653:     P0BUFS ................................. 90
        !          6654:     PATTERN ................................ 9
        !          6655:     PATTERN MATCHING OPERATOR .............. 6
        !          6656:     PATTERN REPLACEMENT .................... 57
        !          6657:     PIC .................................... 85, 85, 86
        !          6658: 
        !          6659:     POS .................................... 35
        !          6660:     POSITION INDEPENDENCE .................. 85, 85
        !          6661:     PRE-EVALUATION ......................... 3, 5, 57, 65
        !          6662:     PROGRAM DEFINED DATATYPES .............. 23, 56, 57
        !          6663:     PROTOTYPE .............................. 36
        !          6664: 
        !          6665:     PUNCH .................................. 3
        !          6666:     QUICKSCAN .............................. 3
        !          6667:     REAL ................................... 9, 14, 39
        !          6668:     REAL ARITHMETIC ........................ 3, 87
        !          6669:     REALS .................................. 56
        !          6670: 
        !          6671:     RELEASE NOTES .......................... 99
        !          6672:     RELNOTES.LIS ........................... 99
        !          6673:     REM .................................... 4, 45
        !          6674:     REMDR .................................. 36
        !          6675:     REPLACE ................................ 36, 58
        !          6676: 
        !          6677: 
        !          6678: 
        !          6679: 
        !          6680: 
        !          6681: 
        !          6682:                                      Index - vi
        !          6683: 
        !          6684: 
        !          6685: 
        !          6686: 
        !          6687: 
        !          6688:     RETURN ................................. 38
        !          6689:     REVERSE ................................ 5, 36
        !          6690:     REWIND ................................. 36, 79, 87
        !          6691:     RMS .................................... 79, 90
        !          6692:     RPAD ................................... 5, 37
        !          6693:     RPOS ................................... 37
        !          6694: 
        !          6695:     RSORT .................................. 5, 6, 37, 39, 58
        !          6696:     RTAB ................................... 37
        !          6697:     SELECTION .............................. 5, 7
        !          6698:     SETEXIT ................................ 4, 5, 21, 25, 38, 44, 44
        !          6699:     SHAREABLE IMAGE ........................ 96
        !          6700: 
        !          6701:     SIZE ................................... 39
        !          6702:     SNOBOL4 ................................ 73
        !          6703:     SNOBOL4B ............................... 3
        !          6704:     SORT ................................... 5, 6, 39, 58
        !          6705:     SPACE OVERHEAD ......................... 56
        !          6706: 
        !          6707:     SPAN ................................... 40, 56, 58
        !          6708:     SPEED CONSIDERATIONS ................... 57
        !          6709:     SPIT$FAIL_RETURN ....................... 85
        !          6710:     SPIT$LOAD_ENTRY ........................ 84
        !          6711:     SPIT$SUCCESS_RETURN .................... 85
        !          6712: 
        !          6713:     SPITHLS ................................ 84, 85, 85
        !          6714:     STACK .................................. 91
        !          6715:     STACK OVERFLOW ......................... 93
        !          6716:     STACK_LIMIT ............................ 93
        !          6717:     STITL .................................. 47
        !          6718: 
        !          6719:     STOPTR ................................. 40, 58
        !          6720:     STRING ................................. 9, 12
        !          6721:     SUBSTR ................................. 5, 41
        !          6722:     SUCCEED ................................ 4, 45
        !          6723:     SWITCHES ............................... 87
        !          6724: 
        !          6725:     SYS$HELP ............................... 94
        !          6726:     SYS$INPUT .............................. 87
        !          6727:     SYS$LIBRARY ............................ 82, 84, 85, 85, 94
        !          6728:     SYS$LIBRARY: ........................... 98
        !          6729:     SYS$LP_LINES ........................... 91
        !          6730: 
        !          6731:     SYS$SITENAME ........................... 96
        !          6732:     SYS$SYSTEM ............................. 85, 94
        !          6733:     SYSLOGIN.COM ........................... 96
        !          6734:     SYSTARTUP.COM .......................... 96
        !          6735:     TAB .................................... 41
        !          6736: 
        !          6737: 
        !          6738: 
        !          6739: 
        !          6740: 
        !          6741: 
        !          6742:                                     Index - vii
        !          6743: 
        !          6744: 
        !          6745: 
        !          6746: 
        !          6747: 
        !          6748:     TAB CHARACTER .......................... 6
        !          6749:     TABLE .................................. 4, 4, 9, 15, 39, 39, 41,
        !          6750:                                             56, 57
        !          6751:     TABLES ................................. 56, 57
        !          6752:     TERMINAL ............................... 6, 93
        !          6753:     TERMINAL I/O ........................... 80
        !          6754: 
        !          6755:     TIME ................................... 42, 93
        !          6756:     TRACE .................................. 5, 42
        !          6757:     TRACING ................................ 58
        !          6758:     TRIM ................................... 42
        !          6759:     UNANCHORED MODE ........................ 57
        !          6760: 
        !          6761:     UNIVAC ................................. 1
        !          6762:     UNLOAD ................................. 42
        !          6763:     VALUE .................................. 3
        !          6764:     VARIABLE ............................... 56
        !          6765:     VECTOR ................................. 39
        !          6766: 
        !          6767:     VECTORS ................................ 19, 56
        !          6768:     VMS .................................... 94
        !          6769:     WORD ................................... 91
        !          6770:     [] ..................................... 7
        !          6771:     | ...................................... 17
        !          6772: 
        !          6773:     ~ ...................................... 16, 16
        !          6774: 
        !          6775: 
        !          6776: 
        !          6777: 
        !          6778: 
        !          6779: 
        !          6780: 
        !          6781: 
        !          6782: 
        !          6783: 
        !          6784: 
        !          6785: 
        !          6786: 
        !          6787: 
        !          6788: 
        !          6789: 
        !          6790: 
        !          6791: 
        !          6792: 
        !          6793: 
        !          6794: 
        !          6795: 
        !          6796: 
        !          6797: 
        !          6798: 
        !          6799: 
        !          6800: 
        !          6801: 
        !          6802:                                     Index - viii
        !          6803: 
        !          6804: 
        !          6805:                                  TABLE OF CONTENTS
                                 _____ __ ________
        !          6806: 
        !          6807: 
        !          6808:          Section                        Title
        !          6809:          Page
        !          6810: 
        !          6811: 
        !          6812: 
        !          6813:               Introduction
    1         Introduction                                          1
        !          6814: 
        !          6815:               Summary of Differences
    2         Summary of Differences                                3
        !          6816:     2.1         Features not Implemented                            3
        !          6817:     2.2         Features Implemented Differently                    4
        !          6818:     2.3         Additional Features                                 5
        !          6819:     2.4         Syntax Differences                                  7
        !          6820: 
        !          6821:               Datatypes and Conversion
    3         Datatypes and Conversion                              9
        !          6822:     3.1         Available Datatypes                                 9
        !          6823:     3.2         Possible Datatype Conversions                       11
        !          6824:     3.3         Conversion Details                                  12
        !          6825: 
        !          6826:               Operators
    4         Operators                                             16
        !          6827:     4.1         Unary Operators                                     16
        !          6828:     4.2         Binary Operators                                    17
        !          6829: 
        !          6830:               Functions
    5         Functions                                             18
        !          6831:     5.1         ANY -- Pattern to Match Selected Character          18
        !          6832:     5.2         APPEND * -- Append string to buffer                 18
        !          6833:     5.3         APPLY * -- Apply function                           18
        !          6834:     5.4         ARBNO -- Pattern for Iterated Match                 19
        !          6835:     5.5         ARG * -- Obtain Argument Name                       19
        !          6836:     5.6         ARRAY -- Generate Array Structure                   19
        !          6837:     5.7         BREAK -- Construct Scanning Pattern                 19
        !          6838:     5.8         BUFFER * -- Create buffer object                    20
        !          6839:     5.9         BREAKX * -- Construct Scanning Pattern              20
        !          6840:     5.10        CHAR * -- Convert Character Code to String          21
        !          6841:     5.11        CLEAR * -- Clear Variable Storage                   21
        !          6842:     5.12        CODE * -- Compile Code                              21
        !          6843:     5.13        COLLECT -- Initiate Storage Regeneration            22
        !          6844:     5.14        CONVERT * -- Convert Datatypes                      22
        !          6845:     5.15        COPY * -- Copy Structure                            22
        !          6846:     5.16        DATA -- Create Datatype                             23
        !          6847:     5.17        DATATYPE * -- Obtain Datatype                       23
        !          6848:     5.18        DATE * -- Obtain Date                               23
        !          6849:     5.19        DEFINE -- Define a Function                         23
        !          6850:     5.20        DETACH -- Detach I/O Association                    23
        !          6851:     5.21        DIFFER * -- Test for Arguments Differing            24
        !          6852:     5.22        DUMP * -- Dump Storage                              24
        !          6853:     5.23        DUPL * -- Duplicate String or Pattern               24
        !          6854:     5.24        EJECT * -- Eject to new page                        24
        !          6855:     5.25        ENDFILE * -- Close a File                           25
        !          6856:     5.26        EQ -- Test for Equal                                25
        !          6857:     5.27        EVAL * -- Evaluate Expression                       25
        !          6858:     5.28        EXIT * -- Exit to Save Load Module or to JCL        25
        !          6859:     5.29        FENCE * -- Generate Fenced Pattern                  27
        !          6860: 
        !          6861: 
        !          6862:                                          i
        !          6863: 
        !          6864: 
        !          6865:                              TABLE OF CONTENTS (CON'T)
                             _____ __ ________ _______
        !          6866: 
        !          6867: 
        !          6868:          Section                        Title
        !          6869:          Page
        !          6870: 
        !          6871:     5.30        FIELD * -- Get Field Name                           27
        !          6872:     5.31        GE -- Test for Greater or Equal                     27
        !          6873:     5.32        GT -- Test for Greater                              27
        !          6874:     5.33        HOST * -- Obtain Information about Host Computer    28
        !          6875:     5.34        IDENT * -- Test for Identical                       28
        !          6876:     5.35        INPUT * -- Set Input Association                    29
        !          6877:     5.36        INSERT * -- Insert string in buffer                 30
        !          6878:     5.37        INTEGER * -- Test for Integer                       31
        !          6879:     5.38        ITEM -- Select Array or Table Element               31
        !          6880:     5.39        LE -- Test for Less or Equal                        31
        !          6881:     5.40        LEN -- Generate Specified Length Pattern            32
        !          6882:     5.41        LEQ * -- Test for Lexically Equal                   32
        !          6883:     5.42        LGE * -- Test for Lexically Greater or Equal        32
        !          6884:     5.43        LGT * -- Test for Lexically Greater                 32
        !          6885:     5.44        LLE * -- Test for Lexically Less or Equal           32
        !          6886:     5.45        LLT * -- Test for Lexically Less                    33
        !          6887:     5.46        LNE * -- Test for Lexically Not Equal               33
        !          6888:     5.47        LOAD -- Load External Function                      33
        !          6889:     5.48        LOCAL * -- Get Name of Local                        33
        !          6890:     5.49        LPAD * -- Left Pad                                  34
        !          6891:     5.50        LT -- Test for Less                                 34
        !          6892:     5.51        NE -- Test for Not Equal                            34
        !          6893:     5.52        NOTANY -- Build Character Select Pattern            34
        !          6894:     5.53        OPSYN * -- Equate Functions and Operators           35
        !          6895:     5.54        OUTPUT * -- Set Output Association                  35
        !          6896:     5.55        POS -- Define Positioning Pattern                   35
        !          6897:     5.56        PROTOTYPE -- Retrieve Prototype                     36
        !          6898:     5.57        REMDR -- Remainder                                  36
        !          6899:     5.58        REPLACE -- Translate Characters                     36
        !          6900:     5.59        REVERSE * -- Reverse String                         36
        !          6901:     5.60        REWIND -- Reposition File                           36
        !          6902:     5.61        RPAD * -- Right Pad                                 37
        !          6903:     5.62        RPOS -- Define Positioning Pattern                  37
        !          6904:     5.63        RSORT -- Reverse Sort                               37
        !          6905:     5.64        RTAB -- Create Tabbing Pattern                      37
        !          6906:     5.65        SETEXIT * -- Set Error Exit                         38
        !          6907:     5.66        SIZE -- Get String or Buffer Size                   39
        !          6908:     5.67        SORT * -- Sort                                      39
        !          6909:     5.68        SPAN -- Create Spanning Pattern                     40
        !          6910:     5.69        STOPTR * -- Stop Trace                              40
        !          6911:     5.70        SUBSTR * -- Extract Substring                       41
        !          6912:     5.71        TAB -- Create Tabbing Pattern                       41
        !          6913:     5.72        TABLE * -- Create Table                             41
        !          6914:     5.73        TIME -- Get Timer Value                             42
        !          6915:     5.74        TRACE * -- Initiate Trace                           42
        !          6916:     5.75        TRIM -- Trim Trailing Blanks                        42
        !          6917:     5.76        UNLOAD * -- Unload Function                         42
        !          6918: 
        !          6919:               Keywords
    6         Keywords                                              43
        !          6920: 
        !          6921: 
        !          6922:                                          ii
        !          6923: 
        !          6924: 
        !          6925:                              TABLE OF CONTENTS (CON'T)
                             _____ __ ________ _______
        !          6926: 
        !          6927: 
        !          6928:          Section                        Title
        !          6929:          Page
        !          6930: 
        !          6931: 
        !          6932:               Program Listing and Control Cards
    7         Program Listing and Control Cards                     46
        !          6933:     7.1         Listing Control Cards                               46
        !          6934:     7.1.1         -EJECT                                            46
        !          6935:     7.1.2         -SPACE                                            46
        !          6936:     7.1.3         -TITLE                                            47
        !          6937:     7.1.4         -STITL                                            47
        !          6938:     7.2         Option Control Cards                                48
        !          6939:     7.2.1         -LIST -NOLIST                                     48
        !          6940:     7.2.2         -NOPRINT -PRINT                                   48
        !          6941:     7.2.3         -SINGLE -DOUBLE                                   48
        !          6942:     7.2.4         -INXXX                                            49
        !          6943:     7.2.5         -ERRORS -NOERRORS                                 49
        !          6944:     7.2.6         -FAIL -NOFAIL                                     49
        !          6945:     7.2.7         -EXECUTE -NOEXECUTE                               49
        !          6946: 
        !          6947:               Errors
    8         Errors                                                50
        !          6948:     8.1         Compilation Error Messages                          50
        !          6949:     8.2         Execution Error Messages                            50
        !          6950:     8.3         Error Codes and Messages                            50
        !          6951: 
        !          6952:               Programming Notes
    9         Programming Notes                                     56
        !          6953:     9.1         Space Considerations                                56
        !          6954:     9.2         Speed Considerations                                57
        !          6955:     9.3         Other Notes                                         58
        !          6956: 
        !          6957:               Specimen Programs
    10        Specimen Programs                                     59
        !          6958:     10.1        Program 1                                           59
        !          6959:     10.2        Program 2                                           61
        !          6960:     10.3        Program 3                                           65
        !          6961:     10.4        Program 4                                           68
        !          6962: 
        !          6963:               Implementation Information
    11        Implementation Information                            71
        !          6964:     11.1        &CODE                                               71
        !          6965:     11.2        &ERRTEXT                                            71
        !          6966:     11.3        &STLIMIT                                            71
        !          6967:     11.4        &TRIM                                               72
        !          6968:     11.5        Buffers                                             72
        !          6969:     11.6        Character Set for VAX/VMS SPITBOL                   73
        !          6970:     11.7        Form of DATE String                                 75
        !          6971:     11.8        Errors                                              75
        !          6972:     11.9        EXIT Function Usage                                 77
        !          6973:     11.9.1        EXIT(0) Usage                                     77
        !          6974:     11.9.2        EXIT(String) Usage                                77
        !          6975:     11.9.3        EXIT(-n) Usage                                    77
        !          6976:     11.10       FENCE(PATTERN)                                      78
        !          6977:     11.11       HOST                                                78
        !          6978:     11.12       Range of Integers                                   78
        !          6979:     11.13       INPUT/OUTPUT                                        79
        !          6980: 
        !          6981: 
        !          6982:                                         iii
        !          6983: 
        !          6984: 
        !          6985:                              TABLE OF CONTENTS (CON'T)
                             _____ __ ________ _______
        !          6986: 
        !          6987: 
        !          6988:          Section                        Title
        !          6989:          Page
        !          6990: 
        !          6991:     11.13.1       FILEARG2 SWITCHES                                 80
        !          6992:     11.13.2       I/O EXAMPLES                                      81
        !          6993:     11.14       Linking SPITBOL                                     82
        !          6994:     11.15       Terminal Listing Options                            82
        !          6995:     11.16       LOAD Function Usage                                 83
        !          6996:     11.16.1       High-Level Languages and LOAD                     84
        !          6997:     11.16.2       Calling Conventions for LOAD                      84
        !          6998:     11.16.3       Return Conventions for LOAD                       84
        !          6999:     11.16.4       Linking External Functions                        85
        !          7000:     11.16.5       Unconverted Values and Results for LOAD           86
        !          7001:     11.17       MXLEN                                               87
        !          7002:     11.18       Real Arithmetic                                     87
        !          7003:     11.19       Extended Character Set                              87
        !          7004:     11.20       REWIND                                              87
        !          7005:     11.21       Running SPITBOL                                     87
        !          7006:     11.21.1       Startup Switches                                  89
        !          7007:     11.22       Stack Overflow                                      93
        !          7008:     11.23       TERMINAL                                            93
        !          7009:     11.24       Time                                                93
        !          7010: 
        !          7011:               Installation and Delivery
    12        Installation and Delivery                             94
        !          7012:     12.1        Transferring Delivery Files                         95
        !          7013:     12.2        Installing MACRO SPITBOL                            96
        !          7014:     12.3        Interpreter Checkout and Documentation Generation   96
        !          7015:     12.4        Delivery File Cleanup                               97
        !          7016: 
        !          7017: 
        !          7018: 
        !          7019: 
        !          7020: 
        !          7021: 
        !          7022: 
        !          7023: 
        !          7024: 
        !          7025: 
        !          7026: 
        !          7027: 
        !          7028: 
        !          7029: 
        !          7030: 
        !          7031: 
        !          7032: 
        !          7033: 
        !          7034: 
        !          7035: 
        !          7036: 
        !          7037: 
        !          7038: 
        !          7039: 
        !          7040: 
        !          7041: 
        !          7042:                                          iv
        !          7043: 
        !          7044: 
        !          7045: 
        !          7046: 
        !          7047: 
        !          7048: 
        !          7049: 
        !          7050: 
        !          7051: 
        !          7052: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.