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