1
0
mirror of https://github.com/retro-software/B5500-software.git synced 2026-03-02 17:44:40 +00:00
Files
Paul Kimpel 2c72f7fd1d Commit CUBE Library version 13 of February 1972.
1. Commit library tape images, directories, and extracted text files.
2. Commit additional utilities under Unisys-Emode-Tools.
2018-05-27 11:24:23 -07:00

3969 lines
314 KiB
Plaintext

%PL 78 FOR 8 LINES/INCH. 00001000
B5500 SNOBOL3 MANUAL. 00002000
00003000
00004000
00005000
00006000
00007000
00008000
00009000
00010000
00011000
00012000
JOHN M. CHAMBERS 00013000
COMPUTER SCIENCES DEPT. 00014000
1210 W. DAYTON STREET 00015000
UNIVERSITY OF WISCONSIN 00016000
MADISON, WISCONSIN 53706 00017000
00018000
00019000
%SECTION "CONTENTS." 00020000
%PAGE 1 00021000
CONTENTS: 00022000
00023000
1. INTRODUCTION 00024000
2. CONTROL CARDS 00025000
2.1. MCP CONTROL CARDS. 00026000
2.2. SNOBOL CONTROL CARDS. 00027000
3. PROGRAM ORGANIZATION. 00028000
3.1. INSTRUCTIONS. 00029000
3.2 PROGRAM-DEFINED FUNCTIONS. 00030000
3.2.1. FUNCTION CALLS. 00031000
3.2.2. FUNCTION RETURNS. 00032000
3.2.3. FUNCTION CODE. 00033000
3.2.4. CALLING DEFINE(). 00034000
3.3. PROGRAM ENTRY POINTS. 00035000
4. RULES. 00036000
4.1. THE STRING REFERENCE. 00037000
4.2. RULES WITH STRING REFERENCE ONLY. 00038000
4.3. RULES WITH PATTERNS. 00039000
4.4. RULES WITH REPLACEMENTS. 00040000
4.5. RULES WITH BOTH PATTERN AND REPLACEMENT. 00041000
5. EXPRESSIONS. 00042000
5.1. NAMES AND VALUES. 00043000
5.1.1. LITERALS. 00044000
5.1.2. NAMES 00045000
5.1.3. INDIRECTION. 00046000
5.2. CONCATENATION. 00047000
5.3. FUNCTION CALLS. 00048000
5.4. ARITHMETIC. 00049000
5.4.1. DIVISION MODES. 00050000
5.4.2. FAILURE OF ARITHMETIC. 00051000
5.4.3. ARITHMETIC FUNCTIONS. 00052000
5.4.4. ADDITIONAL COMMENTS ON ARITHMETIC. 00053000
6. PATTERNS. 00054000
6.1. CONSTANT PATTERN ELEMENTS. 00055000
6.2. STRING VARIABLES. 00056000
6.2.1. ARBITRARY STRING VARIABLES. 00057000
6.2.2. BALANCED STRING VARIABLES. 00058000
6.2.3. FIXED-LENGTH STRING VARIABLES. 00059000
6.3. BACK REFERENCES. 00060000
6.4. PATTERN MATCH MODES. 00061000
6.5. ASSIGNMENT OF STRING VARIABLES. 00062000
6.6. PATTERN MATCH ALGORITHM. 00063000
7. GO-TO PARTS, LABELS. 00064000
7.1 LABELS. 00065000
7.2. SIMPLE GO-TO PARTS. 00066000
7.3. RESERVED LABELS. 00067000
7.4. COMPUTED GO-TOS. 00068000
7.5. ERRORS IN GO-TO PARTS. 00069000
8. FAILURE. 00070000
8.1. CAUSES OF FAILURE. 00071000
8.2. ORDER OF EXECUTION. 00072000
9. INTRINSIC FUNCTIONS. 00073000
10. INPUT/OUTPUT. 00074000
10.1. I/O STRINGS. 00075000
10.2. OPEN AND CLOSED FILES. 00076000
10.3. STANDARD I/O STRINGS. 00077000
10.4. TELETYPES. 00078000
10.4.1. TELETYPE INPUT AND OUTPUT. 00079000
10.4.2. TELETYPE WAITING TIMES. 00080000
10.4.3. TELETYPE ADDRESSES. 00081000
10.4.4. SPECIAL CHARACTERS FOR THE TELETYPE. 00082000
10.5. CAUSES OF I/O. 00083000
11. DEBUGGING AIDS. 00084000
11.1. TRACING. 00085000
11.2. INTERACTIVE DEBUGGING. 00086000
12. MISCELLANEOUS. 00087000
APPENDIX A. BNF DEFINITIONS FOR SNOBOL3. 00088000
APPENDIX B. BNF NOTATION. 00089000
APPENDIX C. B5500 CHARACTER SET. 00090000
APPENDIX D. RUNNING JOBS FROM A TELETYPE. 00091000
INDEX. 00092000
00093000
%SECTION 1 00094000
%PAGE 1 00095000
1. INTRODUCTION 00096000
00097000
THIS MANUAL DESCRIBES THE PROGRAMMING LANGUAGE SNOBOL3, AS 00098000
IMPLEMENTED ON THE BURROUGHS B5500 AT THE UNIVERSITY OF WISCONSIN 00099000
(MADISON) BY JOHN M. CHAMBERS, WITH MUCH HELP IN IN THE DESIGN AND 00100000
INITIAL CODING STAGES BY WILLIAM KRUEGER, AND SOME HELP IN WRITING 00101000
THE COMPILER BY DAVID WILSON. 00102000
THE VERSION OF SNOBOL3 DESCRIBED HERE IS BASICALLY IDENTICAL 00103000
WITH THE LANGUAGE DEVELOPED AT BELL LABS, WITH THE OBVIOUS DIFFERENCES 00104000
OF CHARACTER SET AND I/O FACILITIES. (THERE IS ALSO A SLIGHT PROBLEM 00105000
WITH DIVISION, CAUSED BY THE FACT THAT THE B5500 HARDWARE ROUNDS 00106000
QUOTIENTS, WHILE MOST OTHER MACHINES TRUNCATE. SEE THE SECTION 00107000
ON ARITHMETIC.) THERE ARE, AS USUAL, A NUMBER OF "EXTENSIONS", 00108000
MOSTLY IN THE INTRINSIC FUNCTIONS. THE BASIC SNOBOL3 FUNCTIONS 00109000
ACT AS THEY DO ON OTHER SYSTEMS, BUT THOSE WHOSE ACTIONS ARE MACHINE 00110000
DEPENDENT ARE OFTEN DIFFERENT. THERE ARE A NUMBER OF NEW FUNCTIONS 00111000
THAT REFLECT THE PECULIARITIES OF THE B5500 OPERATING SYSTEM. 00112000
MOST SNOBOL3 PROGRAMS WRITTEN ON OTHER MACHINES CAN BE RUN ON 00113000
THE B5500 WITH ONLY MINOR CHANGES IN THE I/O, MOST OF WHICH CAN BE 00114000
MADE BY THE COMPILER ITSELF. 00115000
AN EXTREMELY USEFUL FACILITY OF THE B5500 IS THE AVAILABILITY OF 00116000
TELETYPES AS I/O DEVICES. NATURALLY, THIS IS AVAILABLE TO SNOBOL 00117000
IN AN EASILY-USED MANNER, AND A SIMPLE, VERY USEFUL INTERACTIVE 00118000
DEBUGGING AID HAS BEEN SUPPLIED FOR TELETYPE USERS. 00119000
%SECTION 2 00120000
%PAGE 1 00121000
2. CONTROL CARDS 00122000
00123000
THERE ARE TWO TYPES OF CONTROL CARDS RELEVANT FOR SNOBOL JOBS-- 00124000
THOSE THAT GIVE INFORMATION TO THE OPERATING SYSTEM (THE "MASTER 00125000
CONTROL PROGRAM", OR "MCP"), WHICH START WITH A QUESTION MARK; AND 00126000
THOSE THAT GIVE INFORMATION TO THE SNOBOL COMPILER, WHICH START WITH 00127000
A MINUS SIGN ("-"). 00128000
00129000
2.1. MCP CONTROL CARDS. 00130000
AT THE START OF A DECK OF CARDS FOR BATCH JOBS, OR TYPED TO 00131000
INITIATE A TELETYPE JOB, THE USER NEEDS A SET OF MCP CONTROL CARDS 00132000
FOR BATCH JOBS. THESE ARE SEPARATE CARDS, EACH STARTING WITH A 00133000
QUESTION MARK ("ILLEGAL CHARACTER"). FOR TELETYPE JOBS, THE ENTIRE 00134000
SET OF CONTROL CARDS IS PRECEDED BY A PAIR OF QUESTION MARKS, AND 00135000
THE CARDS ARE SEPARATED BY SEMICOLONS (";"), WITH AN ARROW AFTER THE 00136000
LAST CONTROL CARD. 00137000
THE FIRST TWO CARDS IN A BATCH JOB SHOULD BE: 00138000
00139000
? USER <PROJ#> / <USER#> 00140000
? EXECUTE SNOBOL/SNOBOL 00141000
00142000
THE FIRST CARD IDENTIFIES THE USER TO THE MCP; THE SECOND TELLS IT 00143000
TO INITIATE SNOBOL. THE PROGRAM AND DATA DECK MUST BE PRECEDED BY 00144000
00145000
? DATA <NAME> 00146000
00147000
WHICH NAMES THE INPUT DECK. BETWEEN THE EXECUTE CARD AND THE DATA 00148000
CARD CAN COME ANY NUMBER OF OTHER CONTROL CARDS; SOME OF THE CARDS 00149000
THAT ARE USEFUL TO SNOBOL USERS ARE DESCRIBED BELOW. ONE OF THE 00150000
OTHER CONTROL CARDS MUST BE THE FOLLOWING: 00151000
00152000
? FILE PROGRAM = <NAME> 00153000
00154000
WHERE <NAME> IS THE SAME AS THE <NAME> ON THE DATA CARD. THIS 00155000
ASSIGNS THE CARD DECK AS THE INPUT FILE TO THE COMPILER. SOME OTHER 00156000
MCP CONTROL CARDS THAT CAN BE USED ARE: 00157000
00158000
? PROCESS = <INTEGER> 00159000
THIS PUTS A CPU TIME LIMIT TO THE ENTIRE RUN OF <INTEGER> 00160000
MINUTES. IF THIS LIMIT IS EXCEEDED, THE JOB WILL BE TERMINATED00161000
BY THE MCP. THE DEFAULT CPU TIME LIMIT IS 2 MINUTES. 00162000
? IO = <INTEGER> 00163000
THIS PUTS A TIME LIMIT OF <INTEGER> MINUTES TO THE I/O TIME 00164000
THAT CAN BE USED BY THE RUN. THE DEFAULT I/O LIMIT IS 00165000
5 MINUTES. 00166000
? STACK = <INTEGER> 00167000
THIS ASSIGNS A STACK OF <INTEGER> WORDS TO THE RUN. THIS 00168000
IS ONLY NECESSARY IF THE PROGRAM REACHES GREAT DEPTHS OF 00169000
FUNCTION CALLS, CAUSING STACK OVERFLOWS. THE DEFAULT STACK 00170000
SIZE IS 512. 00171000
? CORE = <INTEGER> 00172000
THIS ASSIGNS A CORE ESTIMATE OF <INTEGER> WORDS TO THE 00173000
RUN. THE JOB WILL BE STARTED WHEN THIS MANY WORDS BECOME 00174000
AVAILABLE. THE DEFAULT CORE ESTIMATE IS 10000. 00175000
00176000
A BATCH JOB CAN EXECUTE A SNOBOL PROGRAM FROM A DISK FILE IF THE 00177000
DATA CARD IS OMITTED AND THE PROGRAM CARD IS CHANGED TO: 00178000
00179000
? FILE PROGRAM = <NAME1>/<NAME2> SERIAL 00180000
00181000
WHERE <NAME1>/<NAME2> IS THE NAME OF THE DISK FILE. IN GENERAL, 00182000
THE INPUT FILE NAMED "PROGRAM" CAN BE ASSIGNED TO ANY FILE WHICH 00183000
CAN BE READ WITH 10,30 BLOCKING. 00184000
ANOTHER CONTROL CARD WHICH IS OCCASIONALLY USEFUL, THOUGH THE 00185000
SAME RESULTS CAN BE ACHEIVED WITH THE SNOBOL FUNCTION FILL(), IS 00186000
THE FILE CARD, WHICH HAS THE GENERAL FORM: 00187000
00188000
? FILE <NAME> = <NAME1>/<NAME2> <UNIT> 00189000
00190000
WHERE <NAME> IS THE "INTERNAL" NAME OF THE FILE, AND <NAME1>/<NAME2> 00191000
IS THE "EXTERNAL" NAME OF THE FILE ACTUALLY BEING USED. FOR SNOBOL 00192000
JOBS, <NAME> SHOULD BE THE I/O STRING NAME, WITH THE EXCEPTION 00193000
OF THE STRING READ, WHICH THE MCP THINKS IS CALLED "PROGRAM". 00194000
<UNIT> INDICATES WHAT SORT OF I/O DEVICE IS TO BE USED. SOME 00195000
POSSIBLE VALUES FOR <UNIT> ARE: 00196000
SERIAL MEANS SERIAL DISK FILE 00197000
PRINT MEANS LINE PRINTER FILE--NO BACK-UP 00198000
PRINT OR BACK UP MEANS LINE PRINTER OR PRINTER BACK-UP 00199000
TAPE MEANS MAGNETIC TAPE 00200000
FOR INPUT FILES, IT IS ONLY NECESSARY TO DISTINGUISH DISK FILES 00201000
FROM NON-DISK FILES. OF THE STANDARD SNOBOL FILES, NEWDISK IS 00202000
ASSUMED TO BE A DISK FILE UNLESS DECLARED OTHERWISE; ALL OTHERS 00203000
ARE NON-DISK UNLESS THE USER SPECIFICALLY ASKS FOR DISK. 00204000
SOME EXAMPLES OF FILE CARDS ARE: 00205000
00206000
? FILE CARD = RALPH/GRK SERIAL (DISK FILE) 00207000
? FILE PROGRAM = MLX/PHLP (NON-DISK; ASSIGNS READ) 00208000
? FILE PRINT = P PRINT OR BACK UP (GOES TO PRINTER IF IT CAN) 00209000
? FILE PRINT = PRNT PRINT (LP, NO BACK-UP) 00210000
? FILE NEWDISK = ART/BEVL (GOES TO DISK) 00211000
00212000
NOTE THAT THE FILE CARD ONLY APPLIES TO THE FIRST FILE THAT AN I/O 00213000
STRING IS ASSIGNED TO. TO RE-ASSIGN AN I/O STRING TO A SECOND FILE, 00214000
IT IS NECESSARY TO USE THE SNOBOL FUNCTIONS CLOSE() AND FILL(). 00215000
NOTE ESPECIALLY THAT TO ASSIGN THE INPUT FILE READ (WHICH CAN 00216000
ONLY BE DONE WITH TELETYPE JOBS, SINCE IT IS ASSIGNED TO THE PROGRAM 00217000
FILE AUTOMATICALLY FOR BATCH JOBS), THE CARD USED STARTS WITH 00218000
"? FILE PROGRAM", NOT WITH "? FILE READ". 00219000
00220000
00221000
%CP 30 00222000
SOME EXAMPLES OF BATCH JOBS: 00223000
00224000
TO RUN A SIMPLE BATCH JOB USING A CARD DECK, THE FOLLOWING MIGHT 00225000
BE USED: 00226000
00227000
? USER 1234/5678 00228000
? EXECUTE SNOBOL/SNOBOL 00229000
? FILE PROGRAM = AJONES 00230000
? PROCESS = 3 00231000
? IO = 7 00232000
? DATA AJONES 00233000
PROGRAM DECK 00234000
. 00235000
. 00236000
. 00237000
END 00238000
DATA DECK 00239000
00240000
00241000
00242000
TO RUN A SNOBOL PROGRAM FROM THE DISK FILE TMILLR/SDCK: 00243000
00244000
? USER 9876/5432 00245000
? EXECUTE SNOBOL/SNOBOL 00246000
? FILE PROGRAM = TMILLR/SDCK SERIAL 00247000
? PROCESS = 5 00248000
? IO = 10 00249000
? CORE = 18000 00250000
00251000
00252000
00253000
%CP 25 00254000
2.2. SNOBOL CONTROL CARDS. 00255000
00256000
VARIOUS ACTIONS OF THE SNOBOL COMPILER ARE CONTROLED BY SNOBOL 00257000
CONTROL CARDS, WHICH ARE ANY CARDS WITH A "-" IN COLUMN 1. IF SUCH 00258000
A CARD IS NOT A VALID CONTROL CARD, A DIAGNOSTIC MESSAGE WILL BE 00259000
PRINTED, AND THE CARD WILL BE IGNORED. THE CONTROL CARDS THAT ARE 00260000
CURRENTLY RECOGNIZED ARE: 00261000
00262000
00263000
00264000
%CP 4 00265000
-LIST <INTEGER> 00266000
THIS INITIATES LISTING OF THE PROGRAM ON THE LINE PRINTER FILE, 00267000
PRINT. THERE WILL BE <INTEGER> BLANK LINES BETWEEN EACH LINE 00268000
OF THE LISTING. IF <INTEGER> IS OMITTED, 0 (ZERO) IS ASSUMED. 00269000
00270000
00271000
00272000
%CP 2 00273000
-UNLIST 00274000
THIS CARD STOPS THE LISTING. 00275000
00276000
00277000
00278000
%CP 3 00279000
-PCC 00280000
THIS CAUSES ALL CONTROL CARDS TO BE LISTED, EVEN IF THE PROGRAM 00281000
ITSELF IS NOT BEING LISTED. 00282000
00283000
00284000
00285000
%CP 2 00286000
-EJECT 00287000
THIS EJECTS THE LISTING TO THE TOP OF THE NEXT PAGE 00288000
00289000
00290000
00291000
%CP 3 00292000
-SPACE <INTEGER> 00293000
THIS PRODUCES <INTEGER> BLANK LINES IN THE LISTING. 00294000
00295000
00296000
00297000
%CP 6 00298000
-WIDTH <INTEGER> 00299000
THIS SAYS THAT THE COMPILER IS TO USE THE FIRST <INTEGER> 00300000
CHARACTERS OF EACH CARD READ FROM A CARD-IMAGE FILE. IT DOES 00301000
NOT APPLY TO INPUT FROM A TELETYPE. THE COMPILER ASSUMES 00302000
THAT 72 CHARACTERS ARE TO BE USED IF THIS CARD ISNT USED. THE 00303000
MAXIMUM CARD WIDTH IS 80. 00304000
00305000
00306000
00307000
%CP 6 00308000
-26 00309000
THIS SAYS THAT THE DECK WAS PUNCHED ON AN 026 KEYPUNCH, WITH 00310000
THE IBM/CDC CHARACTER SET. A CHARACTER-SET TRANSLATION WILL 00311000
BE MADE BY THE COMPILER BEFORE COMPILING EACH CARD. THE HANDLING 00312000
OF "SPECIAL CHARACTERS" NOT ON THE 026 IS NOT VERY WELL-DEFINED. 00313000
THIS CARD CAN ALSO BE WRITTEN "-026" IF DESIRED. 00314000
00315000
00316000
00317000
%CP 9 00318000
-3600 00319000
THIS CAUSES THE SAME CONVERSION AS THE -26 CARD, AND ALSO TRANSLATES 00320000
THE I/O STRING NAMES USED ON THE CDC3600 SNOBOL AS IMPLEMENTED 00321000
AT THE UNIVERSITY OF WISCONSIN. IN PARTICULAR, THE FOLLOWING 00322000
SUBSTITUTIONS ARE MADE: 00323000
00324000
"SYSPIT" BECOMES "READ " 00325000
"SYSLOK" BECOMES "LOOK " 00326000
"SYSPPT" BECOMES "PUNCH " 00327000
00328000
00329000
00330000
%CP 2 00331000
-B5500 00332000
THIS CANCELS ANY PREVIOUS -26 OR -3600 CARD. 00333000
00334000
00335000
00336000
%CP 5 00337000
-PUNCH 00338000
THIS CAUSES THE COMPILER TO PUNCH OUT THE PROGRAM DECK ON THE 00339000
CARD PUNCH, STARTING WITH THE NEXT CARD. THIS CAN BE USED WITH 00340000
A -26 OR -3600 CARD TO PRODUCE A B5500 DECK FROM A SNOBOL PROGRAM 00341000
WRITTEN FOR ANOTHER MACHINE. 00342000
00343000
00344000
00345000
%CP 8 00346000
-INFORM 00347000
THIS TURNS ON A SET OF SYSTEM INFORMATIVE DIAGNOSTICS. IT IS 00348000
EQUIVALENT TO THE RUN-TIME USE OF MODE("INFORM"). SOME MESSAGES 00349000
THAT ARE PRODUCED BY THE COMPILER IF THIS CARD IS USED ARE: 00350000
LABELS REFERENCED THAT ARE UNDEFINED (AT THE END OF THE LISTING); 00351000
INACCESSIBLE INSTRUCTIONS; USING -DEFINE TO RE-DEFINE A PREVIOUSLY 00352000
DEFINED FUNCTION; USING NON-NUMERIC LITERALS IN ARITHMETIC; 00353000
AND OTHER THINGS THAT MAY BE ADDED IN THE FUTURE. 00354000
00355000
00356000
00357000
%CP 2 00358000
-SILENCE 00359000
THIS CANCELS ANY PREVIOUS -INFORM CARD. 00360000
00361000
00362000
00363000
%CP 4 00364000
-WAIT <INTEGER> 00365000
THIS SETS THE WAITING TIME FOR TELETYPE I/O TO <INTEGER> 00366000
SECONDS. IT IS EQUIVALENT TO USING WAIT("<INTEGER>") AT 00367000
RUN TIME. 00368000
00369000
00370000
00371000
%CP 12 00372000
-LIMIT <QUANTITY> <INTEGER> 00373000
THIS SETS A PROGRAM LIMIT TO THE THING NAMED BY <QUANTITY> 00374000
TO THE VALUE OF <INTEGER>. IF THIS LIMIT IS EXCEEDED, THE 00375000
PROGRAM WILL BE TERMINATED ABNORMALLY. SOME POSSIBLE VALUES 00376000
FOR <QUANTITY> ARE: 00377000
00378000
RULES SETS A LIMIT TO THE NUMBER OF RULES THAT CAN BE 00379000
EXECUTED. 00380000
PROCESS SETS A TIME LIMIT (IN SECONDS) TO THE PROGRAMS 00381000
CPU TIME. 00382000
IO SETS A TIME LIMIT (IN SECONDS) TO THE PROGRAMS 00383000
I/O TIME. 00384000
00385000
00386000
00387000
%CP 9 00388000
-SIZE <INTEGER> 00389000
THIS TELLS THE COMPILER HOW MANY INSTRUCTIONS TO EXPECT IN THE 00390000
PROGRAM. IT NEED NOT BE USED; IT ALLOWS THE COMPILER TO SET 00391000
UP ITS TABLES TO TRY TO MINIMIZE THE TIME FOR BOTH COMPILATION 00392000
AND EXECUTION. THE VALUE OF <INTEGER> SHOULD BE ABOUT (SAY, 00393000
WITHIN 25 OF) THE NUMBER OF INSTRUCTIONS IN THE PROGRAM. THIS CARD 00394000
CAN CAUSE SAVINGS OF 5-10% IN LARGE PROGRAMS. IF USED, A -SIZE 00395000
CARD MUST APPEAR BEFORE ALL PROGRAM MATERIAL (INCLUDING -SET, 00396000
-DEFINE, -COMPILE, AND -LOAD CARDS). 00397000
00398000
00399000
00400000
%CP 21 00401000
-SET <IDENTIFIER> <LITERALS> 00402000
THIS CARD ASSIGNS AN INITIAL VALUE TO THE VARIABLE NAMED 00403000
<IDENTIFIER>. THE VALUE IS DETERMINED BY SCANNING THE CARD 00404000
FOR ALL LITERALS, AND CONCATENATING THEM. ANYTHING BETWEEN 00405000
THE LITERALS IS TREATED AS COMMENT. THUS, A LONG STRING CAN 00406000
BE BROKEN UP BETWEEN SEVERAL CARDS IN ANY CONVENIENT WAY. SOME 00407000
EXAMPLES OF -SET CARDS ARE: 00408000
00409000
-SET ALPHABET "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 00410000
-SET CARDNAME "GEORGE/POSDECK" 00411000
-SET SUITS "HEARTS,CLUBS,SPADES,DIAMONDS" 00412000
-SET CITIES "NEW YORK,N.Y./CHICAGO,ILL./BOSTON,MASS./" 00413000
. "SAN FRANCISCO,CALIF./DENVER,COL./CLEVELAND,OHIO/" 00414000
. "NEW ORLEANS,LA./LOS ANGELES,CALIF./ATLANTA,GA./" 00415000
. "PHOENIX,ARIZ./PITTSBURG,PENN./SEATTLE,WASH./" 00416000
-SET OPS " + - | / * " 00417000
00418000
THE MAJOR REASON FOR USING A -SET CARD IS THAT IT SAVES THE 00419000
SPACE THAT WOULD BE REQUIRED FOR THE EQUIVALENT RUN-TIME ASSIGNMENT 00420000
STATEMENT. THIS CAN BE IMPORTANT WHEN THE SMALL MEMORY SIZE 00421000
OF THE B5500 IS TAKEN INTO ACCOUNT. 00422000
00423000
00424000
00425000
%CP 34 00426000
-DEFINE <LIT1> , <LIT2> , <LIT3> 00427000
THIS SETS UP A FUNCTION DURING COMPILATION IN THE SAME WAY THAT 00428000
A CALL OF DEFINE(<LIT1>,<LIT2>,<LIT3>) WOULD DURING EXECUTION. 00429000
THE PARAMETERS MUST ALL BE SINGLE LITERALS (NO CONCATENATION 00430000
WILL BE DONE BY THE COMPILER). LIKE THE -SET CARD, A -DEFINE 00431000
CARD SAVES THE SPACE AND EXTRA TIME THAT WOULD BE REQUIRED FOR 00432000
AN INSTRUCTION TO CREATE THE FUNCTION AT RUN TIME. IT USUALLY 00433000
TURNS OUT EASIER TO USE THE -DEFINE CARD, THOUGH, SINCE THIS 00434000
MAKES IT POSSIBLE TO PLACE THE DEFINITION TOGETHER WITH THE 00435000
FUNCTION CODE WITHOUT THE NEED TO LINK THE DEFINITIONS TOGETHER 00436000
WITH GO-TOS. THE PARAMETERS HAVE THE FOLLOWING MEANINGS: 00437000
00438000
<LIT1> IS THE "FUNCTION PROTOTYPE", OF THE FORM: 00439000
00440000
<FCT>( <PARAMS> ) 00441000
00442000
WHERE <FCT> IS THE FUNCTION NAME, AND <PARAMS> IS A 00443000
LIST OF FORMAL PARAMETERS, SEPARATED BY COMMAS. 00444000
<LIT2> CONTAINS A LABEL, WHICH IS THE ENTRY POINT OF 00445000
THE FUNCTION. IF <LIT2> IS MISSING (I.E., THE COMMAS 00446000
HAVE NO LITERAL BETWEEN THEM), THEN THE ENTRY POINT IS 00447000
TAKEN TO BE SPELLED THE SAME AS <FCT>. 00448000
<LIT3> CONTAINS A LIST OF LOCAL VARIABLES--A LIST OF 00449000
IDENTIFIERS, SEPARATED BY COMMAS. 00450000
00451000
FOR FURTHER INFORMATION, SEE SECTIONS 3.2 (FUNCTION CALLS) AND 9 00452000
(INTRINSIC FUNCTIONS--DEFINE()). SOME EXAMPLES OF -DEFINE CARDS: 00453000
00454000
-DEFINE "M(A1,A2)","M1","V,XY,ALPH" 00455000
-DEFINE "MAX(A,B)" 00456000
-DEFINE "MIN(MIN,X)" 00457000
-DEFINE "FCT()",,"X" 00458000
-DEFINE "MRGE(L)","MRGENTRY","L1,L2,L3" 00459000
-DEFINE("GLORCH(A,B,C,D,E,F,G,H,I)","GLORK","J,K,L,M,N,O,P") 00460000
00461000
00462000
00463000
%CP 4 00464000
-DEBUG 00465000
THIS TURNS ON "DEBUG MODE" (SEE SECTION 11.2) DURING COMPILATION, AND00466000
CAUSES THE JOB TO BE SUSPENDED JUST BEFORE THE FIRST INSTRUCTION IS 00467000
EXECUTED (IF THERE IS A TELETYPE ATTACHED). 00468000
00469000
00470000
00471000
%CP 42 00472000
-COMPILE <NAME1>/<NAME2> 00473000
THIS CARD CAUSES THE COMPILER TO COMPILE THE DISK FILE NAMED 00474000
<NAME1>/<NAME2> INTO THE PROGRAM AT THE POINT WHERE THE 00475000
CARD IS FOUND. THE COMPILER WILL READ EVERYTHING IN THE FILE 00476000
UP TO AN END CARD OR THE END-OF-FILE, AND THEN RETURN TO THE 00477000
ORIGINAL FILE (OR TELETYPE). IF AN END CARD IS FOUND, IT IS 00478000
SEARCHED FOR A LABEL; IF ONE IS FOUND, IT BECOMES THE PROGRAM 00479000
ENTRY POINT (UNLESS A LATER END CARD CHANGES IT). IF THE FILE 00480000
NAMED IS NOT ON THE DISK, A DIAGNOSTIC WILL BE PRINTED AND THE 00481000
CARD WILL BE IGNORED. ANY CARD-IMAGE FILE (WITH 80-CHAR LOGICAL 00482000
RECORDS) CAN BE READ BY THE COMPILER. 00483000
THE MOST OBVIOUS USE OF THE -COMPILE CARD IS TO ENABLE USERS TO 00484000
BUILD UP A SNOBOL "LIBRARY" OF FUNCTIONS, WHICH CAN THEN BE USED 00485000
BY ANYONE BY SIMPLY INCLUDING A -COMPILE CARD FOR EACH FUNCTION 00486000
DESIRED. ALTHOUGH STANDARDS FOR SUCH A LIBRARY ARE CLEARLY NOT 00487000
ENFORCEABLE, SOME GUIDELINES ARE SUGGESTED HERE WHICH SHOULD MAKE 00488000
IT EASIER TO USE LIBRARY FILES: 00489000
00490000
1) THOROUGH DOCUMENTATION SHOULD EITHER BE INCLUDED IN THE CODE OR 00491000
THERE SHOULD BE COMMENTS AT THE START OF THE FILE TELLING THE 00492000
USER WHERE TO FIND DOCUMENTATION. 00493000
2) FUNCTIONS SHOULD BE SET UP BY THE -DEFINE CONTROL CARD, RATHER 00494000
THAN BY THE FUNCTION DEFINE(), SO THAT THE USER DOESNT HAVE TO 00495000
SET UP A LOT OF GO-TOS INTO THE CODE. 00496000
3) THE USER SHOULD GET INTO THE CODE BY CALLING A FUNCTION, RATHER 00497000
THAN BY A GO-TO. THIS MAKES IT MUCH EASIER TO INTEGRATE THE CODE 00498000
WITH THE MAIN PROGRAM. 00499000
4) NO INSTRUCTIONS IN THE LIBRARY FILE SHOULD TRANSFER OUT 00500000
OF THE FILE, WITHOUT EXPLICIT DESCRIPTIONS OF ALL LABELS 00501000
THAT THE CALLING PROGRAM SHOULD CONTAIN. THIS SHOULD 00502000
BE AVOIDED ENTIRELY IF POSSIBLE. 00503000
5) THERE SHOULD BE VERY EXPLICIT COMMENTS DESCRIBING ALL GLOBAL 00504000
VARIABLES USED OR ALTERED BY THE CODE. WHENEVER POSSIBLE, 00505000
THE CODE SHOULD DO ITS OWN INITIALIZATION BY MEANS OF 00506000
THE -SET CONTROL CARD, RATHER THAN ASKING THE USER TO 00507000
FIGURE OUT WHAT TO DO. 00508000
6) LABELS SHOULD BE SUCH THAT USERS OF THE FILE ARE UNLIKELY 00509000
TO DUPLICATE THEM IN THEIR OWN CODE. THIS IS MOST EASILY 00510000
HANDLED BY MAKING EACH LABEL INCLUDE EITHER THE NAME OF 00511000
THE FILE OR THE NAME OF THE FUNCTION THEY ARE USED IN. NOTE 00512000
THAT IF TWO LIBRARY FILES USE THE SAME LABEL, THEY CANT 00513000
BE USED IN THE SAME PROGRAM. 00514000
00515000
00516000
00517000
%CP 12 00518000
-LIBRARY <NAME1>/<NAME2> 00519000
THIS CARD CREATES A "LIBRARY" FILE CONTAINING THE COMPILED 00520000
VERSION OF THE PROGRAM. THE FILE IS NAMED <NAME1>/<NAME2>. 00521000
THIS LIBRARY FILE CAN THEN BE USED IN A LATER RUN WITHOUT 00522000
RECOMPILING IT BY USING THE -LOAD CARD (SEE BELOW). A -LIBRARY 00523000
CARD IS NORMALLY THE LAST CARD IN THE PROGRAM DECK, COMING 00524000
JUST BEFORE THE END CARD, BUT IT CAN APPEAR ANYWHERE IN A 00525000
PROGRAM, AND THE PROGRAM STORED IN THE FILE WILL LOOK AS IF 00526000
THE -LIBRARY CARD HAD BEEN FOLLOWED BY AN END CARD. SEVERAL 00527000
-LIBRARY CARDS CAN BE USED IN THE SAME PROGRAM, IF DESIRED. 00528000
IN ADDITION TO THE PROGRAM ITSELF, ANY LIMITS SET BY -LIMIT 00529000
CARDS ARE SAVED, AS IS THE ENTRY POINT AS OF THE -LIBRARY CARD. 00530000
00531000
00532000
00533000
%CP 13 00534000
-LOAD <NAME1>/<NAME2> 00535000
THIS LOADS A LIBRARY FILE CREATED BY A -LIBRARY CARD IN A 00536000
PREVIOUS RUN. IF THE FILE NAMED IS NOT PRESENT OR IS NOT 00537000
A VALID LIBRARY FILE, A DIAGNOSTIC MESSAGE WILL BE PRINTED. 00538000
IF THE FILE WAS THERE, BUT CONTAINED DAMAGED CODE, THE COMPILER 00539000
WILL OFTEN BE UNABLE TO RECOVER FROM THE BAD INFORMATION LOADED 00540000
INTO ITS TABLES WHEN THE PROBLEM IS DISCOVERED; THIS WILL 00541000
CAUSE THE COMPILER TO SIMPLY GIVE UP AND THE JOB WILL TERMINATE. 00542000
ONLY ONE -LOAD CARD CAN BE USED IN A PROGRAM, AND IT MUST BE 00543000
BEFORE ANY OTHER PROGRAM MATERIAL (INCLUDING INSTRUCTIONS, -SET, 00544000
-DEFINE CONTROL CARDS). THE -LOAD CARD CAN BE FOLLOWED BY MORE 00545000
PROGRAM, WHICH WILL BE COMPILED AND ADDED ONTO THE PROGRAM 00546000
LOADED FROM THE FILE. (THE FILE, OF COURSE, WILL NOT BE ALTERED.) 00547000
00548000
00549000
00550000
%SECTION 3 00551000
%PAGE 1 00552000
3. PROGRAM ORGANIZATION. 00553000
00554000
A SNOBOL PROGRAM CONSISTS OF A SET OF INSTRUCTIONS. THE PROGRAM 00555000
CAN BE INPUT FROM A CARD-IMAGE FILE, OR FROM A TELETYPE. EACH CARD 00556000
IMAGE FROM AN INPUT FILE STARTS A NEW INSTRUCTION, UNLESS THE FIRST 00557000
CHARACTER IS ".", IN WHICH CASE THE CARD IS A CONTINUATION OF THE 00558000
PREVIOUS INSTRUCTION. IN B5500 SNOBOL, IT IS ALSO POSSIBLE TO FIT 00559000
SEVERAL INSTRUCTIONS ON ONE CARD, THOUGH THIS IS RARELY DONE. 00560000
FOR JOBS RUN FROM A TELETYPE, THE PROGRAM IS READ FROM THE TELETYPE, 00561000
WITH EACH INPUT BEING AN INSTRUCTION. CONTINUATIONS ARE NOT VALID 00562000
FROM A TELETYPE. THIS IS NOT REALLY A RESTRICTION, SINCE FEW PEOPLE 00563000
ACTUALLY ATTEMPT TO INPUT ENTIRE PROGRAMS FROM A TELETYPE. IT IS FAR 00564000
EASIER TO CREATE A DISK FILE CONTAINING THE PROGRAM (SAY, WITH AN 00565000
EDITING PROGRAM), AND USE THE -COMPILE CARD TO DIRECT THE COMPILER 00566000
TO THE FILE. 00567000
SCATTERED AMONG THE INSTRUCTIONS IN A PROGRAM CAN BE ANY NUMBER OF 00568000
SNOBOL CONTROL CARDS, WHICH ARE INSTRUCTIONS TO THE COMPILER, BUT 00569000
ARE NOT ACTUALLY PART OF THE PROGRAM. IN ADDITION TO THE USUAL 00570000
CONTROL CARDS, THE B5500 HAS CARDS THAT CAN BE USED TO DEFINE 00571000
FUNCTIONS DURING COMPILATION, AND TO ASSIGN INITIAL VALUES TO PROGRAM 00572000
VARIABLES. 00573000
A PROGRAM DECK CAN ALSO CONTAIN ANY NUMBER OF COMMENT CARDS, 00574000
WHICH ARE CARDS STARTING WITH "*" OR "%". SUCH CARDS ARE PRINTED ON A 00575000
LISTING, BUT OTHERWISE IGNORED. USERS ARE ENCOURAGED TO MAKE LIBERAL 00576000
USE OF COMMENTS IN THEIR PROGRAMS. 00577000
AT THE END OF A SNOBOL PROGRAM SHOULD BE AN "END" CARD, WHICH 00578000
IS A CARD WITH "END " IN COLUMNS 1-4. THE FIRST STRING OF NON-BLANK 00579000
CHARACTERS ON THE CARD IS TAKEN AS A LABEL WHICH IS THE "ENTRY POINT" 00580000
TO THE PROGRAM. THAT IS, IT IS THE LABEL OF THE FIRST INSTRUCTION 00581000
TO BE EXECUTED. IF THE ENTIRE CARD IS BLANK, THE FIRST INSTRUCTION 00582000
IN THE PROGRAM IS ASSUMED TO BE THE ENTRY POINT. 00583000
INSTRUCTIONS CAN BE EITHER LABELED OR UNLABELED. LABELS ARE 00584000
NEEDED WHENEVER AN INSTRUCTION MUST BE TRANSFERED TO BY ANOTHER ONE, 00585000
AND OTHER INSTRUCTIONS ARE GENERALLY UNLABELED. A LABEL IS ANY 00586000
STRING OF NON-BLANK CHARACTERS STARTING IN COLUMN 1. IF COLUMN 1 00587000
IS A BLANK, THE INSTRUCTION IS UNLABELED. LABELS ARENT REALLY A 00588000
PART OF THEIR INSTRUCTIONS, BUT SIMPLY SERVE AS "NAMES" FOR THE 00589000
INSTRUCTIONS. 00590000
A SNOBOL PROGRAM IS A SINGLE SET OF INSTRUCTIONS, WITH NO SUB-PARTS 00591000
(UNLIKE MOST OTHER PROGRAMMING LANGUAGES THAT HAVE SEPARATE BLOCKS 00592000
OF CODE FOR EACH SUB-ROUTINE OR FUNCTION OR WHATEVER THEY ARE CALLED). 00593000
ONE CONSEQUENCE OF THIS IS THAT STATEMENT LABELS IN A SNOBOL PROGRAM 00594000
MUST BE UNIQUE. THERE IS VERY LITTLE CONSISTENCY BETWEEN IMPLEMEN- 00595000
TATIONS ON HOW DOUBLY-DEFINED LABELS ARE TREATED. THE METHOD USED 00596000
ON THE B5500 IS THIS: THE SECOND LABEL OVERWRITES THE FIRST AND 00597000
CAUSES IT TO BE RE-DEFINED, BUT A WARNING MESSAGE IS PRINTED. THIS 00598000
CAN BE USEFUL AT TIMES ON INTERACTIVE JOBS TO RE-DEFINE AN INSTRUCTION 00599000
PREVIOUSLY COMPILED. 00600000
00601000
00602000
%PAGE 00603000
3.1. INSTRUCTIONS. 00604000
<INSTRUCTION> ::= <LABELED INST> 00605000
::= <UNLABELED INST> 00606000
<LABELED INST> ::= <LABEL> <UNLABELED INST> 00607000
<UNLABELED INST> ::= <BLANKS> <INST> 00608000
<INST> ::= <RULE> 00609000
::= <GO-TO PART> 00610000
::= <RULE> <GO-TO PART> 00611000
00612000
00613000
THE VARIOUS FORMS OF INSTRUCTIONS CAN BE TREATED AS SPECIAL 00614000
CASES OF THE GENERAL FORM: 00615000
00616000
<LABEL> <RULE> <GO-TO PART> 00617000
00618000
WHERE IT IS REMEMBERED THAT THERE IS ALWAYS AT LEAST ONE BLANK 00619000
AFTER <LABEL>, IF THIS IS PRESENT, OR ELSE THE INSTRUCTION 00620000
STARTS WITH AT LEAST ONE BLANK. 00621000
THE <LABEL>, OF COURSE, IS JUST A NAME FOR THE INSTRUCTION. 00622000
A <LABEL> IS ONLY NEEDED IF SOME OTHER PART OF THE PROGRAM IS TO 00623000
TO TRANSFER TO THE INSTRUCTION, THOUGH THERE IS NO OBJECTION TO 00624000
USING LABELS WHICH ARE NEVER REFERENCED. LABELS ARE DESCRIBED 00625000
IN SECTION 7. 00626000
THE <RULE> IS THE PART OF AN INSTRUCTION THAT OPERATES ON DATA; 00627000
IT IS THE PART THAT "DOES THINGS". SEE SECTION 4 FOR DESCRIPTIONS 00628000
OF THE VARIOUS TYPES OF RULES AVAILABLE. 00629000
THE <GO-TO PART> TELLS WHAT INSTRUCTIONS ARE TO FOLLOW NEXT. 00630000
SNOBOL3 ALLOWS CONDITIONAL BRANCHING ON THE SUCCESS OR FAILURE 00631000
OF THE RULE. AN INSTRUCTION CAN ALSO CALCULATE THE LABEL 00632000
OF THE NEXT INSTRUCTION. OMISSION OF THE GO-TO PART CAUSES THE 00633000
INSTRUCTION TO "FALL THROUGH" TO THE NEXT INSTRUCTION IN THE PROGRAM. 00634000
SEE SECTION 7 FOR DETAILED DESCRIPTIONS OF GO-TO PARTS. 00635000
00636000
00637000
%CP 8 00638000
3.2 PROGRAM-DEFINED FUNCTIONS. 00639000
00640000
IN ADDITION TO THE FUNCTIONS PRE-DEFINED BY THE SNOBOL INTER- 00641000
PRETER, A PROGRAMMER CAN DEFINE HIS OWN FUNCTIONS CODED IN SNOBOL 00642000
BY USING EITHER THE FUNCTION DEFINE() (SEE SEC. 9) OR THE -DEFINE 00643000
CONTROL CARD (SEE SEC.2.2). IN SECTION 5.3, THE USE OF FUNCTIONS 00644000
CALLS IS DESCRIBED; THIS SECTION DESCRIBES THE DEFINITION OF THE 00645000
FUNCTIONS. 00646000
00647000
00648000
%CP 15 00649000
3.2.1. FUNCTION CALLS. 00650000
00651000
WHEN A PROGRAM-DEFINED FUNCTION IS CALLED, THE FOLLOWING OCCURS: 00652000
00653000
1) THE STRING WITH THE SAME NAME AS THE FUNCTION IS PUSHED DOWN, 00654000
AND SET NULL. 00655000
2) THE FORMAL PARAMETERS ARE PUSHED DOWN, AND THEN ASSIGNED THE 00656000
VALUES OF THE CORRESPONDING ACTUAL PARAMETERS. IF THERE ARENT 00657000
ENOUGH ACTUAL PARAMETERS, THE EXTRA FORMAL PARAMETERS ARE SET 00658000
NULL. 00659000
3) THE LOCAL VARIABLES ARE PUSHED AND SET NULL. 00660000
4) THE PROGRAM TRANSFERS TO THE FUNCTIONS ENTRY POINT. 00661000
00662000
00663000
00664000
%CP 15 00665000
3.2.2. FUNCTION RETURNS. 00666000
00667000
WHEN A PROGRAM TRANSFERS TO THE "RESERVED LABELS" RETURN AND 00668000
FRETURN, THE LAST FUNCTION CALLED IS TERMINATED, AND THE FOLLOWING 00669000
ACTIONS OCCUR: 00670000
00671000
1) THE VALUE OF THE STRING NAMED THE SAME AS THE FUNCTION IS GIVEN 00672000
TO THE CALLING INSTRUCTION AS THE VALUE OF THE FUNCTION. 00673000
2) THIS STRING, THE FORMAL PARAMETERS, AND THE LOCAL VARIABLES ARE 00674000
ALL POPPED UP, RETURNING THEM TO THEIR VALUES BEFORE THE CALL. 00675000
3) IF THE RETURN WAS MADE BY TRANSFERING TO "FRETURN", THE CALLING 00676000
INSTRUCTION FAILS; IF THE RETURN WAS BY "RETURN", THE CALLING 00677000
INSTRUCTION CONTINUES AS USUAL. 00678000
00679000
00680000
%CP 10 00681000
3.2.3. FUNCTION CODE. 00682000
IN CONTRAST WITH MOST OTHER PROGRAMMING LANGUAGES, A SNOBOL 00683000
FUNCTION HAS NO "BODY" OF CODE THAT BELONGS TO THE FUNCTION ALONE. 00684000
THAT IS, FROM ITS ENTRY POINT, A FUNCTION CAN TRANSFER TO ANY 00685000
INSTRUCTION IN THE PROGRAM. RETURN OCCURS ONLY WHEN A TRANSFER TO 00686000
RETURN OR FRETURN IS MADE. THIS MEANS THAT SEVERAL SNOBOL 00687000
FUNCTIONS CAN SHARE ALL OR PART OF THEIR CODE. ALSO, NOTE THAT IF 00688000
A STRING IS NOT ONE OF THE STRINGS PUSHED AT THE CALL OF A FUNCTION, 00689000
THEN THAT FUNCTION CAN USE OR ALTER THE STRING FREELY. 00690000
00691000
00692000
%CP 12 00693000
3.2.4. CALLING DEFINE(). 00694000
00695000
ONE VERY COMMON PROBLEM WITH NOVICE SNOBOL PROGRAMMERS IS THE 00696000
FAILURE TO REALIZE THAT THE FUNCTION DEFINE() ACTUALLY CREATES A 00697000
FUNCTION WHEN IT IS CALLED. IT IS NOT ENOUGH TO INCLUDE A CALL OF 00698000
DEFINE() IN A PROGRAM--THE PROGRAM MUST EXECUTE THE STATEMENT CON- 00699000
TAINING THE CALL, OR THE FUNCTION WILL NOT BE DEFINED. 00700000
THIS PROBLEM CAN BE AVOIDED ON THE B5500 BY USING THE -DEFINE 00701000
CONTROL CARD (SEC.2.2). SINCE MOST SNOBOL SYSTEMS DONT HAVE THIS 00702000
CONTROL CARD, USING IT WILL MAKE THE PROGRAM INCOMPATIBLE WITH THESE 00703000
OTHER SNOBOLS. 00704000
00705000
00706000
00707000
%CP 25 00708000
3.3. PROGRAM ENTRY POINTS. 00709000
00710000
IN ORDER TO START EXECUTION OF A SNOBOL PROGRAM, IT IS NECESSARY 00711000
TO INDICATE WHERE THE EXECUTION IS TO BEGIN. THE FIRST INSTRUCTION 00712000
TO BE EXECUTED, THE "ENTRY POINT", IS INDICATED BY THE END CARD AT 00713000
THE END OF THE PROGRAM. THE FIRST FOUR CHARACTERS OF THIS CARD ARE 00714000
"END "; THE COMPILER SCANS THE REST OF THE CARD FOR A NON-BLANK 00715000
CHARACTER. IF ONE IS FOUND, THE STRING UP TO THE NEXT BLANK OR TO 00716000
THE END OF THE CARD IS THE LABEL OF THE ENTRY POINT. FOR EXAMPLE: 00717000
00718000
END BEGIN 00719000
00720000
SAYS THAT EXECUTION IS TO START AT THE LABEL BEGIN. IF THERE IS 00721000
NO LABEL ON THE END CARD, THE FIRST INSTRUCTION IN THE PROGRAM IS 00722000
TAKEN TO BE THE ENTRY POINT. 00723000
IF THE PROGRAM CONTAINS -COMPILE CARDS, AND THE FILES THEMSELVES 00724000
CONTAIN END CARDS, THE LABELS (IF ANY) ON THESE END CARDS ARE NOTED, 00725000
AND THE LAST SUCH LABEL IS THE PROGRAM ENTRY POINT. 00726000
IF THE ENTRY POINT IS A LABEL THAT DOESNT OCCUR IN THE PROGRAM, 00727000
A DIAGNOSTIC MESSAGE TO THAT EFFECT IS PRINTED, AND NO EXECUTION 00728000
TAKES PLACE. THIS CAN BE USED TO GET COMPILES FOR SYNTAX CHECKING 00729000
OR A COMPILE TO LIBRARY WITHOUT IMMEDIATE EXECUTION. 00730000
00731000
00732000
00733000
%SECTION 4 00734000
%PAGE 1 00735000
4. RULES. 00736000
00737000
<RULE> ::= <STR REF> 00738000
::= <STR REF> <PATTERN> 00739000
::= <STR REF> <REPLACEMENT> 00740000
::= <STR REF> <PATTERN> <REPLACEMENT> 00741000
<STR REF> ::= <ELEMENT> 00742000
<PATTERN> ::= <ELEMENT> 00743000
::= <STR VAR> 00744000
::= <PATTERN> <PATTERN> 00745000
::= <PATTERN> <BACK REF> 00746000
<REPLACEMENT> ::= <RPL DELIMITER> <EXPRESSION> 00747000
<RPL DELIMITER> ::= ~ 00748000
::= = 00749000
00750000
THERE ARE SEVERAL VARIETIES OF RULES, AS SHOWN ABOVE, BUT ALL 00751000
CAN BE VIEWED AS SPECIAL CASES OF THE GENERAL FORM: 00752000
00753000
<STR REF> <PATTERN> <REPLACEMENT> 00754000
00755000
IF THE PATTERN IS OMITTED, AN ARBITRARY STRING VARIABLE 00756000
WILL BE ASSUMED; THIS STRING VARIABLE WILL MATCH THE ENTIRE STRING 00757000
REFERENCE, RESULTING IN AN "ASSIGNMENT STATEMENT". IF THE REPLACEMENT 00758000
IS OMITTED, NO REPLACEMENT TAKES PLACE. IF BOTH PATTERN AND REPLACE- 00759000
MENT ARE OMITTED, THE STATEMENT MERELY EVALUATES THE STRING REFERENCE. 00760000
IN THE LATTER CASE, THE STRING REFERENCE CAN ALSO BE OMITTED, AND 00761000
THE STATEMENT IS A "NO-OP". 00762000
THE FOLLOWING SUB-SECTIONS DESCRIBE MORE THOROUGHLY THE VARIOUS 00763000
PARTS OF A RULE. 00764000
00765000
00766000
00767000
%CP 20 00768000
4.1. THE STRING REFERENCE. 00769000
00770000
<STR REF>, THE "STRING REFERENCE", IS THE STRING THAT THE RULE 00771000
IS TO OPERATE ON; IT IS THE "SUBJECT" OF THE STATEMENT. THE COMPILER 00772000
ASSUMES THAT THE SHORTEST COMPLETE EXPRESSION AT THE START OF A RULE 00773000
IS THE STRING REFERENCE; IF A STRING REFERENCE CONSISTING OF SEVERAL 00774000
STRINGS CONCATENATED IS DESIRED, IT MUST BE SURROUNDED BY PARENTHESES. 00775000
SOME EXAMPLES OF VALID STRING REFERENCES ARE: 00776000
00777000
X 00778000
(ALPHA BETA + GAMMA) 00779000
SIZE(A) 00780000
$("A" N) 00781000
"123456789" 00782000
"" 00783000
A + B 00784000
00785000
EACH TYPE OF RULE INTERPRETS ITS STRING REFERENCE SLIGHTLY DIFFERENTLY, 00786000
AND SOME RULES WILL NOT ACCEPT ALL OF THE ABOVE AS STRING REFERENCE. 00787000
THE FOLLOWING DESCRIPTIONS OF INDIVIDUAL RULE TYPES DESCRIBES EACH 00788000
USAGE IN DETAIL. 00789000
00790000
00791000
00792000
%CP 20 00793000
4.2. RULES WITH STRING REFERENCE ONLY. 00794000
00795000
<RULE> ::= <STR REF> 00796000
00797000
THIS TYPE OF RULE SIMPLY EVALUATES THE STRING REFERENCE. THE 00798000
USUAL USE OF SUCH A RULE IS TO CALL A FUNCTION. THIS CAN BE DONE 00799000
EITHER FOR THE SIDE-EFFECTS OF THE FUNCTION, OR TO BRANCH ON THE 00800000
SUCCESS OR FAILURE OF THE FUNCTION. AN EXAMPLE OF THE LATTER IS: 00801000
00802000
.GT(SIZE(A),"5") :S(RM) 00803000
00804000
THIS STATEMENT WILL TRANSFER TO RM IF THE STRING A CONTAINS MORE 00805000
THAN FIVE CHARACTERS. 00806000
ANOTHER, RARELY USED, FORM OF THIS TYPE OF RULE IS WITH AN INPUT 00807000
STRING AS THE STRING REFERENCE. THIS TYPE OF RULE WILL INPUT A 00808000
RECORD (IF POSSIBLE), AND THE INPUT WILL BE LOST. FOR EXAMPLE, IF 00809000
THE PROGRAM HAS USED THE STRING LOOK TO READ THE NEXT CARD FROM THE 00810000
FILE READ, THE CARD CAN BE CLEARED FROM THE BUFFER BY: 00811000
00812000
READ 00813000
00814000
AND THE NEXT INPUT WILL GET THE NEXT RECORD. 00815000
00816000
00817000
00818000
%CP 37 00819000
4.3. RULES WITH PATTERNS. 00820000
00821000
<RULE> ::= <STR REF> <PATTERN> 00822000
00823000
THIS CAUSES A "PATTERN MATCH" TO TAKE PLACE. A PATTERN IS A 00824000
DESCRIPTION OF A STRING, AND A PATTERN MATCH IS AN ATTEMPT TO FIND 00825000
A SUBSTRING OF THE STRING REFERENCE WHICH IS DESCRIBED BY 00826000
THE PATTERN. THE VARIOUS MEANS OF BUILDING PATTERNS ARE DESCRIBED 00827000
IN SECTION 6. THE GENERAL WAY IN WHICH THIS TYPE OF RULE IS 00828000
EXECUTED IS AS FOLLOWS: 00829000
00830000
1) EVALUATE THE STRING REFERENCE. IF IT IS AN INPUT STRING, READ 00831000
A RECORD. 00832000
2) EVALUATE THE PATTERN, FROM LEFT TO RIGHT. 00833000
3) ATTEMPT TO MATCH THE PATTERN ON SOME SUBSTRING OF THE STR REF. 00834000
00835000
OF COURSE, IF ANY PART OF THE RULE FAILS, THE RULE IS TERMINATED, 00836000
AND THE FAILURE PART OF THE GO-TO PART IS EVALUATED. 00837000
FOR EXAMPLE, ASSUME THAT X = "ABCDE" AND E = "BC". THE RULE 00838000
00839000
X E "D" /S(M) 00840000
WILL SUCCEED, AND THE PROGRAM WILL TRANSFER TO M. THE STRING REF- 00841000
ERENCE, "ABCDE", CONTAINS THE PATTERN, E "D", OR "BCD". ON THE 00842000
OTHER HAND, THE RULE 00843000
00844000
X E "C" /S(M) 00845000
WILL FAIL, AND TRANSFER TO M WILL NOT BE MADE, BECAUSE THE STRING 00846000
REFERENCE DOES NOT CONTAIN THE PATTERN E "C", OR "BCC". 00847000
FOR ANOTHER EXAMPLE, THE RULE 00848000
00849000
"1357" D /S(X) 00850000
00851000
WILL SUCCEED (AND TRANSFER TO X) IF D IS ANY OF THE FOLLOWING: "", 00852000
"1", "13", "135", "1357", "3", "35", "357", "5", "57", "7". 00853000
00854000
00855000
00856000
%CP 30 00857000
4.4. RULES WITH REPLACEMENTS. 00858000
00859000
<RULE> ::= <STR REF> <REPLACEMENT> 00860000
<REPLACEMENT> ::= <RPL DELIMITER> <EXPRESSION> 00861000
<RPL DELIMITER> ::= ~ 00862000
::= = 00863000
00864000
THIS IS AN "ASSIGNMENT STATEMENT". THE STRING REFERENCE MUST 00865000
BE A STRING NAME (AN IDENTIFIER OR AN INDIRECT EXPRESSION). THE 00866000
VALUE OF THE <EXPRESSION> BECOMES THE NEW VALUE OF THE STRING 00867000
NAMED. IF THIS STRING IS AN OUTPUT STRING, OUTPUT OCCURS AFTER 00868000
THE ASSIGNMENT. NOTE THAT THERE ARE TWO DELIMITERS LISTED, "~" 00869000
AND "=". MANY COMPUTERS DO NOT HAVE THE "~" IN THEIR CHARACTER 00870000
SETS, SO THEY WILL ONLY ACCEPT A "=". THE B5500 HAS BOTH, AND 00871000
EITHER CAN BE USED TO INDICATE A REPLACEMENT. SOME EXAMPLES OF 00872000
ASSIGNMENT STATEMENTS ARE: 00873000
00874000
X = "123" 00875000
ALPH.1 = BET.3 + GAMM.7 00876000
LIST ~ NUM "/" ITEM "," LIST 00877000
$("X" N) ~ $("X" N) ";" E 00878000
$$FR(A,$B N) = $A $("B" N) FL(A1,A2 "," A3) 00879000
$E ~ F G "." EXP 00880000
I = J 00881000
N = .LT(N,MAX) N + "1" 00882000
00883000
THE LAST EXAMPLE IS A "CONDITIONAL ASSIGNMENT". IF THE CALL OF .LT() 00884000
FAILS (I.E., IF N } MAX), THE STATEMENT WILL FAIL DURING EVALUATION 00885000
OF THE REPLACEMENT, AND THE ASSIGNMENT WILL NOT BE CARRIED OUT. 00886000
00887000
00888000
00889000
%CP 30 00890000
4.5. RULES WITH BOTH PATTERN AND REPLACEMENT. 00891000
00892000
<RULE> ::= <STR REF> <PATTERN> <REPLACEMENT> 00893000
00894000
THIS IS THE MOST COMPLEX FORM OF A RULE, IN WHICH A PATTERN MATCH 00895000
IS ATTEMPTED, AND IF IT SUCCEEDS, THE MATCHED SUBSTRING OF THE STRING 00896000
REFERENCE IS REPLACED WITH THE VALUE OF THE REPLACEMENT EXPRESSION. 00897000
SPECIFICALLY, THE FOLLOWING ACTIONS OCCUR IN THIS TYPE OF RULE: 00898000
00899000
1) THE STRING REFERENCE IS EVALUATED, DOING INPUT IF IT IS AN 00900000
INPUT STRING. 00901000
2) THE PATTERN IS EVALUATED FROM LEFT TO RIGHT. 00902000
3) A PATTERN MATCH IS ATTEMPTED. IF THIS FAILS (AS WITH ANY 00903000
OTHER FAILURE), THE RULE IS TERMINATED AND THE FAILURE EXIT 00904000
IS TAKEN. 00905000
4) THE REPLACEMENT IS EVALUATED. 00906000
5) THE SUBSTRING OF THE STRING REFERENCE MATCHED BY THE PATTERN 00907000
IS REPLACED BY THE VALUE OF THE REPLACEMENT EXPRESSION. IF 00908000
THE STRING REFERENCE IS AN OUTPUT STRING, OUTPUT OCCURS. 00909000
00910000
AS USUAL, ANY PART OF THE RULE CAN FAIL. IF THIS HAPPENS, THE RULE 00911000
IS IMMEDIATELY TERMINATED, AND THE FAILURE PART OF THE GO-TO PART 00912000
IS EVALUATED. 00913000
FOR EXAMPLE, IF AB = "COME", THEN THE RULE 00914000
00915000
AB "OM" = "RAT" 00916000
00917000
WILL SUCCEED, AND GIVE AB THE NEW VALUE "CRATE". IF AB HAD BEEN, 00918000
SAY, "CAME", THE PATTERN MATCH WOULD HAVE FAILED, AND AB WOULD NOT 00919000
HAVE BEEN ALTERED. 00920000
NOTE THAT REPLACEMENT APPLIES ONLY TO THE SUBSTRING MATCHED BY 00921000
THE PATTERN, NOT TO THE WHOLE STRING REFERENCE, AND THAT THE NEW 00922000
VALUE THAT REPLACES THE SUBSTRING NEED NOT BE THE SAME SIZE AS THE 00923000
SUBSTRING. 00924000
AS A SPECIAL CASE, THE REPLACEMENT PART CAN BE EMPTY (SEE 00925000
THE BNF DEFINITION OF <EXPRESSION>). IN THIS CASE, THE REPLACE- 00926000
MENT EXPRESSION IS THE NULL STRING, AND THE MATCHED SUBSTRING IS 00927000
DELETED. FOR EXAMPLE, THE RULE: 00928000
00929000
L A "." = :S(L)F(M) 00930000
00931000
WILL DELETE ALL PERIODS FROM A, AND THEN TRANSFER TO M. 00932000
00933000
00934000
00935000
%SECTION 5 00936000
%PAGE 1 00937000
5. EXPRESSIONS. 00938000
00939000
<EXPRESSION> ::= <ELEMENT> 00940000
::= <EXPRESSION> <CONCATENATE OP> <ELEMENT> 00941000
::= <EMPTY> 00942000
<ELEMENT> ::= <NAMED EXPR> 00943000
::= <VALUE EXPR> 00944000
<NAMED EXPR> ::= <IDENTIFIER> 00945000
::= $ <ELEMENT> 00946000
<VALUE EXPR> ::= <LITERAL> 00947000
::= <GROUPING> 00948000
::= <FCT CALL> 00949000
::= <ARITH EXPR> 00950000
<CONCATENATE OP> ::= <BLANKS> 00951000
<IDENTIFIER> ::= <LETTER> 00952000
::= <IDENTIFIER><LETTER> 00953000
::= <DIGIT> 00954000
::= <IDENTIFIER><DIGIT> 00955000
::= . 00956000
::= <IDENTIFIER> . 00957000
<LITERAL> ::= " <STRING> " 00958000
<GROUPING> ::= ( <EXPRESSION> ) 00959000
<FCT CALL> ::= <FCT NAME>( <PARAMS> ) 00960000
<FCT NAME> ::= <IDENTIFIER> 00961000
<PARAMS> ::= <EXPRESSION> 00962000
::= <PARAMS> , <EXPRESSION> 00963000
<ARITH EXPR> ::= <A-TERM> 00964000
::= - <A-TERM> 00965000
<A-TERM> ::= <A-TERM> <ADD AP> <M-TERM> 00966000
::= <M-TERM> 00967000
<M-TERM> ::= <M-TERM> <MUL OP> <E-TERM> 00968000
::= <E-TERM> 00969000
<E-TERM> ::= <E-TERM> <EXP OP> <ARITH ELT> 00970000
::= <ARITH ELT> 00971000
<ARITH ELT> ::= <NAMED EXPR> 00972000
::= <GROUPING> 00973000
::= <FCT CALL> 00974000
::= <LITERAL> 00975000
<ADD OP> ::= + 00976000
::= - 00977000
<MUL OP> ::= * 00978000
::= | 00979000
::= / 00980000
<EXP OP> ::= ** 00981000
00982000
EXPRESSIONS ARE USED TO GENERATE STRING VALUES, AND TO FORM NEW 00983000
STRINGS FROM OLD. THE VARIOUS TYPES OF EXPRESSIONS ARE DESCRIBED 00984000
IN THE FOLLOWING SECTIONS. 00985000
00986000
00987000
00988000
%CP 12 00989000
5.1. NAMES AND VALUES. 00990000
00991000
IN SNOBOL3, BOTH NAMES AND VALUES OF DATA ARE STRINGS, AND SO IT 00992000
IS QUITE NATURAL THAT THERE SHOULD BE SOME CONFUSION BETWEEN THE 00993000
TWO AMONG PROGRAMMERS; EXPECIALLY SINCE THE INDIRECTION OPERATOR 00994000
("$") PROVIDES A WAY TO MANIPULATE STRING NAMES AS WELL AS 00995000
THEIR VALUES. IN GENERAL, ANY STRING CAN BE USED AS BOTH A NAME 00996000
AND AS A VALUE. ONE RESTRICTION TO THIS IS THAT NAMES THAT APPEAR 00997000
AS SUCH IN SNOBOL CODE CAN ONLY BE THOSE THAT ARE "IDENTIFIERS"-- 00998000
NON-NULL STRINGS OF LETTERS, DIGITS, AND PERIODS. OTHER NAMES 00999000
MUST BE HANDLED INDIRECTLY. 01000000
01001000
01002000
01003000
%CP 25 01004000
5.1.1. LITERALS. 01005000
01006000
THE SIMPLEST WAY TO DESCRIBE A STRING IS TO GIVE THE STRING ITSELF. 01007000
THIS IS DONE BY USING A "LITERAL", WHICH IS A STRING OF CHARACTERS 01008000
BOUNDED BY QUOTES. QUOTES THEMSELVES CAN NOT OCCUR IN LITERALS, AND 01009000
MUST BE HANDLED DIFFERENTLY. SOME EXAMPLES OF LITERALS ARE: 01010000
01011000
"1" 01012000
"A+B" 01013000
"THIS IS A STRING." 01014000
"ABCDEFGHIJKLM" 01015000
" GEORGE Q. SMITH " 01016000
" " 01017000
"" 01018000
01019000
THE LAST LITERAL IS THE NULL STRING, WHICH HAS A POSITION IN STRING 01020000
MANIPULATION SIMILAR TO ZERO IN ARITHMETIC (IN FACT, IT IS THE IDENTITY 01021000
ELEMENT FOR THE OPERATION OF CONCATENATION). 01022000
NOTE THAT, AS IN THE NEXT-TO-LAST EXAMPLE, A BLANK IS AS "GOOD" 01023000
A CHARACTER AS ANY OTHER, AND THE STRING " " IS NOT THE SAME AS 01024000
THE STRING " ". THEY CONTAIN DIFFERENT NUMBERS OF BLANKS. 01025000
TO HANDLE QUOTES, SNOBOL3 PROVIDES A SPECIAL STRING NAME, QUOTE, 01026000
WHICH IS INITIALIZED TO CONTAIN A SINGLE QUOTE AS ITS VALUE. THIS 01027000
CAN, OF COURSE, BE CHANGED BY THE PROGRAM. 01028000
01029000
01030000
01031000
%CP 25 01032000
5.1.2. NAMES 01033000
01034000
IT IS NECESSARY, OF COURSE, TO TALK ABOUT STRINGS WITHOUT SPECIFYING 01035000
(OR KNOWING) THEIR ACTUAL VALUES. SO SNOBOL PROVIDES THE ABILITY TO 01036000
GIVE A STRING A NAME. A NAME IS ITSELF A STRING, WHOSE VALUE IS 01037000
ANOTHER (NOT NECESSARILY DIFFERENT) STRING. IN GENERAL, ANY 01038000
STRING CAN BE USED AS A NAME, BY USING INDIRECTION (SEE THE NEXT 01039000
SECTION). NAMES ARE ASSIGNED VALUES IN TWO DIFFERENT WAYS: BY AN 01040000
"ASSIGNMENT", AND BY USING THE NAME WITH A STRING VARIABLE. SOME 01041000
EXAMPLES OF ASSIGNMENT STATEMENTS ARE: 01042000
01043000
X = "1234" 01044000
I = J 01045000
ALPHA = A B (C+D) FF("-") 01046000
N = .GT(N,"0") N - "1" 01047000
01048000
ANOTHER WAY TO GIVE A STRING NAME A VALUE IS TO ATTACH THE NAME TO 01049000
A STRING VARIABLE IN A PATTERN. IF THE PATTERN MATCH SUCCEEDS, THE 01050000
SUBSTRING MATCHED BY THE STRING VARIABLE WILL BECOME THE NEW 01051000
VALUE OF THE STRING NAME. SOME EXAMPLES ARE: 01052000
01053000
"1234" *X* 01054000
TR "," *I* "/" *J* "," 01055000
C *CH/"1"* *C* 01056000
CARD *R/"72"* *SEQ* 01057000
EXP *(E1)* 01058000
01059000
NOTE THAT THE FIRST EXAMPLE IN THIS SET MEANS THE SAME AS THE FIRST 01060000
EXAMPLE IN THE PREVIOUS SET. 01061000
NAMES THAT ARE USED IN SNOBOL CODE MUST SATISFY THE RESTRICTION 01062000
OF BEING AN "IDENTIFIER"--A NON-NULL STRING OF LETTERS, DIGITS, AND 01063000
PERIODS. ANY OTHER STRING WHICH IS TO BE USED AS A NAME MUST BE 01064000
HANDLED BY INDIRECTION. 01065000
01066000
01067000
01068000
%CP 40 01069000
5.1.3. INDIRECTION. 01070000
01071000
SINCE NAMES AND VALUES IN SNOBOL3 ARE BOTH STRINGS, IT IS USEFUL 01072000
TO BE ABLE TO CONNECT THE TWO. THIS IS DONE BY MEANS OF "INDIRECTION", 01073000
WHICH CONSISTS OF TREATING THE VALUE OF A STRING AS A NAME. THE 01074000
OPERATOR WHICH DOES THIS IS "$", WHICH IS A UNARY PREFIX OPERATOR. 01075000
WHEN "$" IS APPLIED TO AN EXPRESSION, THE VALUE OF THE RESULTING 01076000
EXPRESSION IS THE VALUE OF THE STRING NAMED BY THE ORIGINAL EXPRES- 01077000
SION. PUT ANOTHER, MORE INTUITIVE WAY, THE "$" OPERATOR REPLACES 01078000
ITS ARGUMENT WITH THE THING THAT IT NAMES. A THIRD INTERPETATION IS: 01079000
INDIRECTION REMOVES ONE LAYER OF QUOTES FROM AROUND ITS ARGUMENT. 01080000
FOR EXAMPLE, IF A = "B", B = "C", AND C = "D", THEN $A = $"B" = B 01081000
= "C". SIMILARLY, $$A = $B = C = "D". FOR ANOTHER EXAMPLE, SUPPOSE 01082000
THAT I = "37" AND C37 = "NEW YORK". THEN: 01083000
01084000
$("C" I) = "NEW YORK" 01085000
01086000
FOR YET ANOTHER EXAMPLE, IT WILL BE SHOWN HOW "ARRAYS" CAN BE HANDLED 01087000
IN SNOBOL3, A LANGUAGE THAT DOESNT HAVE ARRAYS AS SUCH AMONG ITS 01088000
DATA TYPES. ARRAY HANDLING CAN BE SIMULATED, HOWEVER, BY USING 01089000
INDIRECTION ON AN EXPRESSION THAT CONTAINS THE "ARRAY NAME" AND 01090000
ALL THE RELEVANT SUBSCRIPTS, SEPARATED BY ANY APPROPRIATE 01091000
DELIMITERS. TO LOOK ALGOL-LIKE, THE DELIMITERS CAN BE BRACKETS 01092000
AND COMMAS. THUS, TO USE THE I, J, K ELEMENT OF THE ARRAY AB, THE 01093000
FOLLOWING EXPRESSION COULD BE USED: 01094000
01095000
$("AB[" I "," J "," K "]") 01096000
01097000
IF I = "3", J = "-2", AND K = "47", THIS WOULD GIVE: 01098000
01099000
AB[3,-2,47] 01100000
01101000
SOME FURTHER EXAMPLES OF EXPRESSIONS INVOLVING INDIRECTION ARE: 01102000
01103000
$I 01104000
$$$C 01105000
$$$$"" 01106000
$"A=I1" 01107000
$($X "/" $B "/" $("N" I)) 01108000
$$F(A,"3") 01109000
$$SIZE(E) 01110000
$("FATHER/" NAME) 01111000
$("NAME-" SOC.SEC.NO.) 01112000
01113000
01114000
01115000
01116000
%CP 45 01117000
5.2. CONCATENATION. 01118000
01119000
THE BASIC STRING OPERATOR IS CONCATENATION, WHICH SIMPLY JOINS ITS 01120000
ARGUMENTS END-TO-END. CONCATENATION IS ASSUMED IN SNOBOL3 WHEN TWO 01121000
STRINGS (LITERALS, NAMES, EXPRESSIONS, ETC.) ARE PLACED NEXT TO 01122000
EACH OTHER WITHOUT AN OPERATOR BETWEEN THEM. SINCE THE OPERATION OF 01123000
CONCATENATION IS ASSOCIATIVE, IT CAN BE USED AS IF IT WERE AN 01124000
OPERATION WITH ANY NUMBER OF OPERANDS, AND SO CONCATENATE EXPRES- 01125000
SIONS CONSIST SIMPLY OF A LIST OF STRINGS TO BE CONCATENATED, WITH 01126000
JUST BLANKS BETWEEN THEM IF A DELIMITER IS NEEDED. SOME EXAMPLES 01127000
OF EXPRESSIONS INVOLVING CONCATENATION ARE: 01128000
01129000
A "," B 01130000
(A "," B) 01131000
("ABC" X) "DE" 01132000
" " ALPHA " " 01133000
LIST ELT "/" PROPS "," 01134000
X1 "," X2 "," X3 "," X4 "," X5 "," X6 01135000
01136000
A "GROUPING" IS SIMPLY A STRING EXPRESSION SURROUNDED BY PAREN- 01137000
THESES. SOME GROUPINGS ARE INCLUDED IN THE ABOVE EXAMPLES. TO 01138000
EVALUATE A GROUPING, ALL THE ELEMENTS WITHIN IT ARE EVALUATED, 01139000
AND A TEMPORARY STORAGE LOCATION IS GIVEN THEIR CONCATENATED VALUE. 01140000
IF THERE IS ONLY ONE OBJECT WITHIN THE PARENTHESES, A NEW TEMPORARY 01141000
VALUE IS CREATED ANYWAY. THIS FACT CAN BE USED IN CASES WHERE LATER 01142000
PART OF THE INSTRUCTION MAY ALTER A VALUE OF A STRING, AND THE OLDER 01143000
VALUE IS THE ONE THAT SHOULD BE USED. FOR EXAMPLE, IF THE FUNCTION 01144000
F() ALTERS THE STRING X, THEN THE EXPRESSION (X F()) WILL USE THE 01145000
NEW VALUE IN THE CONCATENATION. TO FORCE THE GROUPING TO USE THE VALUE 01146000
THAT X HAD BEFORE THE CALL, THE EXPRESSION SHOULD BE: 01147000
01148000
((X) F()) 01149000
01150000
SIMILARLY, IF A PROGRAM CALLS F(READ,READ), THE SECOND PARAMETER 01151000
WILL ASSIGN A NEW VALUE TO READ, AND THE FIRST INPUT CARD WILL BE 01152000
LOST (THE SAME VALUE WILL BE PASSED TO BOTH PARAMETERS). TO CAUSE 01153000
THE FUNCTION TO USE THE OLDER VALUE OF ITS FIRST PARAMETER, THE 01154000
CALL COULD BE F((READ),READ). 01155000
IF A PARAMETER TO A FUNCTION IS AN EXPRESSION INVOLVING CONCATEN- 01156000
ATION, THEN AN IMPLICIT PAIR OF PARENTHESES SURROUNDS THE PARAMETER, 01157000
AND THE CONCATENATION IS PERFORMED BEFORE THE NEXT PARAMETER IS 01158000
EVALUATED. THUS IN F(READ "*",READ), THE PROBLEM MENTIONED 01159000
IN THE PREVIOUS PARAGRAPH IS AVOIDED, SINCE THE FIRST PARAMETER 01160000
IS EVALUATED BEFORE THE SECOND READ IS PERFORMED, AND THE RIGHT 01161000
VALUE WILL BE USED FOR THE FIRST READ. 01162000
THE GROUPING () IS EQUIVALENT TO "". 01163000
01164000
01165000
01166000
%PAGE 01167000
5.3. FUNCTION CALLS. 01168000
01169000
<FCT CALL> ::= <FCT NAME>( <PARAMS> ) 01170000
<FCT NAME> ::= <IDENTIFIER> 01171000
<PARAMS> ::= <EXPRESSION> 01172000
::= <PARAMS> , <EXPRESSION> 01173000
01174000
FUNCTION CALLS ARE USED TO CALL FUNCTIONS. SNOBOL3 PRE-DEFINES 01175000
A LARGE NUMBER OF FUNCTIONS (SEE SECTION 9), AND PROGRAMMERS CAN 01176000
DEFINE OTHERS CODED IN SNOBOL (SEE THE FUNCTION DEFINE() IN SEC. 9 01177000
AND THE -DEFINE CARD IN SEC. 2.2). 01178000
THERE ARE THREE BASIC REASONS FOR CALLING A FUNCTION: 01179000
01180000
1) TO CALCULATE AND RETURN A VALUE. 01181000
2) TO TEST A CONDITION, AND SUCCEED OR FAIL. 01182000
3) TO CAUSE "SIDE EFFECTS"--THAT IS, TO ALTER GLOBAL INFORMATION 01183000
THAT IS TO BE USED BY OTHER PARTS OF THE PROGRAM, OR TO DO 01184000
INPUT OR OUTPUT. 01185000
01186000
A SNOBOL FUNCTION CAN DO ANY COMBINATION OF THESE THINGS. 01187000
THE LATTER IS ESPECIALLY EASY IN SNOBOL, SINCE A PROGRAM-DEFINED 01188000
FUNCTION HAS ACCESS TO ANY VARIABLES IN THE PROGRAM THAT ARE NOT 01189000
EXPLICITLY DECLARED TO BE LOCAL TO IT (THE LIST OF FORMAL PARAMETERS 01190000
AND LOCAL VARIABLES). THIS MEANS ESPECIALLY THAT A FUNCTION GENERALLY 01191000
HAS ACCESS TO ANY OF THE DATA IN USE BY THE PIECE OF CODE THAT CALLED 01192000
IT, WHICH MAY ITSELF BE PART OF A HIGHER-LEVEL FUNCTION. 01193000
FOR DETAILS OF WHAT HAPPENS WHEN A USER-DEFINED FUNCTION IS 01194000
CALLED, SEE SECTION 3.2. SOME SPECIAL DETAILS CONCERNING THE CALL 01195000
ITSELF ARE: 01196000
01197000
1) THE "(" MUST APPEAR IMMEDIATELY AFTER THE FUNCTION NAME. IF THERE 01198000
IS A BLANK BETWEEN THEM, THE COMPILER WILL INTERPRET IT AS THE 01199000
CONCATENATION OF A STRING WITH A GROUPING. 01200000
2) OMITTED PARAMETERS ARE NULL STRINGS. EXTRA PARAMETERS ARE EVAL- 01201000
UATED BUT NOT PASSED TO THE FUNCTION. FOR EXAMPLE: 01202000
F(,X) = F("",X) 01203000
MW(A,,B,C,) = MW(A,"",B,C,"") 01204000
IN THE SECOND EXAMPLE, THE LAST COMMA IS NOT NEEDED. 01205000
3) IF THE FUNCTION BEING CALLED IS NOT DEFINED, THE PROGRAM HAS 01206000
COMMITTED A FATAL ERROR. IF IN DEBUG MODE, THE PROGRAM WILL 01207000
BE SUSPENDED WITH AN EXPLANATORY MESSAGE. IF NOT IN DEBUG 01208000
MODE, A MESSAGE GIVING THE STATEMENT NUMBER AND THE FUNCTION 01209000
NAME WILL BE PRINTED ON THE LINE PRINTER AND TELETYPE, AND THE 01210000
JOB WILL BE TERMINATED ABNORMALLY. 01211000
01212000
SOME EXAMPLES OF FUNCTION CALLS ARE: 01213000
01214000
MV("A",B L,("," X ",")) 01215000
ARRGH(,,B " " X1, "CARD") 01216000
LEVEL() 01217000
.NE(A,"375") 01218000
EQUALS(STR,RES) 01219000
01220000
NOTE ESPECIALLY THE FOLLOWING: 01221000
01222000
F(A) IS A FUNCTION CALL. 01223000
F (A) IS A CONCATENATION. 01224000
F(B ",","1") IS A FUNCTION CALL. 01225000
F (B ",","1") IS A SYNTAX ERROR. (WHY?) 01226000
01227000
01228000
01229000
%PAGE 01230000
5.4. ARITHMETIC. 01231000
01232000
<ARITH EXPR> ::= <A-TERM> 01233000
::= - <A-TERM> 01234000
<A-TERM> ::= <A-TERM> <ADD AP> <M-TERM> 01235000
::= <M-TERM> 01236000
<M-TERM> ::= <M-TERM> <MUL OP> <E-TERM> 01237000
::= <E-TERM> 01238000
<E-TERM> ::= <E-TERM> <EXP OP> <ARITH ELT> 01239000
::= <ARITH ELT> 01240000
<ARITH ELT> ::= <NAMED EXPR> 01241000
::= <GROUPING> 01242000
::= <FCT CALL> 01243000
::= <LITERAL> 01244000
<ADD OP> ::= + 01245000
::= - 01246000
<MUL OP> ::= * 01247000
::= | 01248000
::= / 01249000
<EXP OP> ::= ** 01250000
01251000
A NUMBER IN SNOBOL3 IS A STRING WHICH CONSISTS ONLY OF DIGITS, 01252000
WITH THE POSSIBLE EXCEPTION OF THE FIRST CHARACTER WHICH CAN BE "-". 01253000
ONLY INTEGER ARITHMETIC IS PROVIDED IN SNOBOL3. SOME EXAMPLES 01254000
OF NUMERIC STRINGS ARE: 01255000
01256000
"12" = "00012" 01257000
"-3" = "-00000003" 01258000
"0" = "0000" = "-0" = "-" = "" 01259000
01260000
SOME IMPLEMENTATIONS OF SNOBOL3 INSIST THAT ARITHMETIC BE FULLY 01261000
PARENTHESIZED. THIS IS NOT NECESSARY ON THE B5500, THOUGH USING 01262000
UNPARENTHESIZED ARITHMETIC MAY MAKE A B5500 SNOBOL3 PROGRAM 01263000
INCOMPATIBLE WITH ANOTHER IMPLEMENTATION. THE PRECEDENCE RELATIONS 01264000
ARE BASICALLY THOSE OF FORTRAN OR ALGOL, WITH THE RANKING: 01265000
01266000
EXPONENTIATION ** (HIGH) 01267000
MULTIPLICATION, DIVISION *, |, / 01268000
ADDITION, SUBTRACTION +, - 01269000
CONCATENATION BLANKS (LOW) 01270000
01271000
AMONG OPERATORS OF EQUAL PRECEDENCE, LEFT-ASSOCIATION IS USED. SOME 01272000
ARITHMETIC EXPRESSIONS, WITH PARENTHESISED EQUIVALENTS, ARE: 01273000
01274000
A + B - C = ((A + B) - C) 01275000
A / B * C = ((A / B) * C) 01276000
A - B | C = (A - (B | C)) 01277000
- X / R = (- (X / R)) 01278000
A | B ** "2" = (A | (B ** "2")) 01279000
AL AR - AM = (AL (AR - AM)) 01280000
C + I "0" = ((C + I) "0") 01281000
P ** Q ** R = ((P ** Q) ** R) = P ** (Q | R) 01282000
01283000
01284000
01285000
%CP 25 01286000
5.4.1. DIVISION MODES. 01287000
01288000
THE B5500 HAS THREE WAYS TO HANDLE DIVISION, DEPENDING ON HOW 01289000
REMAINDERS ARE TREATED. THE METHOD USED IS SET BY THE FUNCTION 01290000
MODE(), AS FOLLOWS: 01291000
01292000
MODE("ROUND") CAUSES DIVISION TO BE ROUNDED. 01293000
MODE("TRUNCATION") CAUSES REMAINDERS TO BE DISCARDED. 01294000
MODE("INTEGER") CAUSES DIVISION TO FAIL IF THE REMAINDER ! 0. 01295000
01296000
THE SYSTEM ASSUMES ROUNDING UNLESS MODE() IS USED, SINCE THAT IS 01297000
HOW THE HARDWARE OPERATES, AND IS FASTEST. SOME EXAMPLES OF THE 01298000
DIFFERENCES BETWEEN THE THREE ARE: 01299000
01300000
EXPRESSION ROUNDED TRUNCATED INTEGER 01301000
"4" / "2" "2" "2" "2" 01302000
"5" / "2" "3" "2" FAILS 01303000
"5" / "3" "2" "1" FAILS 01304000
"12" / "4" "3" "3" "3" 01305000
"13" / "4" "3" "3" FAILS 01306000
"14" / "4" "4" "3" FAILS 01307000
"15" / "4" "4" "3" FAILS 01308000
"-3" / "2" "-2" "-1" FAILS 01309000
"9" / "-6" "-2" "-1" FAILS 01310000
"-5" / "3" "-2" "-1" FAILS 01311000
01312000
01313000
01314000
%CP 13 01315000
5.4.2. FAILURE OF ARITHMETIC. 01316000
01317000
THE FOLLOWING CONDITIONS WILL CAUSE FAILURE OF AN ARITHMETIC 01318000
EXPRESSION: 01319000
01320000
1) A NON-NUMERIC ARGUMENT. A STRING IS NUMERIC IF ITS FIRST CHAR- 01321000
ACTER IS "-" OR A DIGIT AND ALL OTHER CHARACTERS ARE DIGITS. 01322000
BOTH "" AND "-" ARE NUMERIC, AND BOTH EQUAL ZERO. 01323000
2) A NUMBER OCCURS WHOSE MAGNITUDE IS GREATER THAN 2**39-1, THE LARGEST 01324000
INTEGER THAT THE B5500 CAN HANDLE. THE DECIMAL VALUE OF THIS 01325000
NUMBER IS 549,755,813,887. 01326000
3) DIVISION BY ZERO. 01327000
4) THE DIVISION MODE IS "INTEGER" AND DIVISION PRODUCES A NON-ZERO 01328000
REMAINDER. 01329000
01330000
01331000
01332000
%CP 30 01333000
5.4.3. ARITHMETIC FUNCTIONS. 01334000
01335000
THIS SECTION DESCRIBES A NUMBER OF FUNCTIONS PRE-DEFINED BY 01336000
SNOBOL WHICH ARE USED WITH NUMBERS. ALL OF THESE FUNCTIONS WILL 01337000
FAIL IF A NON-NUMERIC PARAMETER IS GIVEN THEM. 01338000
01339000
.EQ(A,B) SUCCEEDS IF A AND B REPRESENT THE SAME INTEGER. THIS 01340000
FUNCTION SHOULD BE COMPARED WITH EQUALS(A,B), WHICH DOES A 01341000
STRING COMPARE. SOME EXAMPLES SHOWING THE DIFFERENCES ARE: 01342000
01343000
.EQ("1","01") SUCCEEDS EQUALS("1","01") FAILS 01344000
.EQ("00","") SUCCEEDS EQUALS("00","") FAILS 01345000
.EQ("A","A") FAILS EQUALS("A","A") SUCCEEDS 01346000
.EQ("7","7") SUCCEEDS EQUALS("7","7") SUCCEEDS 01347000
01348000
.EQ() ALWAYS RETURNS A NULL VALUE, AS DO THE FOLLOWING: 01349000
01350000
.NE(A,B) SUCCEEDS IF A ! B. 01351000
.LT(A,B) SUCCEEDS IF A < B. 01352000
.LE(A,B) SUCCEEDS IF A { B. 01353000
.GT(A,B) SUCCEEDS IF A > B. 01354000
.GE(A,B) SUCCEEDS IF A } B. 01355000
.NUM(A) SUCCEEDS IF A IS NUMERIC. 01356000
01357000
.REMDR(A,B) RETURNS THE REMAINDER OF A / B. THIS IS DEFINED AS: 01358000
A - ((A / B) | B) 01359000
WHERE THE DIVISION IS TRUNCATED. 01360000
01361000
01362000
%CP 10 01363000
01364000
5.4.4. ADDITIONAL COMMENTS ON ARITHMETIC. 01365000
01366000
THERE ARE TWO WAYS TO INDICATE MULTIPLICATION, WITH "*" OR 01367000
WITH "|". WHEN USED IN A PATTERN OUTSIDE OF PARENTHESES, "*" WILL 01368000
ALWAYS BE ASSUMED TO BE A STRING VARIABLE ASTERISK, SO EITHER 01369000
"|" OR PARENTHESES SHOULD BE USED IF MULTIPLICATION IS DESIRED. 01370000
ALSO, IF "**" APPEARS OUTSIDE OF PARENTHESES IN A PATTERN, IT WILL 01371000
BE AN UNNAMED ARBITRARY STRING VARIABLE, NOT EXPONENTIATION. 01372000
NOTE THAT THE ONLY UNARY ARITHMETIC OPERATOR IS "-". 01373000
BLANKS ARE NOT NEEDED AROUND ARITHMETIC OPERATORS IN B5500 01374000
SNOBOL3, UNLIKE IN MANY OTHER IMPLEMENTATIONS OF THE LANGUAGE. 01375000
01376000
01377000
01378000
%SECTION 6 01379000
%PAGE 1 01380000
6. PATTERNS. 01381000
01382000
<PATTERN> ::= <ELEMENT> 01383000
::= <STR VAR> 01384000
::= <PATTERN> <PATTERN> 01385000
::= <PATTERN> <BACK REF> 01386000
<STR VAR> ::= <ARB VAR> 01387000
::= <BAL VAR> 01388000
::= <FIXED-LENGTH VAR> 01389000
<ARB VAR> ::= ** 01390000
::= * <NAMED EXPR> * 01391000
<BAL VAR> ::= *()* 01392000
::= *( <NAMED EXPR> )* 01393000
<FIXED-LENGTH VAR> ::= */ <EXPRESSION> * 01394000
::= * <NAMED EXPR> / <EXPRESSION> * 01395000
<BACK REF> ::= <NAMED EXPR> 01396000
01397000
PROBABLY THE MOST IMPORTANT PART OF A SNOBOL INSTRUCTION IS THE 01398000
PATTERN, WHICH IS USED TO IDENTIFY AND ALTER PARTS OF STRINGS ACCORDING 01399000
TO CERTAIN PROPERTIES OF THE STRINGS BEING EXAMINED. A PATTERN 01400000
IS MADE UP OF A LIST OF "PATTERN ELEMENTS", EACH OF WHICH WILL 01401000
"MATCH" A PART OF A STRING IF THAT PART HAS THE PROPERTY DESCRIBED BY 01402000
THE PATTERN ELEMENT. A PATTERN WILL MATCH A STRING IF EACH OF ITS 01403000
ELEMENTS MATCHES A SUBSTRING, AND THE MATCHED SUBSTRINGS ARE ADJACENT. 01404000
IN OTHER WORDS, THE PATTERN IS MATCHED ONE ELEMENT AT A TIME, FROM 01405000
LEFT TO RIGHT, AND EACH PATTERN ELEMENT MUST MATCH A SUBSTRING THAT 01406000
STARTS JUST AFTER THE SUBSTRING MATCHED BY THE PREVIOUS ELEMENT. 01407000
THE BASIC PATTERN ELEMENTS DEFINED IN SNOBOL3 ARE CONSTANTS, STRING 01408000
VARIABLES OF THREE TYPES (ARBITRARY, BALANCED, AND FIXED-LENGTH), 01409000
AND BACK REFERENCES. THE FOLLOWING SUB-SECTIONS DESCRIBE EACH OF 01410000
THESE PATTERN ELEMENTS IN DETAIL. 01411000
01412000
01413000
01414000
%CP 20 01415000
6.1. CONSTANT PATTERN ELEMENTS. 01416000
01417000
A "CONSTANT" PATTERN ELEMENT IS ONE WHICH WILL MATCH ONLY ONE 01418000
STRING. THAT IS, IT IS AN ELEMENT WHICH EVALUATES TO A STRING OF 01419000
CHARACTERS, AND IT WILL MATCH ONLY THAT STRING. EXAMPLES OF CONSTANT 01420000
PATTERN ELEMENTS ARE LITERALS, STRING NAMES, FUNCTION CALLS, AND 01421000
ANY OTHER STRING-VALUED EXPRESSION. FOR EXAMPLE, THE PATTERN 01422000
01423000
A "+" (B C) 01424000
01425000
CONSISTS OF THREE CONSTANT PATTERN ELEMENTS: A, "+", AND (B C). 01426000
IF A = "IS", B = "3", AND C = "K", THEN THIS PATTERN WILL MATCH 01427000
THE STRING "IS+3K". IF EXP = "SQRT(S)=IS+3K-J", THEN THE RULE 01428000
01429000
EXP A "+" (B C) 01430000
01431000
WILL SUCCEED, WITH THE PATTERN MATCHING STARTING AT THE 9TH CHAR- 01432000
ACTER OF THE STRING REFERENCE. 01433000
01434000
01435000
01436000
%CP 45 01437000
6.2. STRING VARIABLES. 01438000
01439000
A STRING VARIABLE IS A PATTERN ELEMENT WHICH WILL MATCH MORE THAN 01440000
ONE STRING, DEPENDING ON THE PROPERTIES OF THE STRING. THERE ARE 01441000
THREE TYPES IN SNOBOL3: "ARBITRARY", "BALANCED", AND "FIXED-LENGTH". 01442000
SEPARATE SUB-SECTIONS BELOW ARE DEVOTED TO EACH TYPE. THIS SECTION 01443000
DESCRIBES SOME PROPERTIES COMMON TO ALL TYPES OF STRING VARIABLES. 01444000
A STRING VARIABLE CAN BE "NAMED" OR "UNNAMED". A NAMED VARIABLE 01445000
IS ONE WHICH CONTAINS A <NAMED EXPR> (SEE THE BNF DEFINITIONS). 01446000
BOTH FORMS ACT THE SAME DURING A PATTERN MATCH; THE DIFFERENCE IS 01447000
THAT IF THE PATTERN MATCH IS SUCCESSFUL, THE STRING NAMED BY THE 01448000
THE STRING VARIABLES ARE ASSIGNED THE MATCHED SUBSTRINGS AS NEW 01449000
VALUES. FOR EXAMPLE, IF X = "1234567", THEN THE RULE 01450000
01451000
X "2" ** "5" 01452000
01453000
WILL SIMPLY SUCCEED AND HAVE NO SIDE-EFFECT, WHILE 01454000
01455000
X "2" *I* "5" 01456000
01457000
WILL SUCCEED AND ASSIGN TO I THE VALUE "34", WHICH IS THE SUBSTRING 01458000
MATCHED BY THE STRING VARIABLE *I*. 01459000
THE ASSIGNMENT OF STRING VARIABLE VALUES IS CARRIED OUT IMMEDIATELY 01460000
AFTER THE PATTERN MATCH, BEFORE THE REPLACEMENT PART (IF ANY) IS 01461000
EVALUATED, SO THE NEW VALUES WILL BE USED IF THE STRING VARIABLE 01462000
NAMES APPEAR IN THE REPLACEMENT. FOR EXAMPLE, IF L = "A,LN,AR,XYZ,CB," 01463000
THEN THE RULE 01464000
01465000
L "," *R* "," *S* "," ~ RPL(R,S) 01466000
01467000
WILL DO A PATTERN MATCH (WHICH WILL SUCCEED), SET R = "LN", SET 01468000
S = "AR", AND THEN CALL RPL("LN","AR"), WHOSE VALUE WILL THEN REPLACE 01469000
THE MATCHED SUB-STRING ",LN,AR,". 01470000
THERE MAY BE SEVERAL STRING VARIABLES WITH THE SAME NAME. THE 01471000
ASSIGNMENTS ARE CARRIED OUT IN A STRICT LEFT-TO-RIGHT ORDER, SO 01472000
EACH STRING WILL END UP WITH THE LAST VALUE ASSIGNED TO IT. FOR 01473000
EXAMPLE, WITH L AS ABOVE, THE RULE 01474000
01475000
L "," *X* "," *X* "," *X* "," 01476000
WILL SUCCEED AND GIVE X THE VALUES "LN", "AR", AND "XYZ". THE LAST 01477000
VALUE, "XYZ", WOULD BE THE VALUE OF X AT THE END OF THE INSTRUCTION. 01478000
IF X WERE AN OUTPUT STRING, OUTPUT WOULD OCCUR THREE TIMES 01479000
DURING THIS RULE. 01480000
01481000
01482000
01483000
%CP 40 01484000
6.2.1. ARBITRARY STRING VARIABLES. 01485000
01486000
<ARB VAR> ::= ** 01487000
::= * <NAMED EXPR> * 01488000
01489000
AN ARBITRARY STRING VARIABLE WILL MATCH ANY STRING (INCLUDING 01490000
THE NULL STRING). AT THE BEGINNING OF A PATTERN (THE LEFT END), 01491000
AN ARBITRARY VARIABLE MATCHES THE LEFT END OF THE STRING REFERENCE, 01492000
AT THE RIGHT END OF A PATTERN, IT MATCHES THE "REST" OF THE STRING 01493000
REFERENCE. FOR EXAMPLE, IF SENT = "WHEN I SAW HER ", THEN 01494000
01495000
SENT *A* " " *B* " " *C* 01496000
01497000
WILL SUCCEED, AND ASSIGN A = "WHEN", B = "I", AND C = "SAW HER ". 01498000
NOTE ESPECIALLY THAT AN ARBITRARY STRING VARIABLE WILL MATCH A NULL 01499000
STRING IF POSSIBLE, SO FOR EXAMPLE, IF X = "++", THEN 01500000
01501000
X *I* "+" *J* "+" 01502000
01503000
WILL SUCCEED AND SET BOTH I AND J TO "". 01504000
IF SEVERAL ARBITRARY STRING VARIABLES ARE ADJACENT TO EACH OTHER, 01505000
ALL BUT THE LAST ONE WILL ALWAYS MATCH THE NULL STRING. AN EXAMPLE 01506000
OF A USE FOR THIS IS: 01507000
01508000
STR *V* ** "-" 01509000
01510000
THIS INSTRUCTION WILL SEARCH STR FOR A MINUS SIGN, AND IF IT FINDS 01511000
ONE, IT WILL SET V TO NULL. FOR ANOTHER EXAMPLE, TO ASSIGN A TO 01512000
B AND SIMULTANEOUSLY SET I, J, K, L, AND M NULL, THE FOLLOWING 01513000
STATEMENT COULD BE USED: 01514000
01515000
A *I* *J* *K* *L* *M* *B* 01516000
01517000
THE GENERAL RULE FOR MATCHING AN ARBITRARY VARIABLE IS: 01518000
01519000
1) MATCH THE PRECEDING ELEMENT, IF THERE IS ONE, AS FAR TO THE 01520000
LEFT AS POSSIBLE. 01521000
2) MATCH THE FOLLOWING ELEMENT, IF THERE IS ONE, AS CLOSE AFTER 01522000
THE PRECEDING ONE AS POSSIBLE. 01523000
3) THE ARBITRARY VARIABLE THEN MATCHES EVERYTHING BETWEEN THE STRINGS 01524000
MATCHED BY THE SURROUNDING ELEMENTS, OR IF EITHER OF THESE IS 01525000
MISSING, THE VARIABLE EXTENDS TO THE APPROPRIATE END OF THE STRING. 01526000
01527000
01528000
01529000
%CP 45 01530000
6.2.2. BALANCED STRING VARIABLES. 01531000
01532000
<BAL VAR> ::= *()* 01533000
::= *( <NAMED EXPR> )* 01534000
01535000
A BALANCED STRING VARIABLE WILL MATCH ANY STRING WHICH IS NON-NULL 01536000
AND HAS BALANCED PARENTHESES. THAT IS, THERE MUST BE THE SAME NUMBER 01537000
OF RIGHT PARENTHESES AS THERE ARE LEFT PARENTHESES (POSSIBLY NONE 01538000
OF EITHER), AND THE FIRST PARENTHESIS MUST BE A "(". THUS A BALANCED 01539000
VARIABLE WILL MATCH ANY OF THE FOLLOWING: 01540000
01541000
"ABCD" 01542000
" " 01543000
"()" 01544000
"A(BLMX)+D" 01545000
"A + (B - C)" 01546000
"(F(1,2) + (ALPHA ** 2))" 01547000
"HE SAID (VERY SOFTLY) THAT " 01548000
"((())(()))(()(()))" 01549000
01550000
A BALANCED VARIABLE WILL NOT MATCH ANY OF: 01551000
01552000
"" 01553000
"(" 01554000
")(" 01555000
"A+B)" 01556000
"(A))" 01557000
"VERY SOFTLY) THAT " 01558000
" ) + (A - M) " 01559000
01560000
UNLIKE ARBITRARY STRING VARIABLES, BALANCED VARIABLES ARE NOT 01561000
EXTENDED TO THE RIGHT WHEN THEY END A PATTERN, THOUGH AT THE START 01562000
OF A PATTERN THEY EXTEND AS FAR LEFT AS POSSIBLE. FOR EXAMPLE, IF 01563000
01564000
EXPR = "(A+(LIM(P/Q,Q,1)-SIN(LN(1-ALPH)))|(2**N)|3)-N" 01565000
01566000
THEN THE RULE 01567000
01568000
EXPR *(L)* "|" *(R)* 01569000
01570000
WILL SUCCEED, AND SET L = "A+(LIM(P/Q,Q,1)-SIN(LN(1-ALPH)))", 01571000
AND R = "(2**N)". L WILL INCLUDE THE INITIAL "A+", BUT R 01572000
WILL NOT BE EXTENDED TO INCLUDE THE "|3", THOUGH "(2**N)|3" 01573000
WOULD BE A VALID MATCH FOR A BALANCED VARIABLE. 01574000
01575000
01576000
01577000
%CP 30 01578000
6.2.3. FIXED-LENGTH STRING VARIABLES. 01579000
01580000
<FIXED-LENGTH VAR> ::= */ <EXPRESSION> * 01581000
::= * <NAMED EXPR> / <EXPRESSION> * 01582000
01583000
A FIXED-LENGTH STRING VARIABLE WILL MATCH ANY STRING WITH A GIVEN 01584000
NUMBER OF CHARACTERS. THE <EXPRESSION> MUST BE NUMERIC AND NON- 01585000
NEGATIVE, OR THE PATTERN WILL FAIL DURING EVALUATION AND THE PATTERN 01586000
MATCH WILL NOT TAKE PLACE. ONE SORT OF USE OF A FIXED-LENGTH VARIABLE 01587000
IS TO PICK OFF INITIAL STRINGS, USUALLY ONE CHARACTER: 01588000
01589000
STR *CH/"1"* = /F(OUT) 01590000
01591000
THIS WILL ASSIGN TO CH THE FIRST CHARACTER OF STR AND DELETE THAT 01592000
CHARACTER FROM STR. IF STR IS NULL, THE STATEMENT WILL FAIL AND 01593000
TRANSFER TO OUT. FOR ANOTHER EXAMPLE, TO GET THE LAST N CHARACTERS 01594000
OF A STRING S: 01595000
01596000
S */SIZE(S)-N* *TAIL* /F(TOO.SMALL) 01597000
01598000
THE UNNAMED FIXED-LENGTH VARIABLE WILL MATCH ALL BUT THE LAST N 01599000
CHARACTERS OF S, AND THE ARBITRARY VARIABLE WILL GET THE LAST N. 01600000
IF S HAS FEWER THAN N CHARACTERS, THE FIXED-LENGTH VARIABLE WILL 01601000
HAVE A NEGATIVE LENGTH, AND WILL FAIL DURING EVALUATION OF THE PATTERN. 01602000
NOTE THAT THE FIRST EXAMPLE ABOVE COULD BE WRITTEN: 01603000
01604000
STR *CH/"1" *STR* /F(OUT) 01605000
01606000
01607000
01608000
%CP 30 01609000
6.3. BACK REFERENCES. 01610000
01611000
ANOTHER TYPE OF PATTERN ELEMENT IS THE "BACK REFERENCE". THIS 01612000
IS A STRING NAME WHICH IS THE SAME AS THE NAME OF A PREVIOUS STRING 01613000
VARIABLE. A BACK REFERENCE WILL MATCH A STRING WHICH IS IDENTICAL 01614000
TO THE STRING MATCHED BY THE STRING VARIABLE. FOR EXAMPLE, IN 01615000
01616000
X *H* "E" H 01617000
01618000
THE BACK REFERENCE, H, MUST MATCH THE SAME STRING AS THE ARBITRARY 01619000
VARIABLE, *H*. IF X = "ABEBCA", THE RULE WILL SUCCEED AND SET H = "B". 01620000
SIMILARLY, IF EXP IS AN ALGEBRAIC EXPRESSION, THEN 01621000
01622000
EXP *(P)* ** P :F(NONE) 01623000
01624000
WILL LOOK FOR A SUB-EXPRESSION THAT OCCURS TWICE, AND IF THERE ARE 01625000
NONE, IT WILL TRANSFER TO NONE. 01626000
THERE CAN BE SEVERAL BACK REFERENCES TO THE SAME STRING VARIABLE. 01627000
EACH SUCH BACK REFERENCE MUST MATCH THE SAME STRING. FOR EXAMPLE 01628000
01629000
X *S/"1"* S S 01630000
WILL SUCCEED ONLY IF X CONTAINS THREE CONSECUTIVE IDENTICAL CHARACTERS. 01631000
IF THERE ARE SEVERAL STRING VARIABLES WITH THE SAME NAME, A BACK 01632000
REFERENCE WILL MATCH THE LAST SUCH VARIABLE THAT PRECEDES IT. FOR 01633000
EXAMPLE, THE RULE 01634000
01635000
AL *X* " " *X* " " X 01636000
01637000
WILL SUCCEED FOR THE STRING AL = "AB CD CDEF", AND SET X = "CD". THE 01638000
FIRST STRING VARIABLE WILL MATCH THE STRING "AB". 01639000
01640000
01641000
01642000
%CP 40 01643000
6.4. PATTERN MATCH MODES. 01644000
01645000
NORMALLY, A PATTERN WILL MATCH ANYWHERE IN THE STRING REFERENCE 01646000
THAT IT FINDS AN APPROPRIATE SUB-STRING. SOMETIMES IT IS DESIRABLE TO 01647000
FORCE THE PATTERN TO MATCH STARTING AT THE FIRST CHARACTER OF THE 01648000
STRING REFERENCE. A PATTERN THAT CAN ONLY MATCH AN INITIAL SUB-STRING 01649000
IS CALLED "ANCHORED". PATTERNS THAT CAN MATCH ANYWHERE (THE USUAL KIND)01650000
ARE CALLED "UNANCHORED". 01651000
THERE ARE TWO METHODS OF INDICATING WHETHER OR NOT A PATTERN IS TO BE01652000
ANCHORED. ONE IS BY USING THE MODE FUNCTION: MODE("ANCHOR") SETS A 01653000
SWITCH AT CAUSES ALL PATTERNS TO BE ANCHORED; MODE("UNANCH") RESETS 01654000
THE SWITCH SO THAT PATTERNS ARE UNANCHORED. EITHER OF THESE MODES 01655000
CAN BE CANCELED FOR A SINGLE INSTRUCTION BY USING THE FUNCTIONS 01656000
ANCHOR() AND UNANCH(). ANCHOR() CAUSES THE INSTRUCTION THAT IT IS 01657000
IN TO BE ANCHORED, NO MATTER WHAT THE MODE IS. SIMILARLY, UNANCH() 01658000
CAUSES ITS PATTERN TO BE UNANCHORED, NO MATTER WHAT THE MODE. IF 01659000
MODE() IS NOT USED, SNOBOL ASSUMES THAT THE MODE IS UNANCHORED. 01660000
TO SHOW THE DIFFERENCE, SUPPOSE THAT E = ")(A+B)(". THEN 01661000
01662000
E *(F)* 01663000
01664000
WILL SUCCEED, AND SET F = "(A+B)". HOWEVER, THE RULE 01665000
01666000
E ANCHOR() *(F)* 01667000
01668000
WILL FAIL, SINCE THE PATTERN IS RESTRICTED TO MATCHING AN INITIAL 01669000
SUBSTRING, AND NO BALANCED STRING CAN START WITH ")". IF MODE("ANCHOR")01670000
HAD BEEN CALLED, THEN THE FIRST RULE WOULD ALSO HAVE FAILED. 01671000
FOR ANOTHER EXAMPLE, SUPPOSE X = "ABCDE". THEN THE RULE 01672000
01673000
X "C" *I* 01674000
01675000
WILL SUCCEED (IF THE MODE IS UNANCHORED), AND SET I = "DE". BUT 01676000
THE ANCHORED RULE: 01677000
01678000
X ANCHOR() "C" *I* 01679000
01680000
WILL FAIL, BECAUSE THE FIRST CHARACTER OF X IS NOT "C". 01681000
01682000
01683000
01684000
%CP 50 01685000
6.5. ASSIGNMENT OF STRING VARIABLES. 01686000
01687000
IF A PATTERN MATCH SUCCEEDS, THE STRING NAMES ASSOCIATED WITH 01688000
ITS STRING VARIABLES ARE ASSIGNED THE VALUES OF THEIR SUBSTRINGS 01689000
IN A STRICT LEFT-TO-RIGHT ORDER. THIS MEANS THAT IF SEVERAL STRING 01690000
VARIABLES HAVE THE SAME NAME, THE RIGHT-MOST ONE WILL DETERMINE 01691000
THE VALUE ASSIGNED TO THE NAME; THE OTHERS WILL BE ASSIGNED THEIR 01692000
APPROPRIATE VALUES, AND THEN RE-ASSIGNED. IF THE STRINGS HAVE ANY 01693000
OUTPUT USE, OUTPUT WILL OCCUR FOR EACH ASSIGNMENT. FOR EXAMPLE, 01694000
IF THE RULE 01695000
01696000
X *PRINT* "," *PRINT* "," *PRINT* 01697000
01698000
SUCCEEDS, THE THREE STRINGS ASSIGNED TO PRINT WILL ALL BE WRITTEN 01699000
ON THE LINE PRINTER. 01700000
FURTHERMORE, THE ASSIGNMENT IS DONE IMMEDIATELY AFTER THE PATTERN 01701000
MATCH, BEFORE THE REPLACEMENT AND GO-TO PARTS ARE EVALUATED, TO ANY 01702000
STRING NAMES USED, SAY, BOTH AS A STRING VARIABLE NAME AND IN THE 01703000
REPLACEMENT WILL HAVE THE NEW VALUE WHEN THE REPLACEMENT IS EVALUATED. 01704000
FOR EXAMPLE, IF AST = "XZ.AB", THEN IN THE RULE 01705000
01706000
AST "." *L* = "." DBL(I,L) 01707000
01708000
THE VALUE PASSED TO THE SECOND PARAMETER OF DBL() WILL BE "AB". 01709000
A RATHER INTERESTING SITUATION OCCURS WHEN THE STRING REFERENCE 01710000
HAS THE SAME NAME AS A STRING VARIABLE. FOR EXAMPLE, THE RULE 01711000
01712000
I *I* "+" *J* 01713000
01714000
WILL FIRST ASSIGN A NEW VALUE TO I, THEN ATTEMPT TO ASSIGN A VALUE TO J.01715000
BUT BY THIS TIME, I HAS BEEN CHANGED, AND I WAS THE STRING REFERENCE. 01716000
THERE IS CLEARLY NO LONGER ANYTHING MEANINGFUL TO ASSIGN TO J, AND 01717000
SUCH INSTRUCTIONS SHOULD BE AVOIDED. IN GENERAL, J WOULD BE EXPECTED 01718000
TO CONTAIN RATHER ARBITRARY GARBAGE. A SIMILAR RULE THAT ACHIEVES 01719000
WHAT MOST PEOPLE WOULD ASSUME TO BE THE BEST MEANING OF THIS RULE IS 01720000
01721000
(I) *I* "+" *J* 01722000
01723000
IN THIS CASE, THE STRING REFERENCE IS NOT I ITSELF, BUT A GROUPING 01724000
THAT HAS THE SAME VALUE AS I. SINCE THE STRING VARIABLES ARE NO 01725000
LONGER NAMED THE SAME AS THE STRING REFERENCE (THE STRING REFERENCE 01726000
HAS NO NAME AT ALL), THE PROBLEM DOESNT ARISE. 01727000
IT IS AT TIMES USEFUL TO HAVE THE LAST STRING VARIABLE IN A 01728000
PATTERN NAMED THE SAME AS THE STRING REFERENCE. FOR EXAMPLE, THE 01729000
FOLLOWING TWO STATEMENTS ARE EQUIVALENT: 01730000
01731000
ST *WD* " " = /F(E) 01732000
ST *WD* " " *ST* /F(E) 01733000
01734000
01735000
01736000
%CP 35 01737000
6.6. PATTERN MATCH ALGORITHM. 01738000
01739000
THERE ARE USUALLY MANY WAYS FOR A PATTERN MATCH TO SUCCEED. WHEN 01740000
THIS IS TRUE, THERE IS A CLEAR NEED FOR A WAY TO DETERMINE WHICH 01741000
OF THE POSSIBLE MATCHES WILL BE THE ONE CHOSEN BY SNOBOL, SO THE 01742000
PROGRAMMER CAN PREDICT WHAT VALUES WILL BE ASSIGNED TO THE STRING 01743000
VARIABLES AND WHICH SUBSTRING WILL BE REPLACED. 01744000
AS A GENERAL, INTUITIVE RULE, THE PROGRAMMER SHOULD REMEMBER THAT 01745000
A PATTERN MATCH PROCEEDS FROM LEFT TO RIGHT, AND EACH ELEMENT IS MATCHED01746000
WITH THE SHORTEST SUBSTRING POSSIBLE CONSISTENT WITH THE SUCCESS OF THE 01747000
REST OF THE PATTERN. THAT IS, THE PREFERRED MATCH WILL BE THE ONE 01748000
FOR WHICH AN "EARLIER" PATTERN ELEMENT MATCHES AS FAR LEFT AS POSSIBLE. 01749000
THE GENERAL RULES GOVERNING A PATTERN MATCH ARE: 01750000
01751000
1) TRY TO MATCH THE FIRST PATTERN ELEMENT STARTING AT THE FIRST CHAR- 01752000
ACTER OF THE STRING REFERENCE. AN ARBITRARY VARIABLE STARTS 01753000
BY MATCHING THE NULL STRING. IF THIS MATCH FAILS, GO TO STEP 5. 01754000
2) IF THERE ARE NO MORE ELEMENTS, GO TO STEP 6. 01755000
3) IF THERE IS A NEXT ELEMENT, TRY TO MATCH IT AT THE CHARACTER 01756000
AFTER THE SUBSTRING MATCHED BY THE PRECEDING ELEMENT. IF THIS 01757000
SUCCEEDS, GO TO STEP 2. 01758000
4) IF THERE IS NO PREVIOUS ELEMENT, GO TO STEP 5. IF 01759000
THERE IS A PREVIOUS ELEMENT, TRY TO EXTEND IT TO MATCH A LONGER 01760000
STRING (ONLY ARBITRARY AND BALANCED STRING VARIABLES CAN BE 01761000
EXTENDED). IF THIS SUCCEEDS, GO BACK TO STEP 3 AND TRY TO RE-MATCH 01762000
THE CURRENT ELEMENT. IF THE EXTENSION CANT BE MADE, GO TO STEP 4. 01763000
5) IF THE PATTERN IS ANCHORED, THE PATTERN MATCH FAILS. IF IT IS 01764000
NOT ANCHORED, THEN TRY TO FIND ANOTHER MATCH FOR THE FIRST ELEMENT 01765000
STARTING AT A LATER CHARACTER. IF THIS CANT BE DONE, THE MATCH 01766000
FAILS. IF IT CAN BE DONE, GO TO STEP 2. 01767000
6) IF THE LAST PATTERN ELEMENT IS AN ARBITRARY VARIABLE, EXTEND IT 01768000
TO INCLUDE THE REST OF THE STRING REFERENCE. THE PATTERN MATCH 01769000
HAS SUCCEEDED, AND THE ASSIGNMENT TO THE STRING VARIABLE NAMES 01770000
CAN BE MADE. 01771000
01772000
01773000
01774000
%SECTION 7 01775000
%PAGE 1 01776000
7. GO-TO PARTS, LABELS. 01777000
01778000
<GO-TO PART> ::= <GO-TO DELIMITER> <GO-TOS> 01779000
<GO-TO DELIMITER> ::= <BLANKS> / 01780000
::= : 01781000
<GO-TOS> ::= <UNCONDITIONAL GO-TO> 01782000
::= <SUCCESS GO-TO> 01783000
::= <FAILURE GO-TO> 01784000
::= <SUCCESS GO-TO> <FAILURE GO-TO> 01785000
::= <FAILURE GO-TO> <SUCCESS GO-TO> 01786000
<UNCONDITIONAL GO-TO> ::= ( <LABEL EXPR> ) 01787000
<SUCCESS GO-TO> ::= S( <LABEL EXPR> ) 01788000
<FAILURE GO-TO> ::= F( <LABEL EXPR> ) 01789000
<LABEL EXPR> ::= <RESERVED LABEL> 01790000
::= <LABEL> 01791000
::= <COMPUTED LABEL> 01792000
<RESERVED LABEL> ::= END 01793000
::= RETURN 01794000
::= FRETURN 01795000
<COMPUTED LABEL> ::= $ <ELEMENT> 01796000
01797000
01798000
01799000
%CP 10 01800000
7.1 LABELS. 01801000
01802000
ANY INSTRUCTION IN A SNOBOL PROGRAM CAN BE LABELED. A LABEL IS 01803000
A NON-NULL STRING PRECEDING THE FIRST BLANK OF AN INSTRUCTION. IT 01804000
FOLLOWS FROM THIS DEFINITION THAT LABELS CANT CONTAIN BLANKS. IF 01805000
THE FIRST CHARACTER OF AN INSTRUCTION IS A BLANK, THE INSTRUCTION 01806000
IS UNLABELED. ASIDE FROM THE SPECIAL CHARACTERS IN COLUMN ONE, THERE 01807000
ARE NO RESTRICTIONS ON THE CHARACTERS THAT CAN BE USED IN LABELS. 01808000
01809000
01810000
01811000
%CP 45 01812000
7.2. SIMPLE GO-TO PARTS. 01813000
01814000
THE GO-TO PART OF AN INSTRUCTION DETERMINES WHICH INSTRUCTION IS 01815000
TO BE EXECUTED NEXT. IF THERE IS NO GO-TO PART, OR IF THE GO-TO 01816000
PART DOESNT APPLY WHEN THE INSTRUCTION IS EXECUTED, THEN THE NEXT 01817000
INSTRUCTION TO BE EXECUTED IS THE NEXT ONE IN THE PROGRAM. 01818000
BRANCHING IN SNOBOL3 CAN BE EITHER UNCONDITIONAL OR CONDITIONED 01819000
ON THE SUCCESS OR FAILURE OF THE INSTRUCTION. THE GO-TO PART CAN 01820000
BE SET OFF BY EITHER A "/" (WHICH MUST BE PRECEDED BY A BLANK) OR BY 01821000
A ":". MANY IMPLEMENTATIONS OF SNOBOL3 ONLY USE THE "/", USUALLY 01822000
BECAUSE THEIR CHARACTER SETS DONT INCLUDE ":". THE B5500 WILL 01823000
ACCEPT EITHER DELIMITER. 01824000
A SIMPLE GO-TO PART CONSISTS OF A LABEL WITHIN PARENTHESES. 01825000
FOR EXAMPLE: 01826000
01827000
:(L) MEANS "GO TO L". 01828000
:S(X1) MEANS "IF THE RULE SUCCEEDED, GO TO X1". 01829000
:F(AX) MEANS "IF THE RULE FAILED, GO TO AX". 01830000
:S(BY)F(AGAIN) MEANS "IF SUCCEEDED, GO TO BY, OTHERWISE GO 01831000
TO AGAIN". 01832000
/F(E)S(BACK) MEANS "IF FAILED, GO TO E, OTHERWISE GO TO BACK". 01833000
/S(BLXGQ) MEANS "IF SUCCEEDED, GO TO BLXGQ". 01834000
/(A+T$) MEANS "GO TO A+T$". 01835000
01836000
THE B5500 ALLOWS THE USER TO OMIT THE "S" OR "F" ON THE SECOND PART 01837000
WHEN BOTH SUCCESS AND FAILURE EXITS ARE USED. THUS 01838000
01839000
:S(A)(B) MEANS :S(A)F(B) 01840000
/F(L1)(L2) MEANS /F(L1)S(L2) 01841000
01842000
THERE ARE A FEW RESTRICTIONS ON LABELS THAT CAN BE USED IN A SIMPLE 01843000
GO-TO PART. THESE VARY FROM ONE IMPLEMENTATION TO ANOTHER; ON THE 01844000
B5500 THEY ARE: 01845000
01846000
1) THE FIRST CHARACTER MUST BE A LETTER OR A DIGIT. 01847000
2) THE LABELS CANT CONTAIN PARENTHESES. 01848000
01849000
FOR EXAMPLE, THE FOLLOWING LABELS, THOUGH VALID LABELS, CANT BE 01850000
USED IN SIMPLE GO-TO PARTS: 01851000
01852000
AB) 01853000
+25 01854000
$$A 01855000
AB(2) 01856000
01857000
01858000
01859000
01860000
%CP 20 01861000
7.3. RESERVED LABELS. 01862000
01863000
THERE ARE THREE "RESERVED LABELS" THAT CAN BE USED IN SIMPLE 01864000
GO-TO PARTS. THESE ARE NOT REALLY LABELS, BUT RATHER COMMANDS 01865000
TO PERFORM CERTAIN ACTIONS. THEY ARE: 01866000
01867000
END CAUSES THE PROGRAM TO BE TERMINATED NORMALLY. 01868000
RETURN CAUSES A RETURN FROM THE LAST PROGRAMMER-DEFINED FUNCTION 01869000
WHICH WAS CALLED. THE RETURN IS SUCCESSFUL. 01870000
FRETURN CAUSES A RETURN ALSO, BUT THE FUNCTION FAILS. 01871000
01872000
A PROGRAM CAN USE RETURN AND FRETURN AS LABELS, BUT THEY CANT BE 01873000
TRANSFERED TO BY A SIMPLE GO-TO; A COMPUTED GO-TO MUST BE USED. 01874000
IF THE PROGRAMMER DOESNT DEFINE THESE LABELS, THE COMPILER WILL 01875000
DEFINE THEM AS FOLLOWS: 01876000
01877000
RETURN :(RETURN) 01878000
FRETURN :(FRETURN) 01879000
01880000
01881000
01882000
%CP 12 01883000
7.4. COMPUTED GO-TOS. 01884000
01885000
A PROGRAM CAN COMPUTE THE LABEL THAT AN INSTRUCTION IS TO TRANSFER 01886000
TO BY USING A CONSTRUCT THAT LOOKS EXACTLY LIKE INDIRECTION INSTEAD 01887000
OF A LABEL IN A GO-TO PART. THE VALUE OF THE EXPRESSION FOLLOWING 01888000
THE "$" IS THE LABEL TRANSFERED TO. FOR EXAMPLE, IF X = "1" AND 01889000
Y = "AL", THEN: 01890000
01891000
/S($("A" X)) MEANS /S(A1) 01892000
:F($Y) MEANS :F(AL) 01893000
:S($(X Y))F($(Y X)) MEANS :S(1AL)F(AL1) 01894000
:($("M" X "." SIZE(Y))) MEANS :(M1.2) 01895000
01896000
01897000
01898000
%CP 15 01899000
7.5. ERRORS IN GO-TO PARTS. 01900000
01901000
THERE ARE TWO FATAL ERRORS THAT CAN OCCUR IN A GO-TO PART. IF 01902000
A PROGRAM ATTEMPTS TO TRANSFER TO A LABEL THAT ISNT DEFINED, THE 01903000
PROGRAM IS TERMINATED ABNORMALLY WITH A MESSAGE GIVING THE ERROR, 01904000
THE STATEMENT NUMBER, AND THE ERRONEOUS LABEL. 01905000
IF A COMPUTED GO-TO CONTAINS A FUNCTION CALL, AND THE FUNCTION 01906000
FAILS, THE PROGRAM IS AGAIN TERMINATED ABNORMALLY, AND A MESSAGE 01907000
IS PRINTED SAYING THAT THE GO-TO PART FAILED, GIVING THE STATEMENT 01908000
NUMBER. 01909000
OF COURSE, IF THE USER IS USING DEBUG MODE, THE PROGRAM WILL NOT 01910000
BE TERMINATED. INSTEAD, THE ERROR MESSAGES WILL BE PRINTED ON THE 01911000
LINE PRINTER AND TELETYPE AND THE PROGRAM WILL BE SUSPENDED. 01912000
01913000
01914000
01915000
%SECTION 8 01916000
%PAGE 1 01917000
8. FAILURE. 01918000
01919000
AN EXTREMELY IMPORTANT CONCEPT IN SNOBOL IS THAT OF "FAILURE". 01920000
A SNOBOL INSTRUCTION CAN BE VIEWED AS A COMMAND TO ATTEMPT CERTAIN 01921000
ACTIONS; IF THE INSTRUCTION CANT BE CARRIED OUT, IT IS TERMINATED 01922000
AT THE POINT WHERE IT HAS TO BE STOPPED. THE GO-TO PART OF AN INST- 01923000
RUCTION PROVIDES THE PROGRAMMER WITH A WAY TO BRANCH ON THE SUCCESS 01924000
OR FAILURE OF THE INSTRUCTION. MOST BRANCHING IN SNOBOL PROGRAMS 01925000
IS DONE THIS WAY; THE OTHER METHOD (COMPUTING THE LABEL OF THE 01926000
NEXT INSTRUCTION) IS USUALLY RATHER RARE. 01927000
IT SHOULD BE EMPHASIZED THAT FAILURE CAN OCCUR AT VIRTUALLY ANY 01928000
PART OF AN INSTRUCTION, AND WHEN FAILURE OCCURS, THE INSTRUCTION 01929000
TERMINATES IMMEDIATELY AND THE FAILURE EXIT (IF ONE EXISTS) IS TAKEN. 01930000
THERE ARE TWO RATHER VITAL POINTS NECESSARY TO SUCCESSFUL USE OF 01931000
FAILURE: WHAT CAUSES FAILURE, AND WHAT WILL BE LEFT UNDONE WHEN 01932000
AN INSTRUCTION FAILS AT A PARTICULAR POINT. 01933000
01934000
01935000
01936000
%CP 18 01937000
8.1. CAUSES OF FAILURE. 01938000
01939000
THE FOLLOWING CONDITIONS CAUSE FAILURE OF AN INSTRUCTION: 01940000
01941000
1) FAILURE OF THE PATTERN MATCH. 01942000
2) FUNCTION FAILURE. INTRINSIC FUNCTIONS FAIL WHEN THEIR DESCRIPTIONS 01943000
SAY THEY SHOULD (ASSUMING NO BUGS); PROGRAM-DEFINED FUNCTIONS 01944000
FAIL WHEN THEY USE FRETURN IN A GO-TO PART. 01945000
3) FAILURE OF ARITHMETIC. THERE ARE SEVERAL REASONS FOR THIS: 01946000
NON-NUMERIC ARGUMENTS, VALUES TOO BIG FOR THE HARDWARE TO HANDLE; 01947000
DIVISION BY ZERO, DIVISION WITH INTEGER MODE THAT GIVES A 01948000
NON-ZERO REMAINDER. 01949000
4) I/0 FAILS WHEN THE OPERATION CANT BE COMPLETED. FOR FILES, THIS 01950000
MEANS END-OF-FILE OR PARITY ERRORS. FOR TELETYPES, FAILURE IS 01951000
CAUSED BY EXCEEDING THE WAIT TIME OR USING THE BREAK KEY DURING 01952000
OUTPUT, OR FOR VARIOUS ABNORMAL CONDITIONS. 01953000
5) A FIXED-LENGTH VARIABLE FAILS DURING EVALUATION IF ITS LENGTH 01954000
IS NON-NUMERIC OR NEGATIVE. 01955000
01956000
01957000
01958000
%CP 25 01959000
8.2. ORDER OF EXECUTION. 01960000
01961000
IN ORDER TO KNOW HOW MUCH WILL BE DONE WHEN AN INSTRUCTION FAILS, 01962000
IT IS NECESSARY TO KNOW THE EXACT ORDER IN WHICH AN INSTRUCTION IS 01963000
EXECUTED. THE RULES GOVERNING THE ORDER OF EXECUTION ARE: 01964000
01965000
1) ALL EXPRESSIONS ARE EVALUATED FROM LEFT TO RIGHT. FUNCTIONS ARE 01966000
CALLED AS SOON AS ALL PARAMETERS HAVE BEEN EVALUATED. ARITHMETIC 01967000
OPERATORS ARE APPLIED AS SOON AS BOTH OPERANDS HAVE BEEN EVALUATED. 01968000
2) THE STRING REFERENCE IS THE FIRST PART OF A RULE THAT IS EVALUATED. 01969000
3) AFTER THE STRING REFERENCE, THE PATTERN IS EVALUATED FROM LEFT TO 01970000
RIGHT. NAMES OF STRING VARIABLES ARE EVALUATED WHEN THE STRING VAR- 01971000
IABLE IS ENCOUNTERED. 01972000
4) AFTER THE PATTERN IS EVALUATED, THE PATTERN MATCH TAKES PLACE. 01973000
5) AFTER THE PATTERN MATCH, STRING VARIABLES (IF ANY) ARE ASSIGNED 01974000
THEIR MATCHING SUBSTRINGS AS NEW VALUES. FAILURE CAN OCCUR HERE 01975000
IF A STRING VARIABLE NAME IS AN OUTPUT STRING, AND THE OUTPUT 01976000
OPERATION FAILS. 01977000
6) THE REPLACEMENT PART (IF ONE EXISTS) IS THEN EVALUATED. 01978000
7) THE REPLACEMENT OF THE MATCHED SUBSTRING THEN OCCURS. 01979000
8) LASTLY, THE APPROPRIATE PART OF THE GO-TO PART IS EVALUATED, AND THE 01980000
PROGRAM TRANSFERS TO THE NEXT INSTRUCTION. FAILURE OF A GO-TO PART 01981000
IS A FATAL ERROR. 01982000
01983000
01984000
01985000
%SECTION 9 01986000
%PAGE 1 01987000
9. INTRINSIC FUNCTIONS. 01988000
THIS SECTION DESCRIBES THE FUNCTIONS THAT ARE PRE-DEFINED BY THE 01989000
B5500 SNOBOL3 SYSTEM. OF COURSE, THE NAMES OF THESE FUNCTIONS ARE IN 01990000
NO SENSE "RESERVED", AND A PROGRAM CAN RE-DEFINE ANY OF THEM IF THE 01991000
USER WISHES TO USE THEIR NAMES FOR HIS OWN FUNCTIONS. THE FUNCTIONS 01992000
ARE LISTED IN ALPHABETICAL ORDER. 01993000
01994000
01995000
%CP 8 01996000
ANCHOR(N) WHEN USED IN A PATTERN, CAUSES THE PATTERN TO "ANCHORED" 01997000
AT CHARACTER N. THAT IS, THE FIRST PATTERN ELEMENT MUST MATCH 01998000
A SUBSTRING THAT STARTS AFTER AN INITIAL SUBSTRING OF N CHARACTERS. 01999000
THE USUAL FORM, ANCHOR(), THEREFORE FORCES THE PATTERN TO MATCH AN 02000000
INITIAL SUBSTRING. N MUST BE A NON-NEGATIVE INTEGER, OR ANCHOR(N) 02001000
WILL FAIL. NOTE THAT MOST IMPLEMENTATIONS OF SNOBOL3 DO NOT HAVE 02002000
A PARAMETER FOR ANCHOR(); IF A PROGRAM IS TO BE USED ON OTHER 02003000
SYSTEMS, THE PARAMETER SHOULD NEVER BE USED. 02004000
02005000
02006000
%CP 17 02007000
ASSIGN(A,B) IS A SPECIAL FAST, "EFFICIENT" ASSIGNMENT FUNCTION THAT 02008000
TAKES SPECIAL ADVANTAGE OF THE B5500 STRING REPRESENTATION. THIS 02009000
FUNCTION CAN GENERALLY BE ASSUMED TO BE LACKING IN OTHER VERSIONS 02010000
OF SNOBOL3. IT IS EQUIVALENT TO THE FOLLOWING TWO STATEMENTS: 02011000
02012000
A ~ B 02013000
B ~ 02014000
02015000
NO CHECKING OF PARAMETERS IS DONE, INCLUDING CHECKING FOR OUTPUT USE.02016000
(CHECKS FOR INPUT USE OCCUR BEFORE THE FUNCTION IS CALLED, SO THEY 02017000
WILL NOT BE SUPPRESSED.) THE FUNCTION SIMPLY MOVES POINTERS AROUND 02018000
WITHOUT LOOKING AT WHAT THEY POINT TO. NOTE THE FOLLOWING WARNINGS: 02019000
IF EITHER PARAMETER IS A LITERAL, THE VALUE OF THAT LITERAL WILL BE 02020000
DESTROYED (THROUGHOUT THE PROGRAM)--LITERALS SHOULD NEVER EVER EVER 02021000
BE USED AS PARAMETERS TO ASSIGN(). ALSO, ALTHOUGH B CAN BE OMITTED 02022000
(IT WILL THEN BE ASSUMED NULL), A MUST BE PRESENT, OR THE FUNCTION 02023000
WILL FAIL. 02024000
02025000
02026000
%CP 13 02027000
CALLF(F,P1,P2,P3,...) CALLS THE FUNCTION NAMED BY F, WITH PARAMETERS 02028000
P1, P2, P3, ETC. CALLF RETURNS THE VALUE RETURNED BY THIS FUNCTION, 02029000
OR FAILS IF THE FUNCTION FAILS. F CAN NAME ANY FUNCTION, INTRINSIC 02030000
OR PROGRAM-DEFINED. FOR EXAMPLE: 02031000
02032000
CALLF("FX",B,"1",AL) MEANS FX(B,"1",AL) 02033000
CALLF("SIZE",B) MEANS SIZE(B) 02034000
CALLF("CALLF","MODE","INTEGER") MEANS MODE("INTEGER") 02035000
02036000
IF CALLF IS BEING TRACED, NO OUTPUT WILL APPEAR AT ITS RETURN. IT IS02037000
NECESSARY TO TRACE THE FUNCTION BEING CALLED TO GET THE RETURN VALUE.02038000
IF THE FUNCTION IS UNDEFINED, AN ABNORMAL TERMINATION WILL OCCUR AS 02039000
WITH ALL OTHER UNDEFINED FUNCTION CALLS. 02040000
02041000
02042000
%CP 24 02043000
CLEAR() 02044000
THIS FUNCTION SETS ALL STRINGS TO NULL. THIS IS ONLY 02045000
DONE TO THE TOP VALUE ON A PUSH-DOWN STACK, SO VALUES THAT 02046000
HAVE BEEN PUSHED DOWN WILL NOT BE LOST. AS AN EXAMPLE OF ITS USE, 02047000
THE FOLLOWING FUNCTION CLEARS ALL STRINGS EXCEPT THOSE WHOSE NAMES 02048000
ARE ON A CERTAIN LIST (WHICH IS THEN CALCULATED BY THE PROGRAM, 02049000
OF COURSE): 02050000
02051000
***************** 02052000
-DEFINE "RESET(L)", ,"N" 02053000
* L IS A LIST OF NAMES OF VARIABLES. THE NAMES ARE SEPARATED BY 02054000
* SEMICOLONS (";"), AND L SHOULD END WITH A SEMICOLON. ALL THE 02055000
* VARIABLES LISTED IN L ARE PUSHED, EVERYTHING IS SET NULL, AND 02056000
* THE VARIABLES ARE THEN POPPED TO THEIR FORMER VALUES. 02057000
* FOR EXAMPLE, RESET("ALPHA;RESULTS;MEM;") WILL SET EVERYTHING TO 02058000
* NULL EXCEPT FOR ALPHA, RESULTS, AND MEM. NOTE THAT THE STRINGS 02059000
* RESET, L, AND N WILL ALSO BE SAVED. 02060000
RESET PUSH(L,L) 02061000
RESET1 L *N* ";" = :F(RESET2) 02062000
PUSH($N) :(RESET1) 02063000
RESET2 CLEAR() 02064000
POP(L) 02065000
RESET3 L *N* ";" = :F(RETURN) 02066000
POP($N) :(RESET3) 02067000
***************** 02068000
02069000
02070000
02071000
%CP 24 02072000
CLOSE(F,V) CLOSES THE FILE ASSOCIATED WITH THE I/O STRING $F, IN 02073000
THE MANNER INDICATED BY V. CLOSE FAILS IF $F IS NOT A FILE I/O 02074000
STRING OR V ISNT ONE OF THE VALUES LISTED BELOW: 02075000
02076000
"SAVE" CLOSES THE FILE AND SAVES THE I/O UNIT FOR THE PROGRAM. 02077000
DISK FILES CREATED BY THE PROGRAM ARE LOST; OTHER DISK FILES 02078000
REMAIN ON THE DISK. TAPES ARE REWOUND AND THE OPERATOR IS 02079000
TOLD TO REMOVE AND SAVE THEM. 02080000
"LOCK" CLOSES AND LOCKS THE FILE. DISK FILES CREATED BY THE 02081000
PROGRAM ARE ENTERED IN THE DISK DIRECTORY, AND ARE SAVED. 02082000
TAPES ARE REWOUND AND LOCKED (THE UNIT IS "NOT READY" UNTIL 02083000
THE OPERATOR READIES IT). 02084000
"RELEASE" CLOSES THE FILE AND RELEASES THE UNIT AND ALL BUFFER 02085000
AREAS TO THE SYSTEM. TAPES ARE REWOUND AND MARKED AS SCRATCH. 02086000
DISK FILES CREATED BY THE PROGRAM ARE LOST. 02087000
"PURGE" CLOSES, PURGES, AND RELEASES THE FILE. DISK FILES ARE 02088000
REMOVED FROM THE DIRECTORY IF THEIR SECURITY STATUS ALLOWS 02089000
THE USER TO PURGE THEM. (IF HE CANT, THE MCP WILL KILL THE 02090000
PROGRAM.) 02091000
"*" IS USED ONLY WITH TAPE FILES. FOR INPUT FILES, THE END-OF-FILE 02092000
FOR THE CURRENT FILE IS LOCATED, AND THE TAPE IS POSITIONED 02093000
JUST BEYOND IT. FOR OUTPUT FILES, AN END-OF-FILE IS WRITTEN. 02094000
IN EITHER CASE, THE TAPE IS NOT REWOUND AND REMAINS UNDER 02095000
CONTROL OF THE PROGRAM. 02096000
02097000
02098000
%CP 12 02099000
COPY(S,N) RETURNS A STRING CONSISTING OF N COPIES OF S. FAILURE 02100000
OCCURS IF N IS NON-NUMERIC OR NEGATIVE. THIS FUNCTION IS QUITE 02101000
USEFUL AS AN AID TO FORMATTING OUTPUT. FOR EXAMPLE: 02102000
02103000
PRINT ~ COPY(" ","10"-SIZE(A)) A :F(TOOBIG) 02104000
02105000
WILL PRINT A RIGHT-JUSTIFIED IN A 10-CHARACTER FIELD. 02106000
02107000
02108000
02109000
%CP 3 02110000
DATE() RETURNS THE CURRENT DATE IN THE FORM: 02111000
02112000
MM/DD/YY 02113000
02114000
02115000
02116000
02117000
%CP 25 02118000
DEFINE(A,B,C) CREATES A PROGRAM-DEFINED FUNCTION AT RUN-TIME. 02119000
THE PARAMETERS DESCRIBE THE FUNCTION AS FOLLOWS: 02120000
02121000
A IS THE "FUNCTION PROTOTYPE", WHICH GIVES THE FUNCTION NAME 02122000
AND ITS FORMAL PARAMETERS IN THE FORM: 02123000
02124000
<FCT NAME>( <PARAMS> ) 02125000
02126000
WHERE <FCT NAME> IS THE FUNCTION NAME, AND <PARAMS> IS 02127000
THE LIST OF FORMAT PARAMETERS (POSSIBLY NULL) SEPARATED BY 02128000
COMMAS. 02129000
B CONTAINS A LABEL WHICH IS THE ENTRY POINT FOR THE FUNCTION. 02130000
IF B IS NULL, THE ENTRY POINT IS TAKEN TO SPELLED THE SAME 02131000
AS <FCT NAME>. 02132000
C CONTAINS A LIST OF LOCAL VARIABLES FOR THE FUNCTION, IF ANY, 02133000
SEPARATED BY COMMAS. 02134000
02135000
SEE THE DESCRIPTIONS OF FUNCTION CODE AND CALLS FOR FURTHER INFO 02136000
ON PROGRAM-DEFINED FUNCTIONS. SOME EXAMPLES OF CALLS OF DEFINE(): 02137000
02138000
DEFINE("M(AB,AC)","M1","V,XY,ALPH") 02139000
DEFINE("MAX(A,B)") 02140000
DEFINE("MIN(MIN,X)") 02141000
DEFINE("FCT()",,"X") 02142000
DEFINE("MRGE(LA,LB)","MRGENTRY","L1,L2,L3") 02143000
02144000
02145000
02146000
%CP 13 02147000
DETACH(S,T) TURNS OFF ANY I/O USE OF THE OBJECT NAMED BY S (A STRING 02148000
NAME, FUNCTION, OR LABEL). THE TYPE OF THE OBJECT IS INDICATED 02149000
BY THE FIRST CHARACTER OF T AS FOLLOWS: 02150000
02151000
"S" MEANS THAT S NAMES A STRING. 02152000
"F" MEANS THAT S NAMES A FUNCTION. 02153000
"L" MEANS THAT S CONTAINS A LABEL. 02154000
02155000
IF T IS NULL, "S" IS ASSUMED, SINCE THE MOST COMMON USE OF THIS 02156000
FUNCTION IS TO TURN OFF TRACING. FOR EXAMPLE, TO TERMINATE ANY 02157000
I/O USE OF THE STRING ALPHA, EITHER DETACH("ALPHA") OR DETACH( 02158000
"ALPHA","S") WOULD WORK. 02159000
02160000
02161000
02162000
%CP 5 02163000
DUMP() CAUSES A DUMP OF ALL STRINGS AND LABELS IN USE TO BE PRINTED 02164000
ON THE LINE PRINTER FILE, PRINT. THE OUTPUT IS IN THE SAME 02165000
FORM AS THAT USED FOR TRACING. FOR EACH STRING, ITS NAME AND 02166000
CURRENT VALUE IS PRINTED. FOR EACH LABEL, THE NUMBER OF TIMES 02167000
IT HAS BEEN EXECUTED IS GIVEN. 02168000
02169000
02170000
02171000
%CP 2 02172000
EOF(S) SUCCEEDS IF $S IS A FILE I/O STRING AND THE LAST I/O OPERATION 02173000
ON THAT FILE FAILED DUE TO AN END-OF-FILE. 02174000
02175000
02176000
02177000
%CP 2 02178000
.EQ(A,B) SUCCEEDS IF A AND B ARE BOTH NUMERIC AND REPRESENT 02179000
THE SAME INTEGER. 02180000
02181000
02182000
02183000
%CP 2 02184000
EQUALS(A,B) SUCCEEDS IF A AND B HAVE THE SAME STRINGS AS VALUES. 02185000
IT CAN BE DEFINED IN SNOBOL AS: 02186000
02187000
A B :F(FRETURN) 02188000
B A :F(FRETURN)S(RETURN) 02189000
02190000
02191000
02192000
%CP 15 02193000
EXECUTE(S) "EXECUTES" THE STRING S. AT PRESENT, THIS FUNCTION IS 02194000
RATHER LIMITED, AND WORKS FOR THE FOLLOWING CASES ONLY: 02195000
02196000
1) S IS AN I/O STRING TO A FILE. THE FILE IS GIVEN TO THE MCP 02197000
TO EXECUTE. THIS IS THE SAME AS THE "ZIP WITH <FILE PART>" 02198000
CONSTRUCT OF ALGOL. FOR DETAILS OF FILE ORGANIZATION AND 02199000
USE OF CONTROL CARDS IN THE FILE, SEE THE ALGOL MANUAL. 02200000
2) S STARTS WITH A "-". THE VALUE IS PASSED TO THE SNOBOL CONTROL 02201000
CARD ROUTINE, AND INTERPRETED AS A CONTROL CARD. MOST OF 02202000
THE CONTROL CARDS ARE RATHER USELESS DURING EXECUTION, BUT 02203000
A FEW (LIKE -COMPILE AND -LIBRARY) CAN AT TIMES BE USEFUL. 02204000
3) S STARTS WITH "?". THE VALUE OF S IS PASSED TO THE MCP AS 02205000
AN MCP CONTROL CARD. EXECUTE() THEN RETURNS, AND THE MCP 02206000
GIVES NO INDICATION WHAT IT DID WITH THE CARD. THE STRING 02207000
SHOULD ALWAYS END WITH ";END.". 02208000
02209000
02210000
02211000
%CP 42 02212000
FILL(F,MFID,FID,UNIT,DATE,REEL,CYCLE) ALTERS CERTAIN MCP INFORMATION 02213000
ASSOCIATED WITH THE I/O STRING $F. THIS FUNCTION IS USUALLY 02214000
A NO-OP IF THE FILE IS OPEN (WHEN THE MCP WILL ALLOW CHANGES 02215000
TO AN OPEN FILE IS VERY UNCLEAR). IF $F IS NOT AN I/O STRING TO 02216000
A FILE, FILL() WILL FAIL. IF ANY OF THE OTHER PARAMETERS IS NULL, 02217000
THEN THE INFORMATION ASSOCIATED WITH THAT PARAMETER IS NOT ALTERED. 02218000
NON-NULL PARAMETERS WILL CAUSE THEIR ASSOCIATED QUANTITIES TO BE 02219000
ASSIGNED THE VALUE OF THE PARAMETER. THE MEANINGS OF THE PARAMETERS 02220000
ARE AS FOLLOWS: 02221000
02222000
MFID IS THE "MULTI-FILE I.D." OF THE FILE; THAT IS, IT IS THE FIRST 02223000
HALF OF THE FILE NAME. FOR SINGLE-NAME CARD READER FILES, MFID 02224000
IS "0000000". IF SIZE(MFID) > "7", ONLY THE FIRST SEVEN 02225000
CHARACTERS WILL BE USED. 02226000
FID IS THE "FILE I.D." OF THE FILE--THE LAST HALF OF ITS NAME. 02227000
UNIT IS AN INTEGER DESCRIBING THE I/O DEVICE. THE VALID UNIT 02228000
NUMBERS ARE GIVEN IN TABLE 9.1. NOTE THAT FOR INPUT FILES, THE 02229000
ONLY DISTINCTION THE PROGRAM NEED MAKE IS BETWEEN DISK FILES 02230000
AND NON-DISK FILES. THUS, IF UNIT = "0" AND THE FILE IS ON 02231000
A MAGNETIC TAPE, THE PROGRAM WILL FIND IT CORRECTLY. FOR OUTPUT 02232000
FILES, HOWEVER, IT IS IMPORTANT TO GET THE RIGHT INTEGER. 02233000
DATE IS THE DATE ASSOCIATED WITH THE FILE (NORMALLY ONLY USED WITH 02234000
TAPES). TWO FORMS CAN BE USED: MM/DD/YY OR YYDDD (WHICH IS 02235000
HOW IT IS STORED IN A FILE LABEL). 02236000
REEL IS THE REEL NUMBER, FOR MULTI-REEL TAPES. 02237000
CYCLE IS THE CYCLE NUMBER, USED WHEN SEVERAL TAPES HAVE THE SAME 02238000
NAME AND DATE. 02239000
02240000
FOR EXAMPLE, TO ASSIGN THE I/O STRING CARD TO THE DISK FILE 02241000
SMITH/CRD3, THE PROGRAM WOULD USE: 02242000
02243000
FILL("CARD","SMITH","CRD3","12") 02244000
02245000
TO GIVE THE FILE NEWDISK THE NAME GEO/CALIBR, YOU COULD USE: 02246000
02247000
FILL("NEWDISK","GEO","CALIBR") 02248000
02249000
NOTE THAT THE UNIT NEED NOT BE USED HERE; IT IS ONLY NEEDED WHEN A 02250000
DIFFERENT I/O DEVICE IS DESIRED THAN WAS USED THE LAST TIME THE FILE 02251000
WAS OPENED. FOR ANOTHER EXAMPLE, TO ASSIGN THE FILE READ TO THE 02252000
CARD READER FILE INPT, THE FOLLOWING WOULD WORK: 02253000
02254000
FILL("READ","0000000","INPT","0") 02255000
02256000
02257000
02258000
%PAGE 02259000
TABLE 9.1. 02260000
02261000
UNIT DESCRIPTION 02262000
02263000
0 CARD READER/PUNCH 02264000
1 LINE PRINTER (NO BACK-UP) 02265000
2 LABELED MAGNETIC TAPE 02266000
3 UNUSED 02267000
4 LINE PRINTER OR TAPE BACK-UP 02268000
5 LABELED "DESIGNATED" FILE (?) 02269000
6 PRINTER BACK-UP TAPE 02270000
7 UNLABELED "DESIGNATED" FILE (?) 02271000
8 UNLABELED PAPER TAPE 02272000
9 UNLABELED MAGNETIC TAPE 02273000
10 RANDOM DISK FILE 02274000
11 SUPERVISORY PRINTER (SPO) 02275000
12 SERIAL DISK FILE 02276000
13 UPDATE DISK FILE 02277000
14 DATA COMMUNICATIONS 02278000
15 PRINTER BACK-UP DISK 02279000
16 PRINTER BACK-UP TAPE OR DISK 02280000
17 PRINTER OR BACK-UP DISK 02281000
18 PRINTER OR BACK-UP DISK OR BACK-UP TAPE 02282000
32 SPECIAL FORMS FILE. 02283000
02284000
02285000
02286000
%PAGE 02287000
.GE(A,B) SUCCEEDS IF A AND B ARE BOTH NUMERIC AND A } B. 02288000
02289000
02290000
02291000
02292000
.GT(A,B) SUCCEEDS IF A AND B ARE BOTH NUMERIC AND A > B. 02293000
02294000
02295000
.LE(A,B) SUCCEEDS IF A AND B ARE BOTH NUMERIC AND A { B. 02296000
02297000
02298000
02299000
02300000
LEVEL() RETURNS THE LEVEL OF FUNCTION CALLS WHICH THE PROGRAM 02301000
HAS REACHED. THE LEVEL COUNTER STARTS AT 1, INCREASES WHEN 02302000
A FUNCTION IS CALLED, AND DECREASES WHEN A FUNCTION RETURNS. 02303000
02304000
02305000
02306000
%CP 7 02307000
LOOK(S,F) DEFINES THE STRING $S TO BE A "NON-READING" INPUT STRING 02308000
FOR THE FILE ASSOCIATED WITH THE I/O STRING $F. THIS MEANS THAT 02309000
USING $S AS AN INPUT STRING WILL CAUSE THE "NEXT" RECORD TO BE 02310000
READ FROM THE FILE, BUT THIS RECORD WILL REMAIN IN THE BUFFER, 02311000
SO IT WILL BE THE NEXT ONE READ. THUS, CONSECUTIVE USES OF $S 02312000
WILL GIVE THE SAME INPUT RECORD. THE SYSTEM DEFINES THE I/O STRING 02313000
LOOK AS: LOOK("LOOK","READ"). 02314000
02315000
02316000
02317000
.LT(A,B) SUCCEEDS IF A AND B ARE BOTH NUMERIC AND A < B. 02318000
02319000
02320000
02321000
%CP 52 02322000
MODE(V,P) SETS VARIOUS GLOBAL SYSTEM FLAGS, AS INDICATED BY V. 02323000
P IS USUALLY NOT USED, BUT FOR SOME VALUES OF V IT INDICATES A 02324000
VALUE TO BE USED WITH THE FLAG. V MUST BE ONE OF THE VALUES 02325000
BELOW, OR MODE() WILL FAIL. THE CURRENTLY RECOGNIZED VALUES 02326000
OF V ARE AS FOLLOWS: 02327000
02328000
MODE("ANCHOR",P) CAUSES ALL PATTERNS TO BE ANCHORED AT CHARACTER P. 02329000
THAT IS, ALL PATTERNS MUST MATCH WITH THE FIRST PATTERN ELEMENT 02330000
MATCHING IMMEDIATELY AFTER THE P-TH CHARACTER. FOR P = "0" (OR 02331000
P NULL), THE PATTERN MUST MATCH AN INITIAL SUBSTRING. NOTE THAT 02332000
MOST VERSIONS OF SNOBOL DONT ALLOW THE EXTRA PARAMETER P, SO 02333000
PROGRAMS THAT ARE TO BE RUN ON OTHER SNOBOL SYSTEMS SHOULD 02334000
ONLY USE MODE("ANCHOR"). IF P IS NON-NUMERIC OR NEGATIVE, 02335000
FAILURE OCCURS. 02336000
MODE("UNANCH") OR MODE("UNANCHOR") RETURNS THE PATTERN MATCH MODE 02337000
TO ITS NORMAL, UNANCHORED MODE. THAT IS, THE FIRST ELEMENT 02338000
OF A PATTERN CAN MATCH STARTING ANYWHERE IN THE STRING REFERENCE. 02339000
MODE("DUMP") CAUSES DUMP() TO BE CALLED WHEN THE PROGRAM TERMINATES. 02340000
MODE("ERRDUMP") CAUSES DUMP() TO BE CALLED IF THE PROGRAM TERMINATES 02341000
ABNORMALLY. 02342000
MODE("INFORM") CAUSES WARNING DIAGNOSTIC MESSAGES TO BE PRINTED 02343000
WHEN CERTAIN CONDITIONS OCCUR THAT ARE VALID IN SNOBOL BUT ARE 02344000
OFTEN SIGNS OF PROGRAM ERRORS WHEN THEY OCCUR. SOME SUCH THINGS 02345000
ARE: USING NON-NUMERIC ARGUMENTS TO ARITHMETIC OPERATORS OR 02346000
ARITHMETIC FUNCTIONS; INDIRECTION WITH THE NULL STRING AS THE 02347000
STRING NAME; USING POP() TO WIPE OUT THE PUSH-DOWN STACK FOR 02348000
A FUNCTIONS FORMAL PARAMETERS OR LOCAL VARIABLES; USING A 02349000
FIXED-LENGTH VARIABLE WITH NON-NUMERIC OR NEGATIVE LENGTH; 02350000
ETC. THIS LIST MAY BE EXTENDED IN THE FUTURE, AS MORE SUCH 02351000
CONDITIONS ARE BROUGHT TO THE ATTENTIONS OF THE SYSTEM AUTHORS 02352000
WHICH CAN EASILY BE CHECKED BY THE SNOBOL INTERPRETER. 02353000
MODE("SILENCE") TERMINATES MODE("INFORM"). 02354000
MODE("DEBUG") TURNS ON THE CHECKING FOR DEBUG MODE. THIS IS 02355000
THE INTERACTIVE DEBUGGING TOOL THAT IS PART OF THE INTERPRETER; 02356000
IT IS DESCRIBED IN SECTION 11.2. 02357000
MODE("RUN") TERMINATES DEBUG MODE, AND TURNS OFF THE ASSOCIATED 02358000
LIMIT TESTS. 02359000
MODE("ROUND") SAYS THAT ALL DIVISION IS TO BE ROUNDED. THAT IS, 02360000
IF THE REMAINDER IS } 1/2 OF THE DIVISOR, THE QUOTIENT IS 02361000
INCREASED BY 1. 02362000
MODE("TRUNCATION") SAYS THAT DIVISION IS TO BE TRUNCATED--THE 02363000
REMAINDER IS TO BE DISCARDED. 02364000
MODE("INTEGER") SAYS THAT DIVISION IS TO FAIL IF THE REMAINDER 02365000
IS NOT ZERO. 02366000
MODE("OVERFLOW",P) WHERE $P IS A FILE OUTPUT STRING, SAYS THAT 02367000
IF A STRING IS WRITTEN THAT IS LONGER THAN A RECORD, THE 02368000
EXTRA CHARACTERS ARE WRITTEN ON THE NEXT RECORD (THIS WILL 02369000
BE REPEATED IF THE REMAINING STRING IS STILL TOO LONG). 02370000
MODE("TRUNCATE",P) CANCELS MODE("OVERFLOW",P). THIS MEANS THAT 02371000
STRINGS THAT ARE TOO LONG FOR ONE RECORD WILL BE TRUNCATED, 02372000
AND THE TAIL END WILL NOT BE OUTPUT. THIS IS THE ASSUMED MODE 02373000
FOR ALL OUTPUT FILES UNLESS MODE("OVERFLOW",P) IS USED. 02374000
02375000
02376000
02377000
.NE(A,B) SUCCEEDS IF A AND B ARE BOTH NUMERIC AND A ! B. 02378000
02379000
02380000
02381000
%CP 3 02382000
.NUM(A) SUCCEEDS IF A IS NUMERIC. THAT IS, THE FIRST CHARACTER 02383000
MUST BE A DIGIT OR "-"; ALL OTHER CHARACTERS MUST BE DIGITS. 02384000
THE NULL STRING IS NUMERIC, AS IS "-"; BOTH = ZERO. 02385000
02386000
02387000
02388000
%CP 34 02389000
OPSYN(A,B,T) SETS THE OBJECT (STRING, FUNCTION, LABEL) NAMED 02390000
BY A TO BE THE SAME AS THE ONE NAMED BY B. THE TYPE OF THE 02391000
TWO OBJECTS IS GIVEN BY THE FIRST CHARACTER OF T, AS FOLLOWS: 02392000
02393000
"S" MEANS THAT A AND B ARE STRING NAMES. 02394000
"F" MEANS THAT A AND B ARE FUNCTION NAMES. 02395000
"L" MEANS THAT A AND B CONTAIN LABELS. 02396000
02397000
IF T IS NULL, "F" IS ASSUMED--IN ORDER TO BE COMPATIBLE WITH THE 02398000
MANY SNOBOL SYSTEMS THAT ONLY ALLOW THIS FUNCTION TO BE APPLIED 02399000
TO FUNCTION NAMES. SOME EXAMPLES OF THE USE OF OPSYN() ARE: 02400000
02401000
OPSYN("XA","XB","STR") ASSIGNS THE VALUE OF XB TO XA, AND ALSO 02402000
GIVES XA ANY I/O USE OF XB. 02403000
OPSYN("FL","RXA","F") DEFINES THE FUNCTION FL TO BE THE SAME 02404000
AS THE FUNCTION RXA (INCLUDING TRACING, IF RXA IS BEING 02405000
TRACED). IF RXA IS UNDEFINED, THEN FL IS ALSO UNDEFINED. 02406000
OPSYN("REDO","DO","LABEL") DEFINES THE LABEL REDO TO BE THE SAME 02407000
INSTRUCTION AS DO. ANY INSTRUCTION PREVIOUSLY LABELED REDO 02408000
IS LOST UNLESS IT HAS BEEN GIVEN ANOTHER NAME. 02409000
02410000
NOTE THAT OPSYN ACTS AS AN ASSIGNMENT, NOT A PERMANENT DEFINITION, 02411000
SO A FURTHER CHANGE IN ONE OF THE VARIABLES WILL NOT AFFECT 02412000
THE OTHER. IF, AFTER THE FIRST EXAMPLE ABOVE, XB WERE ASSIGNED 02413000
A NEW VALUE, XA WOULD REMAIN UNALTERED; IF TRACEL("DO") WERE 02414000
CALLED, TRACING WOULD BE STARTED FOR DO BUT NOT FOR REDO. 02415000
A TRIVIAL EXAMPLE OF THE USE OF OPSYN IS: 02416000
02417000
OPSYN("NULL","EQUALS") 02418000
02419000
WHICH WILL DEFINE A FUNCTION NULL() WHICH, WHEN CALLED WITH ONLY 02420000
ONE ARGUMENT, WILL SUCCEED IF THE ARGUMENT IS NULL. THIS MAY 02421000
BE DESIRABLE BECAUSE THE MEANING OF NULL(X) IS A BIT MORE OBVIOUS 02422000
THAN THAT OF EQUALS(X). 02423000
02424000
02425000
02426000
%CP 16 02427000
PAGE(N,F) CAUSES A PAGE-EJECT TO BE DONE ON THE FILE $F, WHICH 02428000
SHOULD BE A LINE PRINTER FILE. THE EJECTION IS TO "CHANNEL" N, 02429000
WHICH IS A POSITION SOMEWHERE ON THE PAGE DETERMINED BY A PAPER 02430000
TAPE CONTROL WITHIN THE PRINTER. THE EJECT WILL OCCUR ON THE 02431000
NEXT LINE OF OUTPUT, AFTER THE OUTPUT OCCURS. N MUST BE A VALUE 02432000
BETWEEN "0" AND "11"; "0" AND "1" ARE BOTH THE TOP OF THE NEXT 02433000
PAGE. IF F IS OMITTED, THEN "PRINT" IS ASSUMED; IF N IS NULL, 02434000
THE TOP OF THE PAGE ("1") WILL BE ASSUMED. THUS, TO SIMPLY DO 02435000
A PAGE-EJECT ON THE PRINT FILE, THE FOLLOWING WOULD SUFFICE: 02436000
02437000
PRINT ~ PAGE() 02438000
02439000
ACTUALLY, PAGE() IS A SPECIAL CASE OF THE FUNCTION RECORD(), AND 02440000
IS MEANT TO BE USED ONLY WITH LINE PRINTERS (THUS THE RESTRICTION 02441000
ON THE RANGE OF N). THE SAME EFFECT COULD BE ACHEIVED BY USING 02442000
RECORD(F,N), WITH 1 { N { 11. 02443000
02444000
02445000
02446000
%CP 12 02447000
POP(S) REMOVES THE TOP OF THE PUSH-DOWN STACK FOR THE STRING S. 02448000
EVERY STRING NAME IN SNOBOL CAN BE CONSIDERED A PUSH-DOWN 02449000
STACK, WITH THE TOP OF THE STACK THE CURRENT VALUE OF THE 02450000
STRING. ONE WARNING: IF THE FORMAL PARAMETERS OR LOCAL VAR- 02451000
IABLES OF A FUNCTION ARE POPPED WITHIN THE FUNCTION, THE RETURN 02452000
FROM THE FUNCTION WILL TRY TO POP THEM AGAIN; THIS CAN CAUSE 02453000
SOME GRIEF IF CARE IS NOT TAKEN TO RESTORE THE STACKS TO THEIR 02454000
CORRECT "DEPTH" IN SUCH CASES. IN SUCH A SITUATION, THE RETURN 02455000
WOULD NOT ALTER THE STRING (IF THE INFORM FLAG IS ON, A MESSAGE 02456000
WILL BE PRINTED--SEE THE FUNCTION MODE()). POP(S) WILL FAIL 02457000
IF S IS NOT A STRING NAME, OR IF S CANT BE POPPED BECAUSE THERE 02458000
IS ONLY ONE VALUE IN ITS STACK. 02459000
02460000
02461000
02462000
%CP 8 02463000
PUSH(S,V) PUSHES THE VALUE V ONTO THE PUSH-DOWN STACK FOR S. 02464000
IF THIS IS FOLLOWED BY POP(S), S WILL RETURN TO ITS FORMER 02465000
VALUE. PUSH(S,V) WILL FAIL IF S ISNT A NAMED STRING. ALSO, 02466000
EACH CALL OF PUSH() REQUIRES ONE MORE ENTRY IN THE SYMBOL 02467000
TABLE; THERE IS ROOM IN THE TABLE FOR SOMEWHAT OVER 4000 02468000
SYMBOLS (STRINGS, LITERALS, FUNCTIONS, LABELS, TEMPORARY 02469000
STORAGE FOR GROUPINGS, ETC.) AND EXHAUSTING THIS SPACE WILL 02470000
CAUSE THE PROGRAM TO DIE ABNORMALLY. 02471000
02472000
02473000
%CP 8 02474000
02475000
.RANF(N) PRODUCES A PSEUDO-RANDOM NUMBER IN THE RANGE: 02476000
02477000
1 { .RANF(N) { N 02478000
02479000
THE GENERATOR IS ALWAYS INITIALIZED TO THE SAME NUMBER, SO 02480000
THE VALUES RETURNED ARE "PREDICTABLE" IN THE SENSE THAT REPEATING 02481000
A RUN WITH THE SAME VALUES FOR N WILL PRODUCE THE SAME SEQUENCE 02482000
OF NUMBERS. 02483000
02484000
02485000
02486000
%CP 10 02487000
RECORD(F,N) SETS THE "RECORD POINTER" FOR THE FILE ASSOCIATED 02488000
WITH $F TO N. $F MUST BE A FILE I/O STRING; N MUST BE A 02489000
NON-NEGATIVE NUMBER, OR RECORD(F,N) WILL FAIL. THIS FUNCTION 02490000
IS REALLY ONLY USEFUL FOR DISK FILES. FOR LINE PRINTER FILES, 02491000
IT IS THE SAME AS THE FUNCTION PAGE(); FOR OTHER NON-DISK FILES 02492000
RECORD() IS A NO-OP. FOR DISK FILES, USING RECORD(F,N) SAYS 02493000
THAT THE NEXT I/O OPERATION IS TO BE ON RECORD N. THE RECORDS 02494000
OF A DISK FILE ARE NUMBERED STARTING AT 0. IF N IS GREATER THAN 02495000
THE NUMBER OF THE LAST RECORD IN THE FILE, THE NEXT I/O OPERATION 02496000
WILL FAIL DUE TO END-OF-FILE. 02497000
02498000
02499000
02500000
%CP 5 02501000
RELEASE(A) WHERE A IS A TELETYPE TERMINAL ADDRESS, REMOVES THE 02502000
TELETYPE FROM THE LIST OF TELETYPES ATTACHED TO THE PROGRAM. 02503000
FURTHER I/O ON THIS TELETYPE BECOMES IMPOSSIBLE UNTIL THE PERSON 02504000
AT THE TELETYPE RE-ATTACHES HIMSELF. RELEASE(A) WILL FAIL IF A 02505000
IS NOT A VALID ADDRESS OR THE TELETYPE IS NOT ATTACHED. 02506000
02507000
02508000
02509000
%CP 4 02510000
REWIND(F) CAUSES THE FILE ASSOCIATED WITH $F TO BE REWOUND. THE 02511000
FILE REMAINS OPEN, AND I/O CAN CONTINUE AS USUAL, STARTING 02512000
FROM THE FIRST RECORD OF THE FILE. FOR DISK FILES, REWIND(F) 02513000
IS EQUIVALENT TO RECORD("0",F). 02514000
02515000
02516000
02517000
%CP 7 02518000
RULES(N) RETURNS THE NUMBER OF RULES EXECUTED AT LEVEL N (} 1) 02519000
SINCE THE LAST TIME LEVEL N WAS REACHED. IF N = "0" (OR NULL) 02520000
THE TOTAL FOR THE ENTIRE PROGRAM IS RETURNED. IF N { LEVEL(), 02521000
THE CURRENT INSTRUCTION IS INCLUDED IN THE TOTAL. NOTE THAT IF 02522000
RULES(N) = "0", THEN LEVEL N HAS NEVER BEEN REACHED. IF N IS 02523000
NON-NUMERIC OR NEGATIVE, RULES(N) WILL FAIL. 02524000
02525000
02526000
02527000
%CP 30 02528000
SEARCH(FILE) WHERE $FILE IS AN I/O STRING TO A DISK FILE, DOES A 02529000
SEARCH OF THE DISK DIRECTORY FOR THE FILE. IF IT IS PRESENT, 02530000
A DESCRIPTION OF THE FILE IS RETURNED. FAILURE OCCURS IF $FILE 02531000
IS NOT A DISK FILE, OR IF THE FILE IS NOT IN THE DIRECTORY. 02532000
IF THE FILE IS IN THE DIRECTORY, THE RETURN VALUE IS OF THE 02533000
FOLLOWING FORM: 02534000
02535000
<MFID> / <FID> : <SECURITY> : <REC SIZE> : <BLCK SIZE> : 02536000
<EOF PNTR> : <OPEN COUNT> 02537000
02538000
THE EXTERNAL NAME OF THE FILE IS <MFID>/<FID>. THE SECURITY 02539000
STATUS, <SECURITY>, IS A STRING OF 3 "0"-S OR "1"-S WITH THE 02540000
FOLLOWING MEANING: 02541000
02542000
1ST = "1" IF THE USER CAN ALTER THE SECURITY STATUS OR 02543000
NAME, OR CAN REMOVE THE FILE. 02544000
2ND = "1" IF THE USER CAN READ FROM THE FILE. 02545000
3RD = "1" IF THE USER CAN WRITE ON THE FILE. 02546000
02547000
THE SIZE OF THE LOGICAL AND PHYSICAL RECORDS OF THE FILE, IN 02548000
CHARACTERS, ARE GIVEN BY <REC SIZE> AND <BLCK SIZE>. <EOF PNTR> 02549000
IS THE RELATIVE ADDRESS OF THE LAST RECORD OF THE FILE (THAT 02550000
IS, ONE LESS THAN THE NUMBER OF RECORDS IN THE FILE). <OPEN COUNT> 02551000
IS THE NUMBER OF PROGRAMS DOING I/O ON THE FILE. NOTE THAT, 02552000
UNLIKE ALGOL WHICH DEALS ENTIRELY WITH WORDS, THE RECORD SIZE 02553000
AND BLOCK SIZE ARE GIVEN TO A SNOBOL PROGRAM IN CHARACTERS. 02554000
IF <SECURITY> = "000", THEN <REC SIZE>, <BLCK SIZE>, ETC. 02555000
WILL ALL BE "0". 02556000
02557000
02558000
02559000
SIZE(S) RETURNS THE NUMBER OF CHARACTERS IN S. THUS, SIZE("ABC") = "3". 02560000
02561000
02562000
02563000
02564000
%CP 13 02565000
SPACE(F,N) SETS A COUNTER FOR THE FILE ASSOCIATED WITH $F TO N, SO 02566000
THAT EACH I/O OPERATION ON THE FILE IS PRECEDED BY SKIPPING N 02567000
RECORDS (ON INPUT) OR WRITING N BLANK RECORDS (ON OUTPUT). FOR 02568000
LINE PRINTER FILES, N = "1" IS NORMAL, N = "0" CAUSES OVERPRINTING, 02569000
N = "2" CAUSES DOUBLE SPACING, ETC. FOR OTHER FILES, A SKIP TO 02570000
THE NEXT RECORD IS PART OF THE I/O OPERATION, AND N = "0" IS THE 02571000
NORMAL SETTING. SPACE(F,N) WILL FAIL IF $F IS NOT AN I/O STRING 02572000
FOR A FILE, OR IF N IS NON-NUMERIC. FOR EXAMPLE, 02573000
02574000
SPACE("PRINT","2") 02575000
02576000
WILL CAUSE DOUBLE-SPACING ON THE LINE PRINTER FILE PRINT UNTIL 02577000
ANOTHER CALL OF SPACE() CHANGES THE SPACING. 02578000
02579000
02580000
02581000
%CP 6 02582000
SUSPEND(N) HAS TWO USES. IF N IS NON-NULL, IT MUST BE AN INTEGER; 02583000
THE PROGRAM WILL BE SUSPENDED FOR N SECONDS AND THEN WILL RESUME 02584000
EXECUTION FROM THE FUNCTION CALL, WHICH WILL RETURN A NULL STRING. 02585000
IF N { 0, THE CALL IS A NO-OP. IF N IS NULL (OR MISSING), THE 02586000
PROGRAM IS SUSPENDED AND THE INTERACTIVE DEBUGGING ROUTINE IS 02587000
ACTIVATED. SEE SECTION 11.2 FOR DETAILS. 02588000
02589000
02590000
02591000
%CP 50 02592000
STATUS(A,I) GIVES THE STATUS OF ATTACHED TELETYPES. A IS EITHER 02593000
THE ADDRESS OF AN ATTACHED TELETYPE, OR IS NULL, WHICH MEANS 02594000
THAT ALL ATTACHED TELETYPES ARE TO BE CONSIDERED. I IS A NUMBER, 02595000
EITHER "0" OR "1", DEPENDING ON THE TYPE OF STATUS STRING DESIRED. 02596000
THE MEANINGS OF THE TWO VALUES OF I ARE: 02597000
02598000
I = "0" IS A "PASSIVE" STATUS. THAT IS, THE STATUS AS OF THE LAST 02599000
HARDWARE INTERRUPT ASSOCIATED WITH THE TELETYPE IS RETURNED. 02600000
INTERRUPTS OCCUR FOR I/O OPERATIONS AND FOR STATUS INTERROGATES. 02601000
I = "1" IS AN "ACTIVE" STATUS. THIS MEANS THAT A HARDWARE STATUS 02602000
INTERROGATE IS PERFORMED, THE MCP STATUS WORD IS UPDATED, AND 02603000
THE NEW VALUE IS THE VALUE RETURNED. UNFORTUNATELY, THE MCP 02604000
ALSO INTERPRETS AN ACTIVE INTERROGATE AS A COMMAND TO START 02605000
CHARGING THE PROJECT NUMBER OF THE PERSON AT THAT TELETYPE 02606000
FOR THE JOB TIME. FOR SINGLE-USER JOBS, THIS HAS NO EFFECT, 02607000
BUT FOR MULTI-USER JOBS IT CAN BE RATHER ANNOYING. 02608000
02609000
THE FORM OF A STATUS STRING FOR A SINGLE TERMINAL IS: 02610000
02611000
<STATUS> = ( <PROJ#> / <USER#> : <ADDR> : <CONDITIONS> ) 02612000
02613000
WHERE <PROJ#>/<USER#> IS THE USERS PROJECT AND I.D. NUMBER. 02614000
(THIS IS THE SECURITY SYSTEM IN USE AT THE UNIVERSITY OF WISCONSIN; 02615000
USERS AT OTHER INSTALLATIONS WILL PROBABLY HAVE TO ALTER THIS 02616000
INTRINSIC TO HANDLE THEIR LOCAL ACCOUNTING PROCEDURES.) 02617000
<ADDR> IS THE ADDRESS OF THE TELETYPE, AND <CONDITIONS> IS 02618000
A STRING OF "0"-S AND "1"-S WITH THE FOLLOWING MEANINGS: 02619000
02620000
1ST = "1" IF UNIT IS READY. 02621000
2ND = "1" IF UNIT IS READ-READY (I.E., THERE IS INPUT TO READ). 02622000
3RD = "1" IF UNIT IS WRITE-READY (OUTPUT IS POSSIBLE) 02623000
4TH = "1" IF WRITE IS IN PROGRESS. 02624000
5TH = "1" IF BREAK KEY USED ON LAST OUTPUT. 02625000
6TH = "1" IF HARDWARE DETECTS ABNORMAL CONDITION. 02626000
7TH = "1" IF UNIT IS BUSY. 02627000
8TH = "1" IF SOME PROGRAM HAS EXCLUSIVE USE OF UNIT. 02628000
02629000
MORE CONDITIONS MAY BE ADDED IN THE FUTURE, AS THEY ARE MADE 02630000
AVAILABLE BY THE HARDWARE AND BY THE MCP. 02631000
WHEN A IS NULL, THE STATUS STRINGS OF ALL ATTACHED TELETYPES 02632000
IS RETURNED IN THE FORM: 02633000
02634000
<STATUS> <STATUS> <STATUS> ... <STATUS> 02635000
02636000
WITH ONE <STATUS> FOR EACH TELETYPE. IF THERE ARE NO TELETYPES 02637000
ATTACHED, OR IF A IS NON-NULL AND NOT THE ADDRESS OF AN ATTACHED 02638000
TELETYPE, STATUS() WILL FAIL. FAILURE ALSO OCCURS IF I ISNT 02639000
NUMERICALLY "0" OR "1" (NULL OR MISSING IS "0"). 02640000
02641000
02642000
02643000
%CP 20 02644000
TIME(N) RETURNS VARIOUS TIMES ASSOCIATED WITH THE PROGRAM, AS FOLLOWS: 02645000
02646000
TIME("0") OR TIME() RETURNS THE TIME OF DAY IN THE FORM: 02647000
HH:MM:SS 02648000
02649000
TIME("1") RETURNS THE ELAPSED TIME SINCE MIDNIGHT IN SIXTIETHS 02650000
OF A SECOND. 02651000
02652000
TIME("2") RETURNS THE PROGRAMS TOTAL CPU TIME, IN SIXTIETHS OF 02653000
A SECOND. 02654000
02655000
TIME("3") RETURNS THE PROGRAMS TOTAL I/O CHANNEL TIME, AGAIN IN 02656000
SIXTIETHS OF A SECOND. 02657000
02658000
TIME("4") RETURNS THE VALUE OF A SIX-BIT TIMER IN THE FORM OF 02659000
A SINGLE CHARACTER. THE TIMER USED CHANGES EVERY SIXTIETH OF 02660000
A SECOND. WHEN CALLED AT WIDELY SPACED INTERVALS (THAT IS, 02661000
WITH SEVERAL HUNDRED SNOBOL INSTRUCTIONS IN BETWEEN), IT 02662000
BEHAVES MUCH LIKE A RANDOM CHARACTER. 02663000
02664000
02665000
02666000
%CP 2 02667000
TRACEF(F1,F2,F3,...) TURNS ON TRACING FOR THE FUNCTIONS NAMED BY 02668000
F1, F2, F3, ETC. SEE SECTION 11.1 FOR DETAILS. 02669000
02670000
02671000
02672000
%CP 2 02673000
TRACEL(L1,L2,L3,...) TURNS ON TRACING FOR THE LABELS CONTAINED IN L1, 02674000
L2, L3, ETC. SEE SECTION 11.1 FOR DETAILS. 02675000
02676000
02677000
02678000
%CP 2 02679000
TRACES(S1,S2,S3,...) TURNS ON TRACING FOR THE STRINGS NAMED BY 02680000
S1, S2, S3, ETC. SEE SECTION 11.1 FOR DETAILS. 02681000
02682000
02683000
02684000
%CP 6 02685000
TRIM(S) RETURNS THE VALUE OF S WITH ALL TRAILING BLANKS (IF ANY) 02686000
REMOVED. SOME EXAMPLES ARE: 02687000
02688000
TRIM(" AB C ") = " AB C" 02689000
TRIM(" " = "" 02690000
TRIM(" XYZ") = " XYZ" 02691000
02692000
02693000
02694000
%CP 3 02695000
UNEQL(A,B) SUCCEEDS IF A AND B HAVE DIFFERENT STRINGS AS VALUES. 02696000
THE USER SHOULD COMPARE UNEQL() WITH THE FUNCTIONS EQUALS() AND 02697000
.NE(). 02698000
02699000
02700000
%CP 7 02701000
USER(A) HAS TWO USES. IF A IS NULL, THE VALUE IS THE ADDRESS OF 02702000
THE TELETYPE BEING USED FOR I/O WITH THE STRING TELETYPE. IF 02703000
A IS NON-NULL, IT MUST BE THE ADDRESS OF AN ATTACHED TELETYPE. 02704000
THIS TELETYPE BECOMES THE ONE BEING USED FOR I/O, AND ITS ADDRESS 02705000
IS ALSO THE VALUE RETURNED. NOTE THAT IN THE LATTER CASE, USER(A) 02706000
IS NOT NECESSARILY THE SAME AS A, SINCE THE ADDRESS IS PUT INTO 02707000
A STANDARD FORMAT. FOR EXAMPLE, USER("01/03") = "1/3". 02708000
02709000
02710000
02711000
%CP 6 02712000
WAIT(N) SETS THE WAITING TIME FOR TELETYPE I/O TO N SECONDS, IF N 02713000
IS NON-NULL AND NUMERIC. IF N IS NON-NUMERIC, WAIT(N) FAILS. 02714000
IF N IS NULL, THE WAITING TIME IS NOT ALTERED. IN EITHER CASE, 02715000
THE RETURN VALUE IS THE WAITING TIME AS IT WAS BEFORE THE FUNCTION 02716000
WAS CALLED. THIS FUNCTION IS EQUIVALENT TO THE -WAIT CONTROL 02717000
CARD; IF NEITHER IS USED, 300 SECONDS (5 MINUTES) IS ASSUMED. 02718000
02719000
02720000
02721000
%SECTION 10 02722000
%PAGE 1 02723000
10. INPUT/OUTPUT. 02724000
02725000
I/O ON THE B5500 IS NORMALLY ASSOCIATED WITH A FILE, WHICH IS AN 02726000
ORDERED SET OF I/O "RECORDS". A FILE IS IDENTIFIED BY ITS NAME, 02727000
WHICH IS OF THE FORM <MULTI-FILE I.D.>/<FILE I.D.>, WHERE BOTH 02728000
<MULTI-FILE I.D.> AND <FILE I.D.> ARE STRINGS OF FROM 1 TO 7 02729000
CHARACTERS. NORMALLY, ONLY ALGOL-LIKE IDENTIFIERS ARE USED IN FILE 02730000
NAMES, SINCE MANY MCP FILE-HANDLING COMMANDS CAN ONLY HANDLE SUCH 02731000
NAMES. A SPECIAL CASE IS MADE FOR CARD-READER FILES, WHICH MAY 02732000
HAVE ONLY A <FILE I.D.>--THE <MULTI-FILE I.D.> IS THEN ASSUMED 02733000
TO BE "0000000". 02734000
TELETYPES ARE HANDLED DIFFERENTLY THAN NON-INTERACTIVE I/O DEVICES. 02735000
THERE IS NO "FILE" ASSOCIATED WITH A TELETYPE (AS FAR AS SNOBOL 02736000
USERS ARE CONCERNED). TELETYPE I/O IS DISCUSSED IN SECTION 10.4. 02737000
02738000
02739000
02740000
%CP 21 02741000
10.1. I/O STRINGS. 02742000
02743000
TO DO I/O, SNOBOL USES "I/O STRINGS" THESE ARE STRING NAMES 02744000
THAT ARE ASSOCIATED WITH I/O OPERATIONS IN ONE OF TWO WAYS: IF 02745000
A STRING HAS "INPUT USE", THEN ATTEMPTING TO USE ITS VALUE WILL 02746000
CAUSE INPUT OF A RECORD FROM ITS ASSOCIATED FILE; IF THE 02747000
STRING HAS "OUTPUT USE", THEN ASSIGNING A VALUE TO THE STRING WILL 02748000
CAUSE THE STRING TO BE OUTPUT TO ITS ASSOCIATED FILE. FOR EXAMPLE, 02749000
THE STRING NAMED "PRINT" IS AN OUTPUT STRING TO THE LINE PRINTER; 02750000
THE INSTRUCTION: 02751000
02752000
PRINT = "**A = " QUOTE A QUOTE 02753000
02754000
WILL OUTPUT THE VALUE OF A, IDENTIFIED AS SUCH, TO THE PRINTER. 02755000
BEFORE AN I/O STRING CAN BE USED, IT IS NECESSARY TO ASSIGN IT 02756000
TO A FILE. THERE ARE TWO WAYS TO DO THIS IN SNOBOL. THE WAY THAT 02757000
IS RECOMMENDED IS TO USE THE INTRINSIC FUNCTION FILL(), WHICH 02758000
IS DESCRIBED IN SECTION 9. AN ASSIGNMENT CAN BE MADE BY USING THE 02759000
MCP "?FILE" CONTROL CARD, THOUGH THIS IS RATHER RESTRICTED. SEE 02760000
SECTION 2.1 FOR A DESCRIPTION OF THIS CONTROL CARD. 02761000
02762000
02763000
02764000
%CP 24 02765000
10.2. OPEN AND CLOSED FILES. 02766000
02767000
A FILE IS EITHER "OPEN" OR "CLOSED" WITH RESPECT TO A GIVEN 02768000
PROGRAM. A FILE IS OPEN IF THE PROGRAM HAS DONE SOME I/O ON IT 02769000
AND HAS NOT CLOSED IT. IN SNOBOL, THERE ARE TWO WAYS TO CLOSE 02770000
A FILE: BY CALLING THE INTRINSIC FUNCTION CLOSE(), AND BY TERMINATING 02771000
THE PROGRAM. 02772000
WHEN THE FILE ASSOCIATED WITH A GIVEN I/O STRING HAS BEEN CLOSED, 02773000
THE PROGRAM CAN USE THE FILL() INTRINSIC TO RE-ASSIGN THE I/O STRING 02774000
TO A DIFFERENT FILE. THE NEW FILE CAN THEN BE OPENED BY DOING I/O 02775000
ON IT. A PROGRAM CAN CLOSE A FILE, RE-ASSIGN ITS I/O STRING, AND 02776000
OPEN THE NEW FILE AS OFTEN AS DESIRED. FOR EXAMPLE, IF A PROGRAM 02777000
HAS BEEN USING THE I/O STRING CARD, WHICH IS ASSIGNED TO, SAY, THE 02778000
FILE A/B, THIS FILE CAN BE DROPPED AND I/O RE-INITIATED ON THE 02779000
DISK FILE C/D BY THE FOLLOWING CODE: 02780000
02781000
CLOSE("CARD") 02782000
FILL("CARD","C","D","12") 02783000
C = CARD 02784000
02785000
THIS WILL ASSIGN C THE FIRST RECORD IN THE FILE C/D. 02786000
SOME I/O STRINGS (AND THEIR ASSOCIATED FILES) ARE OPEN AT THE 02787000
START OF A SNOBOL JOB, WHILE OTHERS ARE CLOSED. SEE THE NEXT SECTION 02788000
THE SUCH INFORMATION ON PARTICULAR I/O STRINGS 02789000
02790000
02791000
02792000
%CP 10 02793000
10.3. STANDARD I/O STRINGS. 02794000
02795000
THERE ARE A NUMBER OF STANDARD I/O STRINGS PROVIDED BY THE 02796000
B5500 SNOBOL SYSTEM, WHICH CAN BE ASSIGNED TO FILES OF THE APPROPRIATE 02797000
TYPES. UNFORTUNATELY, THE B5500 OPERATING SYSTEM MAKES IT IMPOSSIBLE 02798000
TO PROVIDE THE USER WITH A WAY TO DEFINE HIS OWN FILE TYPES (HOPEFULLY 02799000
THIS MAY BE REMEDIED SOMETIME IN THE FUTURE); THE I/O STRINGS THAT 02800000
ARE PROVIDED BY SNOBOL SHOULD BE SUFFICIENT FOR THE NEEDS OF MOST 02801000
USERS. 02802000
THE FOLLOWING I/O STRINGS ARE PRE-DEFINED BY B5500 SNOBOL3: 02803000
02804000
%CP 8 02805000
READ IS INPUT FROM A CARD-IMAGE FILE--THAT IS, ANY FILE (CARD, 02806000
TAPE, DISK, ETC.) WITH 80-CHAR LOGICAL RECORDS AND 240-CHAR 02807000
PHYSICAL RECORDS. CARD-READER FILES ACTUALLY DO NOT HAVE 02808000
240-CHAR PHYSICAL RECORDS, BUT THE SOFTWARE MAKES IT LOOK LIKE 02809000
THEY DO. FOR BATCH JOBS, READ IS OPEN AT THE START OF EXECUTION, 02810000
AND IS ASSIGNED TO THE FILE THAT CONTAINS THE PROGRAM. THE FIRST 02811000
RECORD READ WILL BE THE ONE FOLLOWING THE END CARD. FOR REMOTE 02812000
JOBS, READ IS CLOSED AT THE START OF EXECUTION. 02813000
02814000
%CP 13 02815000
LOOK IS A "NON-READING" INPUT STRING FOR THE SAME FILE THAT THE 02816000
STRING READ IS ASSIGNED TO. THAT IS, REPEATED USES OF LOOK 02817000
WILL GIVE THE SAME RECORD OF THE FILE; USING READ WILL THEN GIVE 02818000
THIS SAME RECORD, AND ADVANCE TO THE NEXT ONE. THUS: 02819000
02820000
A = LOOK 02821000
B = LOOK 02822000
C = READ 02823000
D = READ 02824000
02825000
WILL ASSIGN THE SAME RECORD TO A, B, AND C; D WILL GET THE NEXT ONE. 02826000
THE FUNCTION LOOK() CAN BE USED TO DEFINE STRINGS OF THIS TYPE 02827000
FOR OTHER INPUT FILES. THE STRING LOOK CAN IN FACT BE DEFINED 02828000
BY LOOK("LOOK","READ"). 02829000
02830000
02831000
%CP 5 02832000
CARD IS BOTH INPUT AND OUTPUT FOR A CARD-IMAGE FILE WITH 80-CHAR 02833000
LOGICAL RECORD AND 240-CHAR PHYSICAL RECORD. OF COURSE, IF IT IS 02834000
ASSIGNED TO A CARD-READER FILE, OUTPUT IS IMPOSSIBLE (AND WILL 02835000
CAUSE TERMINATION BY THE MCP). CARD IS CLOSED AT THE START OF 02836000
EXECUTION. 02837000
02838000
%CP 28 02839000
NEWDISK IS AN I/O STRING FOR A DISK FILE THAT WILL BE CREATED 02840000
WHEN THE FILE IS OPENED. THIS FILE CAN BE VIEWED AS A TEMPORARY 02841000
DISK FILE, WHICH WILL BE SAVED (PUT IN THE DISK DIRECTORY) 02842000
WHEN CLOSE("NEWDISK") OR CLOSE("NEWDISK","LOCK") IS CALLED, 02843000
OR WHEN THE PROGRAM TERMINATES. IF ANY OTHER SECOND PARAMETER 02844000
IS USED, THE FILE WILL BE CLOSED AND DISCARDED. THE FILE ASSOC- 02845000
IATED WITH NEWDISK HAS 80-CHAR LOGICAL RECORDS AND 240-CHAR 02846000
PHYSICAL RECORDS. WHEN NEWDISK IS CLOSED, IT CAN THEN BE 02847000
GIVEN A NEW NAME, IF DESIRED, AND RE-OPENED, AND ANOTHER 02848000
DISK FILE WILL BE CREATED. IF THERE IS ALREADY A FILE IN THE 02849000
DIRECTORY WITH THE NAME ASSIGNED TO NEWDISK, THEN ATTEMPTING 02850000
TO ENTER IT IN THE DIRECTORY WILL CAUSE THE PROGRAM TO BE SUSPENDED 02851000
UNTIL THE OPERATOR TAKES ACTION--USUALLY THIS ACTION CONSISTS OF 02852000
KILLING THE PROGRAM. THE MAXIMUM NUMBER OF RECORDS THAT CAN 02853000
BE PUT IN A FILE ASSOCIATED WITH NEWDISK IS 12000. THE END-OF- 02854000
FILE IS ALWAYS JUST AFTER THE LAST RECORD THAT HAS BEEN WRITTEN 02855000
ON THE FILE. THE SAVE FACTOR GIVEN TO FILES CREATED BY 02856000
NEWDISK IS 15 DAYS. 02857000
02858000
02859000
%CP 9 02860000
PRINT IS AN OUTPUT FILE TO THE LINE PRINTER. IT IS OPEN AT THE 02861000
START OF EXECUTION, SINCE THIS FILE IS USED BY THE COMPILER 02862000
TO PRODUCE THE LISTING AND THE OTHER OUTPUT THAT THE COMPILER 02863000
GENERATES. ON MOST B5500 SYSTEMS, THE LINE PRINTER HAS 132 02864000
CHARACTERS PER LINE; OUTPUT OF A STRING LONGER THAN THIS WILL 02865000
CAUSE TRUNCATION UNLESS MODE("OVERFLOW","PRINT") IS CALLED 02866000
(SEE SECTION 9, THE MODE() FUNCTION). CARRIAGE CONTROL IS 02867000
HANDLED BY THE FUNCTIONS SPACE() AND PAGE(), WHICH ARE DESCRIBED 02868000
IN SECTION 9. 02869000
02870000
%CP 12 02871000
SYSPOT IS AN ATTEMPT TO SIMULATE THE FIRST-CHARACTER CARRIAGE CONTROL 02872000
OF IBM, CDC, ETC. LINE PRINTERS. THE FIRST CHARACTER OF THE 02873000
OUTPUT IS DELETED AND TRANSLATED INTO THE APPROPRIATE CALLS OF 02874000
SPACE() AND PAGE(); THE REST OF THE STRING IS THEN PASSED TO 02875000
THE OUTPUT STRING, PRINT. THE CARRIAGE CONTROL CHARACTERS 02876000
CURRENTLY RECOGNIZED ARE: 02877000
02878000
" " SINGLE SPACING 02879000
"0" (ZERO) DOUBLE SPACING 02880000
"1" PAGE EJECT 02881000
"*" NO SKIP AT END OF PAGE 02882000
"+" NO SPACING--OVERPRINTING 02883000
02884000
02885000
%CP 3 02886000
PUNCH IS OUTPUT TO THE CARD PUNCH. THE LOGICAL AND PHYSICAL 02887000
RECORD SIZES ARE BOTH 80 CHARACTERS. PUNCH IS CLOSED AT THE 02888000
START OF EXECUTION. 02889000
02890000
%CP 2 02891000
TELETYPE IS AN I/O STRING TO ALL ATTACHED TELETYPES. IT IS 02892000
DESCRIBED IN THE NEXT SECTION. 02893000
02894000
02895000
02896000
%CP 12 02897000
10.4. TELETYPES. 02898000
02899000
TELETYPES ARE HANDLED SOMEWHAT DIFFERENTLY FROM THE NON-INTERACTIVE 02900000
I/O DEVICES. THERE IS NO "FILE" OF PRE-DEFINED "RECORDS" WHEN 02901000
USING A TELETYPE. ALSO, TELETYPE I/O OPERATIONS, ESPECIALLY INPUT, 02902000
CANT ALWAYS BE DONE IMMEDIATELY; IT IS OFTEN NECESSARY FOR THE 02903000
PROGRAM TO WAIT, ESPECIALLY FOR INPUT. THE INTRINSIC FUNCTIONS 02904000
THAT ARE USED WITH FILE I/O STRINGS WILL FAIL IF A TELETYPE I/O 02905000
STRING IS GIVEN TO THEM, AND THERE ARE A FEW FUNCTIONS THAT ARE 02906000
USED ONLY WITH TELETYPES. 02907000
THIS SECTION (AND ITS SUB-SECTIONS) GIVES A GENERAL PICTURE OF 02908000
HOW I/O IS DONE ON TELETYPES. 02909000
02910000
02911000
02912000
%CP 28 02913000
10.4.1. TELETYPE INPUT AND OUTPUT. 02914000
02915000
THERE IS A SINGLE I/O STRING USED WITH TELETYPES; IT IS CALLED 02916000
"TELETYPE". WHEN TELETYPE IS USED AS AN INPUT STRING, A STRING 02917000
IS READ FROM A TELETYPE. THE INPUT IS GIVEN TO THE PROGRAM WHEN THE 02918000
USER TYPES THE "END-OF-MESSAGE" CHARACTER, AN ARROW, "~". 02919000
(THE CTRL-Q COMBINATION IS ALSO END-OF-MESSAGE.) IF NO INPUT IS 02920000
RECEIVED WITHIN THE WAITING TIME FOR TELETYPE I/O, THEN TELETYPE 02921000
WILL FAIL. 02922000
WHEN A PROGRAM ASSIGNS A VALUE TO TELETYPE, THE VALUE IS WRITTEN 02923000
ON THE TELETYPE. THE OUTPUT OPERATION CAN FAIL IF, FOR SOME REASON, 02924000
THE OUTPUT CANT BE INITIATED WITHIN THE WAITING TIME, OR IF THE 02925000
USER PUSHES THE BREAK KEY DURING OUTPUT. THE OUTPUT STARTS WHEREVER 02926000
THE WRITE HEAD MAY HAPPEN TO BE, AND IF THE END OF THE LINE IS 02927000
REACHED, OVERPRINTING WILL OCCUR. THE PROGRAM MUST INDICATE THE 02928000
"CARRIAGE CONTROL" BY USING THE FOLLOWING CHARACTERS: 02929000
02930000
"{" (SINGLE QUOTE ON THE TELETYPE) CAUSES A RETURN TO THE 02931000
FIRST CHARACTER POSITION OF THE CURRENT LINE. 02932000
"!" (UP-ARROW ON THE TELETYPE) CAUSES THE PAPER TO ADVANCE 02933000
ONE LINE ("LINE FEED"). 02934000
02935000
IT SHOULD BE NOTED THAT ASSIGNING A VALUE TO TELETYPE ONLY 02936000
INITIATES OUTPUT. AS SOON AS THE OUTPUT STARTS, THE OUTPUT 02937000
ROUTINE RETURNS TO THE PROGRAM AND EXECUTION CONTINUES. SINCE 02938000
A TELETYPE IS SUCH A SLOW OUTPUT DEVICE, THE PROGRAM CAN GET QUITE 02939000
A LOT OF COMPUTING DONE BY THE TIME THE OUTPUT IS FINISHED. IT 02940000
IS QUITE COMMON FOR A PROGRAM TO HAVE A SECOND OUTPUT STRING READY 02941000
BY THE TIME A PREVIOUS OUTPUT IS FINISHED TYPING. 02942000
THERE CAN BE SEVERAL TELETYPES ATTACHED TO A SNOBOL PROGRAM AT 02943000
THE SAME TIME. AT A GIVEN INSTANCE, THE PROGRAM CAN DO I/O WITH 02944000
ONLY ONE OF THEM, BUT THE ONE BEING TALKED TO CAN BE CHANGED BY 02945000
USING THE INTRINSIC FUNCTION USER(). FOR OTHER FUNCTIONS RELEVANT 02946000
TO TELETYPE, SEE THE DESCRIPTIONS OF STATUS(), WAIT(), RELEASE(), 02947000
AND SUSPEND(). 02948000
02949000
02950000
02951000
%CP 7 02952000
10.4.2. TELETYPE WAITING TIMES. 02953000
02954000
AN I/O OPERATION ON A TELETYPE WILL FAIL IF IT DOES NOT SUCCEED 02955000
WITHIN A FIXED PERIOD OF TIME CALLED THE "WAITING TIME". THIS TIME 02956000
LIMIT CAN BE SET BY USING THE -WAIT CONTROL CARD OR THE INTRINSIC 02957000
FUNCTION WAIT(). IF NEITHER IS USED, A WAITING TIME OF 300 SECONDS 02958000
(5 MINUTES) IS ASSUMED BY SNOBOL. 02959000
02960000
02961000
02962000
%CP 40 02963000
10.4.3. TELETYPE ADDRESSES. 02964000
02965000
THIS SECTION IS ONLY OF INTEREST TO USERS WISHING TO USE 02966000
SEVERAL TELETYPES AT THE SAME TIME. OTHER USERS SHOULD PROBABLY 02967000
IGNORE IT. 02968000
SINCE IT IS POSSIBLE FOR A PROGRAM TO BE COMMUNICATING WITH 02969000
SEVERAL TELETYPES, AND ALL TELETYPE I/O IS DONE THROUGH THE ONE 02970000
I/O STRING, TELETYPE, THERE MUST BE A WAY TO DISTINGUISH BETWEEN 02971000
THE INDIVIDUAL TELETYPES. THIS IS DONE BY GIVING EACH TELETYPE 02972000
AN ADDRESS. THE FUNCTION USER() CAN THEN BE USED TO SWITCH BACK 02973000
AND FORTH BETWEEN THE VARIOUS TELETYPES ATTACHED. 02974000
A TELETYPE ADDRESS CONSISTS OF A PAIR OF INTEGERS SEPARATED 02975000
BY A "/". THE FIRST INTEGER IS CALLED THE "TERMINAL UNIT" NUMBER; 02976000
THE SECOND IS CALLED THE "BUFFER ADDRESS" (THE USER NEED NOT 02977000
REMEMBER THESE TERMS, SINCE THEY ARE RATHER WORTHLESS FOR MOST 02978000
PURPOSES). SOME POSSIBLE ADDRESSES, DEPENDING ON THE HARDWARE 02979000
AVAILABLE, ARE: "1/5", "1/15", "3/7", "10/13", "2/2", ETC. 02980000
A SNOBOL PROGRAM CAN ONLY COMMUNICATE WITH TELETYPES THAT ARE 02981000
"ATTACHED" TO IT. A TELETYPE BECOMES ATTACHED TO A SNOBOL PROGRAM 02982000
IN ONE OF TWO WAYS: 02983000
02984000
1) THE USER INITIATES THE JOB FROM A TELETYPE, WITH AN MCP 02985000
CONTROL CARD STARTING: 02986000
??EXECUTE SNOBOL/SNOBOL ... 02987000
2) THE USER ATTACHES HIS TELETYPE TO A RUNNING JOB WITH 02988000
ONE OF THE FOLLOWING EQUIVALENT COMMANDS: 02989000
??RUN SNOBOL/SNOBOL~ 02990000
??RUN SNOBOL~ 02991000
02992000
A PROGRAM CAN FIND OUT WHICH TELETYPES, IF ANY, ARE ATTACHED BY 02993000
USING THE STATUS() FUNCTION. ANY OF THE TELETYPES GIVEN BY THIS 02994000
FUNCTION CAN BE USED AS AN I/O DEVICE BY CALLING USER(A), WHERE 02995000
A IS THE TELETYPE ADDRESS. FOR EXAMPLE, IF IT IS KNOWN THAT A 02996000
TELETYPE WITH THE ADDRESS "1/5" IS ATTACHED, I/O CAN BE DONE ON 02997000
IT IN THE FOLLOWING MANNER: 02998000
02999000
USER("1/5") 03000000
TELETYPE = "{!" MESSAGE "{!" 03001000
ANSWER = TELETYPE /F(NO.RESPONSE) 03002000
03003000
OF COURSE, IF THERE IS ONLY ONE TELETYPE ATTACHED (AS IS ALMOST 03004000
ALWAYS THE CASE), THERE IS NO NEED TO WORRY ABOUT WHICH ONE IT IS, 03005000
SINCE ALL TELETYPE I/O WILL BE WITH THAT ONE TELETYPE. 03006000
03007000
03008000
03009000
%CP 40 03010000
10.4.4. SPECIAL CHARACTERS FOR THE TELETYPE. 03011000
03012000
THE CHARACTERS LISTED BELOW REQUIRE SPECIAL ATTENTION WHEN USED 03013000
WITH TELETYPE I/O. SOME ARE INTERPRETED AS CONTROL CHARACTERS BY 03014000
THE HARDWARE, AND OTHERS ARE PRINTED DIFFERENTLY ON THE LINE PRINTER 03015000
THAN ON THE TELETYPE. 03016000
03017000
03018000
PRINTER TELETYPE DESCRIPTION 03019000
03020000
"~" "~" "GROUP MARK", OR "END-OF-MESSAGE" CHARACTER. 03021000
THIS CAN NOT BE READ OR WRITTEN. THE 03022000
CTRL-Q COMBINATION IS THE SAME CHARACTER, 03023000
BUT DOESNT PRINT. 03024000
03025000
"{" APOSTROPHE THIS CAN BE INPUT, BUT WHEN OUTPUT, IT 03026000
CAUSES A "CARRIAGE RETURN"--THE WRITE 03027000
HEAD RETURNS TO COLUMN 1, AND NO CHAR 03028000
IS PRINTED. 03029000
03030000
"!" UP-ARROW THIS CAN ALSO BE INPUT, BUT WHEN OUTPUT, 03031000
IT CAUSES THE PAPER TO ADVANCE BY ONE LINE. 03032000
03033000
"}" EXCLAMATION WHEN TYPED, THIS CAUSES ERASURE OF THE 03034000
THE CURRENT "BUFFER"; WHEN OUTPUT, IT 03035000
CAUSES A DISCONNECT. 03036000
"<" "<" IS IGNORED ON OUTPUT; WHEN TYPED, IT 03037000
SOMETIMES CAUSES ERASURE OF THE PREVIOUS 03038000
CHARACTER TYPED, AND SOMETIMES ACTS 03039000
LIKE A "~". THE RULES THAT SAY WHICH 03040000
WILL OCCUR ARE TOO COMPLICATED TO BE 03041000
OF ANY PRACTICAL USE. 03042000
03043000
"|" BACK-SLASH NORMAL EXCEPT FOR THE DIFFERENT CHARACTER 03044000
USED ON THE TELETYPE. MOST TELETYPES 03045000
ALSO DONT INDICATE THAT THIS CHARACTER 03046000
IS TYPED BY USING SHIFT-L. 03047000
03048000
NOTE THAT "[" AND "]" ARE ON THE TELETYPE (SHIFT-J AND SHIFT-M); 03049000
THEY JUST ARENT INDICATED ON THE KEYS OF MOST TELETYPES. 03050000
03051000
03052000
03053000
%CP 50 03054000
10.5. CAUSES OF I/O. 03055000
03056000
TO EFFECTIVELY USE SNOBOL I/O, IT IS NECESSARY TO KNOW WHAT 03057000
CONSTRUCTS CAUSE INPUT OR OUTPUT TO OCCUR. THESE ARE DESCRIBED 03058000
HERE IN DETAIL: 03059000
03060000
INPUT OCCURS WHEN: 03061000
1) AN INPUT STRING IS USED AS A STRING REFERENCE IN RULES 03062000
OF THE FORMS: 03063000
03064000
<STR REF> 03065000
<STR REF> <PATTERN> 03066000
<STR REF> <PATTERN> <REPLACEMENT> 03067000
03068000
INPUT OCCURS IMMEDIATELY AFTER THE STRING REFERENCE IS 03069000
EVALUATED. THUS IN THE RULE: 03070000
03071000
CARD F(B) /F(L3) 03072000
03073000
THE INPUT OCCURS BEFORE F(B) IS CALLED. 03074000
2) AN EXPRESSION USES THE VALUE OF AN INPUT STRING. INPUT 03075000
OCCURS WHEN THE NAME IS ENCOUNTERED. THUS IN THE RULE: 03076000
03077000
STR F(READ "*",AL("1")) 03078000
03079000
THE INPUT OCCURS BEFORE AL("1") IS CALLED. 03080000
03081000
OUTPUT OCCURS WHEN: 03082000
1) AN OUTPUT STRING IS USED AS A STRING REFERENCE IN RULES 03083000
OF THE FORMS: 03084000
03085000
<STR REF> <REPLACEMENT> 03086000
<STR REF> <PATTERN> <REPLACEMENT> 03087000
03088000
OUTPUT OCCURS IMMEDIATELY AFTER THE REPLACEMENT IS DONE. 03089000
FOR EXAMPLE, TO OUTPUT A LINE TO THE PRINTER: 03090000
03091000
PRINT = "CRD = " QUOTE CRD QUOTE 03092000
03093000
NOTE THAT IN RULES OF THE FORM <STR REF> <PATTERN> <REPLACEMENT> 03094000
BOTH INPUT AND OUTPUT WILL OCCUR IF THE STRING REFERENCE IS 03095000
BOTH AN INPUT STRING AND AN OUTPUT STRING. 03096000
2) A STRING VARIABLE HAS AN OUTPUT STRING FOR ITS NAME, AND 03097000
THE PATTERN MATCH SUCCEEDS. OUTPUT OCCURS WHEN THE ASSIGNMENT 03098000
TO THAT VARIABLE IS MADE. 03099000
3) A FUNCTION IS CALLED, AND AN OUTPUT STRING IS EITHER THE 03100000
STRING NAMED THE SAME AS THE FUNCTION, A FORMAL PARAMETER, 03101000
OR A LOCAL VARIABLE. OUTPUT OCCURS AT BOTH THE CALL AND 03102000
THE RETURN OF THE FUNCTION. 03103000
03104000
03105000
03106000
%SECTION 11 03107000
%PAGE 1 03108000
11. DEBUGGING AIDS. 03109000
03110000
THERE ARE CURRENTLY TWO TYPES OF DEBUGGING AIDS PROVIDED IN 03111000
B5500 SNOBOL3. THERE IS A TRACING FACILITY THAT CAN BE USED TO 03112000
MAKE A RECORD OF VALUES ASSIGNED TO VARIABLES, CALLS OF FUNCTIONS, 03113000
AND TRANSFERS TO LABELS. THERE IS ALSO AN INTERACTIVE DEBUGGING 03114000
TOOL THAT ALLOWS A USER AT A TELETYPE TO SUSPEND A PROGRAM, ASK 03115000
QUESTIONS ABOUT ITS STATE, CORRECT ERRORS MADE BY THE PROGRAM, 03116000
AND RESUME EXECUTION. 03117000
03118000
03119000
03120000
%CP 5 03121000
11.1. TRACING. 03122000
03123000
TRACING IS PROVIDED IN B5500 SNOBOL FOR STRINGS, FUNCTIONS, AND 03124000
LABELS. OUTPUT FROM TRACING GOES TO THE LINE PRINTER FILE, PRINT. 03125000
THE FUNCTIONS THAT CONTROL TRACING ARE: 03126000
03127000
03128000
%CP 21 03129000
TRACES(S1,S2,S3,...) TURNS ON TRACING FOR THE STRINGS NAMED BY 03130000
S1, S2, S3, ETC. THIS MEANS THAT WHENEVER A VALUE IS ASSIGNED 03131000
TO ONE OF THESE STRINGS, OUTPUT OCCURS GIVING THE STATEMENT 03132000
NUMBER, THE STRING NAME, AND ITS VALUE, IN THE FORM: 03133000
03134000
*S <STMT#> <NAME> = " <VALUE> " 03135000
03136000
FOR EXAMPLE, TO TURN ON TRACING FOR ALPHA, XV2, AND QVAR, CALL: 03137000
03138000
TRACES("ALPHA","XV2","QVAR") 03139000
03140000
IF THE VARIABLE ALPHA WERE ASSIGNED THE VALUE "THIS ONE" IN 03141000
STATMENT 135, THE FOLLOWING WOULD BE PRINTED: 03142000
03143000
*S 135 ALPHA = "THIS ONE" 03144000
03145000
STRING TRACING IS CONSIDERED AN OUTPUT USE OF THE STRING, AND 03146000
TURNING ON TRACING WILL TERMINATE ANY PREVIOUS I/O USE THE STRING 03147000
MAY HAVE HAD. TRACING OUTPUT OCCURS AT ALL PLACES WHERE OUTPUT 03148000
OCCURS FOR STRINGS WITH OUTPUT USE--THAT IS, WHEREVER A VALUE 03149000
IS ASSIGNED. 03150000
03151000
03152000
%CP 27 03153000
TRACEF(F1,F2,F3,...) TURNS ON TRACING FOR THE FUNCTION NAMED BY 03154000
F1, F2, F3, ETC. WHEN ANY OF THESE FUNCTIONS IS CALLED, OUTPUT 03155000
OCCURS GIVING THE FUNCTION NAME, THE STATEMENT NUMBER, AND THE 03156000
VALUES OF THE PARAMETERS, IN THE FORM: 03157000
03158000
*C <STMT#> <FCT NAME>( <PARAMS> ) 03159000
03160000
WHEN THE FUNCTION RETURNS, MORE OUTPUT OCCURS (STARTING WITH 03161000
"*R" RATHER THAN "*C") GIVING THE RETURN VALUE OR INDICATING 03162000
FAILURE. FOR EXAMPLE, SUPPOSE A PROGRAM HAD CALLED: 03163000
03164000
TRACEF("BLOCK","TIME","FLXGQ") 03165000
03166000
THIS WILL START TRACING FOR THE FUNCTIONS BLOCK(), TIME(), AND 03167000
FLXGQ(). SUPPOSE THAT STATEMENT 93 THEN CALLS BLOCK(A,"3"), AND 03168000
A = "IT0"; AND THE VALUE RETURNED IS "X.3". THEN THE FOLLOWING 03169000
OUTPUT WILL OCCUR: 03170000
03171000
*C 93 BLOCK("IT0","3") 03172000
*R 93 BLOCK() = "X.3" 03173000
03174000
IF BLOCK HAD FAILED, THE LAST LINE WOULD HAVE BEEN: 03175000
03176000
*R 93 BLOCK() FAILED. 03177000
03178000
NOTE THAT TRACING CAN BE USED WITH BOTH SYSTEM-DEFINED AND 03179000
PROGRAM-DEFINED FUNCTIONS. 03180000
03181000
03182000
%CP 13 03183000
TRACEL(L1,L2,L3,...) INITIATES TRACING FOR THE LABELS CONTAINED 03184000
IN L1, L2, L3, ETC. THIS MEANS THAT WHENEVER ANY OF THESE LABELS 03185000
IS ENCOUNTERED, OUTPUT OCCURS GIVING THE LABEL, THE NUMBER OF 03186000
TIMES IT HAS BEEN EXECUTED (INCLUDING THE CURRENT ONE), AND 03187000
THE NUMBER OF THE PREVIOUS INSTRUCTION. THUS, IF A PROGRAM 03188000
HAD CALLED: 03189000
03190000
TRACEL("BACK","NONE","B1","B2") 03191000
03192000
THEN IF STATEMENT 216 TRANSFERS TO BACK, WHICH HAS PREVIOUSLY 03193000
BEEN EXECUTED 17 TIMES, THE FOLLOWING WILL BE PRINTED: 03194000
03195000
*L BACK 18 FROM 216 03196000
03197000
03198000
%CP 17 03199000
DETACH(N,T) CAN BE USED TO TURN OFF TRACING. THE NAME OF THE 03200000
OBJECT CONCERNED IS CONTAINED IN N; T GIVES THE TYPE AS FOLLOWS: 03201000
03202000
"S" MEANS THAT N CONTAINS A STRING NAME. 03203000
"F" MEANS THAT N CONTAINS A FUNCTION NAME. 03204000
"L" MEANS THAT N CONTAINS A LABEL. 03205000
03206000
ONLY THE FIRST CHARACTERS OF T IS LOOKED AT; IF T IS NULL, "S" 03207000
IS ASSUMED. THUS, TO TURN OFF TRACING FOR THE STRING NAMED ALPHA, 03208000
THE PROGRAM COULD CALL ANY OF: 03209000
03210000
DETACH("ALPHA") 03211000
DETACH("ALPHA","S") 03212000
DETACH("ALPHA","STRING") 03213000
DETACH("ALPHA","SLORKLE") 03214000
03215000
03216000
03217000
%PAGE 03218000
11.2. INTERACTIVE DEBUGGING. 03219000
03220000
AN INTERACTIVE DEBUGGING AID HAS BEEN IMPLEMENTED FOR USE WITH 03221000
A TELETYPE. BASICALLY, IT CONSISTS OF SUSPENDING A PROGRAM AND 03222000
ASKING THE INTERPRETER QUESTIONS ABOUT ITS STATE. IF ERRORS HAVE 03223000
BEEN MADE, VALUES OF STRINGS CAN BE CHANGED, AND THE PROGRAM CAN 03224000
BE RE-INITIATED EITHER WHERE IT WAS SUSPENDED OR AT ANY OTHER 03225000
LABELED INSTRUCTION. 03226000
A PROGRAM CAN BE SUSPENDED, AND THE DEBUGGING ROUTINE INITIATED, 03227000
BY ANY OF THE FOLLOWING METHODS: 03228000
03229000
1) THE PROGRAM CAN CALL SUSPEND()--WITH NULL PARAMETER. 03230000
2) IF A -DEBUG CARD OCCURRED DURING COMPILATION, SUSPENSION 03231000
WILL OCCUR JUST BEFORE THE FIRST INSTRUCTION STARTS. 03232000
3) SUSPENSION OCCURS WHEN THE PROGRAM IS RUNNING IN "DEBUG" 03233000
MODE AND THE PROGRAM ENCOUNTERS A LIMIT SET DURING A PREVIOUS 03234000
SUSPENSION. 03235000
4) THE PROGRAM COMMITS ANY OF THE VARIOUS PROGRAM ERRORS THAT 03236000
ARE NORMALLY FATAL. THESE ARE ERRORS SUCH AS CALLING UNDEFINED 03237000
FUNCTIONS, TRYING TO EXECUTE A STATEMENT WITH A SYNTAX ERROR, 03238000
TRANSFERRING TO AN UNDEFINED LABEL, ETC. 03239000
03240000
A PROGRAM RUNS EITHER IN NORMAL ("RUN") MODE OR IN "DEBUG" MODE. 03241000
"DEBUG" MODE CAUSES CHECKING FOR A NUMBER OF PROGRAM CONDITIONS 03242000
WHOSE OCCURENCE WILL CAUSE THE PROGRAM TO BE SUSPENDED. FOR A 03243000
LIST OF THE LIMITS THAT CAN BE SET BY THE PROGRAMMER, SEE THE "RUN" 03244000
COMMAND BELOW. A PROGRAM CAN BE IN DEBUG MODE FOR ANY OF THE 03245000
FOLLOWING REASONS: 03246000
03247000
1) THE PROGRAM CONTAINED A -DEBUG CONTROL CARD. 03248000
2) THE PROGRAM WAS SUSPENDED EARLIER. 03249000
3) THE PROGRAM HAS CALLED MODE("DEBUG"). 03250000
03251000
DEBUG MODE IS TURNED OFF BY CALLING MODE("RUN"). IF THIS IS DONE, 03252000
THE ONLY WAY TO GET BACK TO THE DEBUGGING ROUTINE IS FOR THE PROGRAM 03253000
TO CALL SUSPEND() OR MODE("DEBUG"), SINCE MODE("RUN") TURNS OFF ALL 03254000
THE LIMIT CHECKING ASSOCIATED WITH DEBUG MODE. 03255000
WHEN A PROGRAM IS SUSPENDED, THE SYSTEM TYPES OUT "SUSPENDED" 03256000
AND IS THEN WAITING FOR A COMMAND. THE COMMANDS THAT HAVE BEEN 03257000
IMPLEMENTED AS OF THIS WRITING ARE: 03258000
03259000
03260000
%CP 23 03261000
TYPE <NAME>~ 03262000
THIS CAUSES THE VALUE OF THE VARIABLE <NAME> TO BE TYPED IN 03263000
THE FOLLOWING FORM: 03264000
03265000
<NAME> = " <VALUE> " 03266000
03267000
IF THE PROGRAM DOESNT CONTAIN <NAME>, AND IT HASNT BEEN CREATED 03268000
BY INDIRECTION, THE RESPONSE IS: 03269000
03270000
<NAME> NOT IN USE 03271000
03272000
IN ORDER TO ALLOW THE USER TO USE ANY STRING NAME THAT CAN 03273000
BE ENTERED FROM A TELETYPE, THE FOLLOWING CONVENTION IS MADE: 03274000
THERE IS EXACTLY ONE BLANK AFTER "TYPE"; THE REST OF THE INPUT 03275000
STRING IS THE <NAME>. THUS ANY CHARACTER READABLE FROM A 03276000
TELETYPE CAN BE USED IN <NAME>, INCLUDING BLANKS. FOR EXAMPLE, 03277000
THE COMMAND: 03278000
03279000
TYPE *AA/3 B1~ 03280000
03281000
MIGHT GET THE RESPONSE: 03282000
03283000
*AA/3 B1 = "437 A+B 4" 03284000
03285000
03286000
03287000
%CP 19 03288000
SET <NAME>~ 03289000
<VALUE>~ 03290000
THIS COMMAND, REQUIRING TWO INPUT STRINGS, ASSIGNS THE STRING 03291000
<VALUE> TO <NAME>. THE FIRST INPUT, SET <NAME>~, PRODUCES 03292000
A RETURN/LINE FEED FROM SNOBOL, AND IT IS THEN WAITING FOR THE 03293000
<VALUE>. THE CONVENTIONS FOR <NAME> ARE THE SAME AS FOR THE 03294000
TYPE COMMAND. FOR EXAMPLE, THE THREE COMMANDS: 03295000
03296000
SET AB3~ 03297000
N.47.-27.C1~ 03298000
TYPE AB3~ 03299000
03300000
WILL GET THE RESPONSE: 03301000
03302000
AB3 = "N.47.-27.C1" 03303000
03304000
BECAUSE TRANSMISSION ERRORS DO OCCUR FAIRLY OFTEN WITH TELETYPES, 03305000
IT IS ADVISABLE TO FOLLOW SET COMMANDS WITH TYPE COMMANDS TO 03306000
VERIFY THAT THE CORRECT VALUE HAS BEEN ASSIGNED. 03307000
03308000
03309000
03310000
%CP 9 03311000
LABEL <LABEL>~ 03312000
THIS COMMAND SIMPLY TELLS THE USER HOW MANY TIMES THE LABEL HAS 03313000
BEEN EXECUTED SO FAR. IF THE LABEL ISNT DEFINED, THE RESPONSE 03314000
WILL BE: 03315000
03316000
<LABEL> NOT DEFINED 03317000
03318000
LIKE WITH THE TYPE AND SET COMMANDS, THERE IS EXACTLY ONE BLANK 03319000
BETWEEN "LABEL" AND <LABEL>. 03320000
03321000
03322000
03323000
%CP 41 03324000
RUN <INTEGER> FROM <LABEL> TO <LABEL> <LABEL> <LABEL> ...~ 03325000
THIS COMPLICATED COMMAND RE-INITIATES EXECUTION, AND ALSO SETS 03326000
UP THE CONDITIONS THAT ARE TO CAUSE SUSPENSION LATER. ALL OF 03327000
THE COMMAND AFTER "RUN" IS OPTIONAL, AND BREAKS DOWN INTO SEVERAL 03328000
SECTIONS, THAT ARE REALLY PARAMETERS. 03329000
IF <INTEGER> IS USED, THEN THE PROGRAM WILL BE SUSPENDED 03330000
AFTER IT EXECUTES <INTEGER> INSTRUCTIONS, IF IT MANAGES TO 03331000
GET THAT FAR AT ALL. 03332000
IF FROM <LABEL> IS USED, THE CURRENT INSTRUCTION WILL BE 03333000
TERMINATED (AS IF IT HAD FAILED), AND EXECUTION WILL RESUME AT 03334000
THE STATEMENT LABELED <LABEL>. IF <LABEL> ISNT DEFINED, THE 03335000
RESPONSE WILL BE: 03336000
03337000
<LABEL> NOT DEFINED 03338000
03339000
AND THE PROGRAM WILL REMAIN SUSPENDED. 03340000
IF THE TO <LABEL> <LABEL> ... PART IS INCLUDED, IT IS 03341000
INTERPRETED AS A LIST OF LABELS THAT ARE TO CAUSE SUSPENSION IF 03342000
THE PROGRAM TRIES TO EXECUTE THEM. NOTE THAT THE LABELS ARE 03343000
SEPARATED BY BLANKS--ANY OTHER DELIMITERS (SUCH AS COMMAS) WILL 03344000
BE INTERPRETED AS PART OF A LABEL. IF A LABEL IS USED THAT 03345000
ISNT DEFINED, THE "NOT DEFINED" RESPONSE WILL BE GIVEN, AND 03346000
THE PROGRAM WILL REMAIN SUSPENDED. THERE IS A LIMIT TO THE 03347000
NUMBER OF LABELS THAT CAN BE GIVEN. THIS LIMIT IS CURRENTLY 03348000
SET TO 16, THOUGH IT MAY BE INCREASED IN THE FUTURE IF THERE 03349000
IS DEMAND FOR MORE. IF TOO MANY LABELS ARE GIVEN, THE RESPONSE 03350000
WILL BE "TOO MANY LABELS", AND THE PROGRAM WILL REMAIN SUSPENDED. 03351000
AS A SPECIAL CASE, IF "TO" IS USED WITHOUT ANY LABELS FOLLOWING 03352000
IT, THE LIMITS WILL BE THE SAME AS THOSE USED THE LAST TIME (IF 03353000
ANY). 03354000
SOME EXAMPLES OF RUN COMMANDS ARE: 03355000
03356000
RUN~ 03357000
RUN 75~ 03358000
RUN FROM HNT3 TO HNT5 HNT8~ 03359000
RUN 40 FROM GIN.7~ 03360000
RUN 500 FROM A3 TO B1 AA1 APPLY3 ERROR EOJ ALTRY~ 03361000
RUN FROM FORR1 TO~ 03362000
RUN 1000 TO~ 03363000
RUN 1~ 03364000
RUN FROM START~ 03365000
03366000
03367000
03368000
%CP 2 03369000
END~ 03370000
THIS CAUSES THE PROGRAM TO TERMINATE NORMALLY. 03371000
03372000
03373000
03374000
%CP 2 03375000
ABORT~ 03376000
THIS CAUSES ABNORMAL TERMINATION OF THE PROGRAM. 03377000
03378000
03379000
03380000
%CP 7 03381000
WHY~ 03382000
THIS CAUSES THE REASON(S) FOR SUSPENSION TO BE TYPED. SOME 03383000
POSSIBLE RESPONSES TO THIS ARE: 03384000
03385000
RULE LIMIT HIT 03386000
LABEL LIMIT HIT 03387000
SUSPEND() CALLED 03388000
FATAL ERROR 03389000
03390000
03391000
03392000
%CP 4 03393000
WHERE~ 03394000
THIS CAUSES THE SYSTEM TO TYPE OUT WHERE THE PROGRAM WAS SUSPENDED 03395000
(STATEMENT NUMBER AND LAST LABEL) AND HOW MANY RULES HAVE BEEN 03396000
EXECUTED SO FAR. 03397000
03398000
03399000
03400000
%SECTION 12 03401000
%PAGE 1 03402000
12. MISCELLANEOUS. 03403000
03404000
%CP 6 03405000
THE FOLLOWING CHARACTERS HAVE SPECIAL MEANING IN COLUMN 1: 03406000
"?" MCP CONTROL CARD 03407000
"-" SNOBOL CONTROL CARD 03408000
"." CONTINUATION CARD (INVALID FROM TELETYPE) 03409000
"*" COMMENT CARD 03410000
"%" COMMENT CARD 03411000
03412000
03413000
03414000
%CP 3 03415000
A LABEL IS ANY NON-NULL STRING PRECEDING THE FIRST BLANK ON A CARD. 03416000
THE FIRST CHARACTER CAN BE ANY EXCEPT THOSE LISTED ABOVE; THE REST 03417000
OF THE LABEL CAN USE ANY CHARACTERS BUT BLANKS. 03418000
03419000
03420000
03421000
%CP 4 03422000
WHEN ENTERING A PROGRAM FROM A TELETYPE, ANY INPUT ENDING WITH 03423000
"#" WILL BE TREATED AS AN ERROR--THE COMPILER WILL DISCARD IT 03424000
TYPE "TRY AGAIN", AND ASK FOR MORE INPUT. 03425000
03426000
03427000
03428000
%CP 5 03429000
THE GO-TO PART CAN BE SET OFF BY EITHER " /" OR ":". IF " /" IS 03430000
USED (NOTE THE BLANK), THE NEXT CHARACTER MUST BE EITHER "(", "S", 03431000
OR "F". A COLON (":") CAN BE SURROUNDED BY ANY NUMBER OF BLANKS, 03432000
INCLUDING NONE, AND CAN STAND ALONE WITH GO GO-TO PART FOLLOWING 03433000
IT, IN WHICH CASE IT IS IGNORED. 03434000
03435000
03436000
03437000
%CP 2 03438000
TO SEPARATE A PATTERN OR STRING REFERENCE FROM A REPLACEMENT, EITHER 03439000
"=" OR "~" CAN BE USED. THE COMPILER THINKS THEY ARE EQUIVALENT. 03440000
03441000
03442000
03443000
%CP 7 03444000
THE "ILLEGAL CHARACTER","?", CANT BE READ FROM A CARD READER EXCEPT 03445000
IN COLUMN 1, IN WHICH CASE IT INDICATES AN MCP CONTROL CARD. ANY 03446000
CARD CONTAINING "?" ANYWHERE ELSE WILL BE THROWN OUT BY THE CARD 03447000
READER, AND THE JOB WILL USUALLY NOT BE RUN. THIS CHARACTER CANT 03448000
BE INPUT FROM A TELETYPE, EITHER, SINCE ANY INPUT CONTAINING "?" 03449000
WILL BE INTERPRETED AS A MESSAGE TO THE MCP. THERE IS NO PROBLEM 03450000
WITH WRITING A "?" ON THE LINE PRINTER OR ON A TELETYPE. 03451000
03452000
03453000
03454000
%CP 9 03455000
THERE ARE THREE STRINGS WHICH B5500 SNOBOL3 INITIALIZES TO HAVE 03456000
NON-NULL VALUES. THEY ARE: 03457000
03458000
QUOTE CONTAINS A QUOTE 03459000
QMARK = "?" 03460000
ARROW = "~" 03461000
03462000
THE STRINGS QMARK AND ARROW ARE PROVIDED MAINLY FOR TELETYPE USERS; 03463000
SINCE NEITHER CAN BE INPUT FROM A TELETYPE. 03464000
03465000
03466000
03467000
%CP 2 03468000
THE SYSTEM LIMIT ON STRING SIZE IS 8181 CHARACTERS. ATTEMPTING TO 03469000
CREATE A STRING LONGER THAN THIS WILL CAUSE ABNORMAL TERMINATION. 03470000
03471000
03472000
03473000
%CP 9 03474000
THE CONCATENATE OPERATOR IS A BLANK. BLANKS ARE USUALLY OPTIONAL, 03475000
WITH THE FOLLOWING EXCEPTIONS: 03476000
03477000
1) BEFORE THE STRING REFERENCE. 03478000
2) BETWEEN TWO IDENTIFIERS. 03479000
3) BETWEEN AN IDENTIFIER AND A FOLLOWING "(", TO DISTINGUISH 03480000
A CONCATENATION OF A STRING AND A GROUPING FROM A FUNCTION 03481000
CALL (WHICH HAS NO BLANK). 03482000
4) BEFORE A "/" USED AS A GO-TO DELIMITER. 03483000
03484000
03485000
03486000
%CP 4 03487000
ANY STRING CAN BE USED AS A STRING NAME, INCLUDING THE NULL STRING. 03488000
IN PARTICULAR, THE FOLLOWING IS A VALID EXPRESSION: 03489000
03490000
$"" 03491000
03492000
03493000
03494000
%CP 5 03495000
IF A GO-TO PART HAS BOTH A SUCCESS AND A FAILURE EXIT, THEN THE "S" 03496000
OR "F" CAN BE OMITTED FROM THE SECOND PART. THUS: 03497000
03498000
/S(A)(B) MEANS /S(A)F(B) 03499000
:F(XA)(X7) MEANS :F(XA)S(X7) 03500000
03501000
03502000
03503000
%CP 11 03504000
SEVERAL STATEMENTS CAN BE PUT ON ONE CARD. THEY ARE SEPARATED BY 03505000
SEMICOLONS (";"). CONTINUATION CARDS CAN BE USED AS USUAL. OF 03506000
COURSE, SINCE A LABEL MUST START IN COLUMN 1, ONLY THE FIRST STATEMENT 03507000
ON A CARD CAN BE LABELED. FOR EXAMPLE, 03508000
03509000
L A ".." = "." /S(L); B = A "," B /(LOOP) 03510000
03511000
MEANS THE SAME AS: 03512000
03513000
L A ".." = "." /S(L) 03514000
B = A "," B /(LOOP) 03515000
03516000
03517000
03518000
%CP 15 03519000
NO INTERNAL DISTINCTION IS MADE BETWEEN FORMAL PARAMETERS AND LOCAL 03520000
VARIABLES OF PROGRAM-DEFINED FUNCTIONS. IF A FUNCTION IS CALLED WITH 03521000
MORE ACTUAL PARAMETERS THAN THERE ARE FORMAL PARAMETERS, THE EXTRA 03522000
PARAMETERS WILL BE ASSIGNED TO LOCAL VARIABLES. FOR EXAMPLE, IF F() 03523000
IS DEFINED BY: 03524000
03525000
DEFINE("F(A,B)","F1","C,D") 03526000
03527000
THEN IF THE PROGRAM CALLS F("+","-","|"), THE VALUES AT THE ENTRY 03528000
POINT, F1, WILL BE: 03529000
03530000
A = "+" 03531000
B = "-" 03532000
C = "|" 03533000
D = "" 03534000
03535000
03536000
03537000
%APPENDIX A 03538000
%PAGE 1 03539000
APPENDIX A. BNF DEFINITIONS FOR SNOBOL3. 03540000
03541000
<INSTRUCTION> ::= <LABELED INST> 03542000
::= <UNLABELED INST> 03543000
<LABELED INST> ::= <LABEL> <UNLABELED INST> 03544000
<UNLABELED INST> ::= <BLANKS> <INST> 03545000
<INST> ::= <RULE> 03546000
::= <GO-TO PART> 03547000
::= <RULE> <GO-TO PART> 03548000
<RULE> ::= <STR REF> 03549000
::= <STR REF> <PATTERN> 03550000
::= <STR REF> <REPLACEMENT> 03551000
::= <STR REF> <PATTERN> <REPLACEMENT> 03552000
<STR REF> ::= <ELEMENT> 03553000
<PATTERN> ::= <ELEMENT> 03554000
::= <STR VAR> 03555000
::= <PATTERN> <PATTERN> 03556000
::= <PATTERN> <BACK REF> 03557000
<REPLACEMENT> ::= <RPL DELIMITER> <EXPRESSION> 03558000
<RPL DELIMITER> ::= ~ 03559000
::= = 03560000
<EXPRESSION> ::= <ELEMENT> 03561000
::= <EXPRESSION> <CONCATENATE OP> <ELEMENT> 03562000
::= <EMPTY> 03563000
<ELEMENT> ::= <NAMED EXPR> 03564000
::= <VALUE EXPR> 03565000
<NAMED EXPR> ::= <IDENTIFIER> 03566000
::= $ <ELEMENT> 03567000
<VALUE EXPR> ::= <LITERAL> 03568000
::= <GROUPING> 03569000
::= <FCT CALL> 03570000
::= <ARITH EXPR> 03571000
<CONCATENATE OP> ::= <BLANKS> 03572000
<IDENTIFIER> ::= <LETTER> 03573000
::= <IDENTIFIER><LETTER> 03574000
::= <DIGIT> 03575000
::= <IDENTIFIER><DIGIT> 03576000
::= . 03577000
::= <IDENTIFIER> . 03578000
<LITERAL> ::= " <STRING> " 03579000
<GROUPING> ::= ( <EXPRESSION> ) 03580000
<FCT CALL> ::= <FCT NAME>( <PARAMS> ) 03581000
<FCT NAME> ::= <IDENTIFIER> 03582000
<PARAMS> ::= <EXPRESSION> 03583000
::= <PARAMS> , <EXPRESSION> 03584000
<ARITH EXPR> ::= <A-TERM> 03585000
::= - <A-TERM> 03586000
<A-TERM> ::= <A-TERM> <ADD AP> <M-TERM> 03587000
::= <M-TERM> 03588000
<M-TERM> ::= <M-TERM> <MUL OP> <E-TERM> 03589000
::= <E-TERM> 03590000
<E-TERM> ::= <E-TERM> <EXP OP> <ARITH ELT> 03591000
::= <ARITH ELT> 03592000
<ARITH ELT> ::= <NAMED EXPR> 03593000
::= <GROUPING> 03594000
::= <FCT CALL> 03595000
::= <LITERAL> 03596000
<ADD OP> ::= + 03597000
::= - 03598000
<MUL OP> ::= * 03599000
::= | 03600000
::= / 03601000
<EXP OP> ::= ** 03602000
<PATTERN> ::= <ELEMENT> 03603000
::= <STR VAR> 03604000
::= <PATTERN> <PATTERN> 03605000
::= <PATTERN> <BACK REF> 03606000
<STR VAR> ::= <ARB VAR> 03607000
::= <BAL VAR> 03608000
::= <FIXED-LENGTH VAR> 03609000
<ARB VAR> ::= ** 03610000
::= * <NAMED EXPR> * 03611000
<BAL VAR> ::= *()* 03612000
::= *( <NAMED EXPR> )* 03613000
<FIXED-LENGTH VAR> ::= */ <EXPRESSION> * 03614000
::= * <NAMED EXPR> / <EXPRESSION> * 03615000
<BACK REF> ::= <NAMED EXPR> 03616000
<GO-TO PART> ::= <GO-TO DELIMITER> <GO-TOS> 03617000
<GO-TO DELIMITER> ::= <BLANKS> / 03618000
::= : 03619000
<GO-TOS> ::= <UNCONDITIONAL GO-TO> 03620000
::= <SUCCESS GO-TO> 03621000
::= <FAILURE GO-TO> 03622000
::= <SUCCESS GO-TO> <FAILURE GO-TO> 03623000
::= <FAILURE GO-TO> <SUCCESS GO-TO> 03624000
<UNCONDITIONAL GO-TO> ::= ( <LABEL EXPR> ) 03625000
<SUCCESS GO-TO> ::= S( <LABEL EXPR> ) 03626000
<FAILURE GO-TO> ::= F( <LABEL EXPR> ) 03627000
<LABEL EXPR> ::= <RESERVED LABEL> 03628000
::= <LABEL> 03629000
::= <COMPUTED LABEL> 03630000
<RESERVED LABEL> ::= END 03631000
::= RETURN 03632000
::= FRETURN 03633000
03634000
03635000
03636000
%APPENDIX B 03637000
%PAGE 1 03638000
APPENDIX B. BNF NOTATION. 03639000
03640000
FOR THOSE NOT FAMILIAR WITH "BNF" (BACKUS-NAUR FORM OR 03641000
BACKUS NORMAL FORM), A BRIEF DESCRIPTION FOLLOWS. BNF IS A 03642000
SOMEWHAT STANDARDIZED METHOD OF PRECISELY NOTATING SYNTACTIC 03643000
DEFINITIONS OF CERTAIN TYPES. 03644000
QUANTITIES WHICH MUST APPEAR AS A CERTAIN STRING OF CHARACTERS 03645000
ARE REPRESENTED BY THAT STRING OF CHARACTERS. VARIABLE STRINGS 03646000
ARE GIVEN A NAME, WHICH IS SURROUNDED BY "BNF BRACKETS", "<" 03647000
AND ">". FOR EXAMPLE, THE MCP CONTROL CARD: 03648000
03649000
?DATA <NAME> 03650000
03651000
MUST CONTAIN THE LITERAL STRING "?DATA" FOLLOWED BY A <NAME>, 03652000
WHICH MUST BE DEFINED ELSEWHERE. SOME EXAMPLES OF CARDS THAT 03653000
SATISFY THIS FORM ARE: 03654000
03655000
?DATA ALPHA 03656000
?DATA XXZZYY 03657000
?DATA DATA 03658000
?DATA AB13X47 03659000
03660000
A VARIABLE ITEM MAY BE DEFINED BY USING A "BNF EQUATION" TO 03661000
DEFINE IT IN TERMS OF OTHER ITEMS. A DEFINITION IS OF THE FORM: 03662000
03663000
<NAME> ::= <DEFINITION> 03664000
03665000
FOR EXAMPLE, A FUNCTION CALL MAY BE DEFINED BY: 03666000
03667000
<FCT CALL> ::= <FCT NAME>( <PARAMS> ) 03668000
03669000
WHERE <FCT NAME> AND <PARAMS> ARE DEFINED BY OTHER EQUATIONS. 03670000
IF THERE ARE SEVERAL ALTERNATE DEFINITIONS OF AN OBJECT, SEVERAL 03671000
EQUATIONS ARE GIVEN. IF A VARIABLE HAS SEVERAL DEFINITIONS, THEN 03672000
THAT VARIABLE HAS ALTERNATE DEFINITIONS, ANY OF WHICH CAN 03673000
APPLY IN A GIVEN INSTANCE. THIS WAY, RECURSIVE DEFINITIONS ARE 03674000
SIMPLE (AND QUITE COMMON). FOR EXAMPLE: 03675000
03676000
<PARAMS> ::= <EXPRESSION> 03677000
<PARAMS> ::= <PARAMS> , <EXPRESSION> 03678000
03679000
THIS MEANS THAT <PARAMS> CAN BE A SINGLE EXPRESSION, OR IT CAN 03680000
BE ANY NUMBER OF EXPRESSIONS SEPARATED BY COMMAS. WHEN SEVERAL 03681000
CONSECUTIVE DEFINITIONS ARE GIVEN FOR THE SAME VARIABLE, IT IS 03682000
RATHER CUSTOMARY (TO MAKE READING EASIER) TO OMIT THE LEFT-HAND 03683000
SIDE OF THE EQUATION IN ALL BUT THE FIRST, SO THE ABOVE DEFINITION 03684000
COULD HAVE BEEN: 03685000
03686000
<PARAMS> ::= <EXPRESSION> 03687000
::= <PARAMS> , <EXPRESSION> 03688000
03689000
FOR LOTS OF EXAMPLES OF BNF DEFINITIONS, SEE THE PREVIOUS APPENDIX. 03690000
NOTE THAT A FEW ITEMS ARENT DEFINED--IN PARTICULAR, <BLANKS> AND 03691000
<EMPTY> ARE CONSIDERED TOO OBVIOUS TO BOTHER DEFINING. IT IS 03692000
RATHER COMMON FOR SOME TERMS TO BE DEFINED BY ENGLISH-LANGUAGE 03693000
DEFINITIONS, WHEN BNF IS UNSUITED FOR THE JOB. THIS IS DONE FOR 03694000
A FEW SYMBOLS IN THE SNOBOL3 DEFINITIONS--SEE THE APPROPRIATE 03695000
SECTION OF THE MANUAL FOR THEIR DEFINITIONS. 03696000
03697000
03698000
03699000
%APPENDIX C 03700000
%PAGE 1 03701000
APPENDIX C. B5500 CHARACTER SET. 03702000
03703000
CHAR OCT DEC PUNCH COMMENTS 03704000
0 0 0 0 03705000
1 1 1 1 03706000
2 2 2 2 03707000
3 3 3 3 03708000
4 4 4 4 03709000
5 5 5 5 03710000
6 6 6 6 03711000
7 7 7 7 03712000
8 10 8 8 03713000
9 11 9 9 03714000
# 12 10 3-8 03715000
@ 13 11 4-8 03716000
? 14 12 2-8 OR ANY ILLEGAL PUNCH 03717000
: 15 13 5-8 03718000
> 16 14 6-8 03719000
} 17 15 7-8 TELETYPE: DISCONNECT 03720000
+ 20 16 12-2-8 03721000
A 21 17 12-1 03722000
B 22 18 12-2 03723000
C 23 19 12-3 03724000
D 24 20 12-4 03725000
E 25 21 12-5 03726000
F 26 22 12-6 03727000
G 27 23 12-7 03728000
H 30 24 12-8 03729000
I 31 25 12-9 03730000
. 32 26 12-3-8 03731000
[ 33 28 12-4-8 03732000
& 34 29 12 03733000
( 35 30 12-5-8 03734000
< 36 30 12-6-8 03735000
~ 37 31 12-7-8 TELETYPE: END-OF-MESSAGE 03736000
| 40 32 11-2-8 TELETYPE: BACKWARD SLASH 03737000
J 41 33 11-1 03738000
K 42 34 11-2 03739000
L 43 35 11-3 03740000
M 44 36 11-4 03741000
N 45 37 11-5 03742000
O 46 38 11-6 03743000
P 47 39 11-7 03744000
Q 50 40 11-8 03745000
R 51 41 11-9 03746000
$ 52 42 11-3-8 03747000
* 53 43 11-4-8 03748000
- 54 44 11 03749000
) 55 45 11-5-8 03750000
; 56 46 11-6-8 03751000
{ 57 47 11-7-8 TELETYPE: APOSTROPHE, CARRIAGE RETURN 03752000
BLANK 60 48 NONE 03753000
/ 61 49 0-1 03754000
S 62 50 0-2 03755000
T 63 51 0-3 03756000
U 64 52 0-4 03757000
V 65 53 0-5 03758000
W 66 54 0-6 03759000
X 67 55 0-7 03760000
Y 70 56 0-8 03761000
Z 71 57 0-9 03762000
, 72 58 0-3-8 03763000
% 73 59 0-4-8 03764000
! 74 60 0-2-8 TELETYPE: UP-ARROW, LINE FEED 03765000
= 75 61 0-5-8 03766000
] 76 62 0-6-8 03767000
" 77 63 0-7-8 03768000
03769000
%APPENDIX D 03770000
%PAGE 1 03771000
APPENDIX D. RUNNING JOBS FROM A TELETYPE. 03772000
03773000
THIS APPENDIX IS INTENDED TO DESCRIBE THE SOMEWHAT INTRICATE 03774000
METHODS OF RUNNING A PROGRAM (IN PARTICULAR, A SNOBOL PROGRAM) FROM 03775000
A TELETYPE, AND HOPEFULLY TO SOMEWHAT AMELIORATE THE INITIAL SHOCK 03776000
OF TRYING TO USE THIS RATHER PRIMITIVE AND FRUSTRATING INTERACTIVE 03777000
I/O DEVICE. THIS DESCRIPTION IS FAR FROM COMPLETE, AND DUE TO THE 03778000
CONSTANT REVISION (AND OCCASIONALLY IMPROVEMENT) OF THE MCP, DETAILS 03779000
CAN BE EXPECTED TO CHANGE AT ANY TIME, USUALLY WITHOUT WARNING. THE 03780000
NOVICE IS WARNED THAT THE MCP WAS DESIGNED FOR THE USE OF PEOPLE WHO 03781000
ARE VERY FAMILIAR WITH IT, AND DOES VERY LITTLE TO HELP THOSE WHO DONT 03782000
KNOW HOW IT BEHAVES. 03783000
THE FIRST THING NECESSARY IS TO "LOG IN", THAT IS, TO TELL THE MCP 03784000
WHO YOU ARE. THIS IS DONE BY TYPING: 03785000
03786000
?LI <I.D.>~ 03787000
03788000
AT THE UNIVERSITY OF WISCONSIN, <I.D.> IS THE USER AND PROJECT 03789000
NUMBERS, IN THE FORM: 03790000
03791000
<I.D.> = <USER#> / <PROJ#> 03792000
03793000
THE MCP WILL RESPOND TO THE LOG-IN MESSAGE WITH SOME SORT OF ACKNOWLED- 03794000
GEMENT, AND THE USER CAN THEN INDICATE WHAT PROGRAM HE WANTS TO RUN 03795000
BY TYPING A ??EXECUTE CONTROL CARD. THIS MESSAGE CONTAINS THE SAME 03796000
INFORMATION AS THE MCP CONTROL CARDS DESCRIBED IN SECTION 2.1, WITH 03797000
THE FOLLOWING CHANGES: 03798000
03799000
1) ALL CONTROL CARDS MUST BE SENT TOGETHER AS ONE MESSAGE. THIS 03800000
MESSAGE CAN BE LONGER THAN ONE LINE, SINCE THE RETURN AND LINE-FEED 03801000
KEYS ON THE TELETYPE DO NOT TRANSMIT ANYTHING. 03802000
2) THE FIRST CONTROL CARD IS THE EXECUTE CARD, WHICH IS PRECEDED 03803000
BY TWO "?"-S. ALL OTHER CONTROL CARDS ARE PRECEDED BY ";" 03804000
RATHER THAN "?". THE USER CARD IS NOT USED, SINCE THAT INFORMA- 03805000
TION WAS GIVEN IN THE LOG-IN MESSAGE. 03806000
3) THE FILE PROGRAM NEED NOT BE ASSIGNED, SINCE THE TELETYPE IS THE 03807000
INPUT DEVICE FOR THE COMPILER. 03808000
03809000
%CP 9 03810000
SOME EXAMPLES OF EXECUTE MESSAGES ARE: 03811000
03812000
??EXECUTE SNOBOL/SNOBOL~ 03813000
03814000
??EXECUTE SNOBOL/SNOBOL;PROCESS=5;IO=10; 03815000
FILE CARD=BLEEK/GRUNK SERIAL~ 03816000
03817000
??EXECUTE SNOBOL/SNOBOL;CORE=19000;PROCESS=20;IO=30~ 03818000
03819000
03820000
%CP 21 03821000
WHEN THE EXECUTE MESSAGE IS TYPED, THE MCP WILL RESPOND IN ONE OF 03822000
TWO WAYS. IF THERE IS ROOM FOR THE PROGRAM, THE RESPONSE WILL BE: 03823000
03824000
I:SNOBOL/SNOBOL=J BOJ <TIME> 03825000
03826000
IF THERE IS NOT ENOUGH ROOM, WHICH IS MUCH MORE LIKELY, THE RESPONSE 03827000
WILL BE OF THE FORM: 03828000
03829000
I:SNOBOL/SNOBOL=J SCHEDULED <TIME> 03830000
03831000
THE USER MUST THEN FIND SOMETHING ELSE TO OCCUPY HIS TIME UNTIL SPACE 03832000
BECOMES AVAILABLE AND THE "BOJ" MESSAGE IS TYPED BY THE MCP. USERS ARE 03833000
ADVISED TO BRING SOMETHING TO READ WHEN ATTEMPTING TO RUN DURING 03834000
BUSY PARTS OF THE DAY. 03835000
WHEN THE BOJ MESSAGE APPEARS, THE COMPILER IS RUNNING AND WAITING 03836000
FOR INPUT. THE USER CAN THEORETICALLY TYPE ANYTHING THAT IS VALID 03837000
PROGRAM MATERIAL EXCEPT FOR CONTINUATION CARDS. IN PRACTICE, USERS 03838000
ARE ADVISED TO FIRST GET THEIR PROGRAM IN A DISK FILE (THERE ARE 03839000
SEVERAL EDITING PROGRAMS AROUND, AS WELL AS A PROGRAM TO COPY CARD 03840000
DECKS TO DISK FILES), AND NOT ATTEMPT TO TYPE THE PROGRAM ITSELF 03841000
DIRECTLY TO THE COMPILER. 03842000
03843000
%CP 21 03844000
WHEN A PROGRAM "CARD" IS TYPED, THE COMPILER WILL COMPILE IT AND 03845000
THEN RESPOND WITH A RETURN/LINE FEED, AND THE USER CAN THEN TYPE 03846000
THE NEXT LINE. ONE EXCEPTION TO THIS IS THAT WHEN A -COMPILE CONTROL 03847000
CARD IS TYPED, THE COMPILER TYPES OUT A NUMBER EVERY TENTH INSTRUCTION 03848000
AS IT COMPILES, AND AT THE END TYPES A MESSAGE SAYING IT IS DONE. THIS 03849000
WAY THE USER CAN TELL HOW FAST THE COMPILER IS RUNNING, AND IF IT IS 03850000
VERY SLOW, HE CAN DO SOMETHING ELSE (LIKE GET A CUP OF COFFEE) WHILE 03851000
HE WAITS FOR IT TO FINISH. 03852000
USUALLY, THE USER WILL TYPE IN A SERIES OF SNOBOL CONTROL CARDS 03853000
THAT WILL CAUSE THE PROGRAM TO BE LOADED OR COMPILED FROM ONE OR 03854000
MORE DISK FILES, AND THEN INITIATE EXECUTION BY TYPING AN END CARD. 03855000
AS SOON AS THE END CARD IS TYPED, THE COMPILER TRANSFERS TO THE 03856000
INTERPRETER, AND THE PROGRAM IS RUNNING. SEE SECTION 10.4 FOR METHODS 03857000
OF DOING I/O WITH A TELETYPE. 03858000
IF A MISTAKE IS MADE AND DISCOVERED BEFORE IT IS TRANSMITTED TO 03859000
THE COMPILER, THE WHOLE THING CAN BE ERASED AND RETYPED BY TYPING 03860000
"#~". THE COMPILER WILL RESPOND WITH "TRY AGAIN", AND THE CARD 03861000
CAN THEN BE TYPED OVER. THIS USUALLY WORKS BETTER THAN TRYING TO 03862000
USE THE TELETYPES RATHER AWKWARD (AND NOT ALWAYS SUCCESSFUL) METHODS 03863000
FOR ERASING MISTAKES. 03864000
03865000
%CP 25 03866000
SOME EXAMPLES OF INPUTS TO THE COMPILER ARE: 03867000
03868000
03869000
03870000
-LIST~ 03871000
-LOAD MRG/GROUP~ 03872000
-COMPILE SLIB/DIFF~ 03873000
-LIMIT RULES TO 5000~ 03874000
END INIT~ 03875000
03876000
03877000
03878000
-LIST~ 03879000
-SIZE 370~ 03880000
-COMPILE MARK/SINT~ 03881000
-LIST 5~ 03882000
-COMPILE MARK/INT1~ 03883000
-COMPILE MARK/DIF3~ 03884000
-DEBUG~ 03885000
END~ 03886000
03887000
03888000
03889000
-LIST 2~ 03890000
-COMPILE GEO/TRAJ3~ 03891000
-LIBRARY GEO/TRJ3~ 03892000
END GO~ 03893000
03894000
03895000
03896000
-LIST 1~ 03897000
-COMPILE ML/TRY~ 03898000
-DEBUG~ 03899000
INIT TRACES("N","J","AL1","PN")~ 03900000
TRACEF("HINT","REF") :(BEGIN)~ 03901000
END INIT~ 03902000
03903000
03904000
03905000
03906000
%SECTION "INDEX." 03907000
%PAGE 1 03908000
INDEX. 03909000
03910000
THIS IS RATHER INCOMPLETE; USERS ARE CORDIALLY INVITED TO SUBMIT 03911000
THEIR SUGGESTIONS AS TO WHAT SHOULD BE ADDED. 03912000
03913000
03914000
ARITHMETIC...5.4 03915000
BACK REFERENCING...6.3 03916000
CONTROL CARDS...2 03917000
MCP...2.1 03918000
FROM TELETYPE...APP.D 03919000
SNOBOL...2.2 03920000
DEBUGGING AIDS...11 03921000
INTERACTIVE...11.2 03922000
TRACING...11.1 03923000
ENTRY POINTS 03924000
FUNCTIONS...2.2(-DEFINE),9(DEFINE),3.2.1 03925000
PROGRAM...3.2,3.0 03926000
FAILURE...8 03927000
OF PATTERNS...6.6 03928000
OF RULES...4 03929000
OF I/O...10,10.5,10.4.1 03930000
OF FUNCTIONS 03931000
INTRINSICS...9 03932000
DEFINED...3.2 03933000
FUNCTIONS 03934000
ARITHMETIC...5.4.3,9 03935000
CALLS ON...5.3 03936000
DEFINED...3.2,5.3 03937000
INTRINSIC...9 03938000
ANCHOR()...6.4,9 03939000
DEFINE()...9,2.2(-DEFINE),3.2,3.2.4 03940000
TRACING...11.1 03941000
INDIRECTION...5.1.3 03942000
IN GO-TO PART...7.4 03943000
INPUT...SEE "I/O" 03944000
I/O...10 03945000
FAILURE...10.4.1,8.1 03946000
FILES...10.1,10.2,10.3 03947000
TELETYPES...10.4 03948000
LABELS...7,3.0,3.1 (SEE ALSO "ENTRY POINTS") 03949000
IN GO-TO PARTS...7.2 03950000
COMPUTED...7.4 03951000
RESERVED...7.3 03952000
OUTPUT...SEE "I/O" 03953000
PATTERNS...6 03954000
ANCHORED...6.4 03955000
FAILURE...8.1,4.3,4.5,6.6 03956000
I/O WITHIN...10.5 03957000
MATCHING...4.3,4.5 03958000
STRING VARIABLES...6.2,6.5 03959000
ARBITRARY...6.2.1,6.6 03960000
ASSIGNMENT TO...6.5,6.6 03961000
BALANCED...6.2.2,6.6 03962000
FIXED-LENGTH...6.2.3 03963000
NAMES OF...6.2 03964000
OUTPUT ASSOCIATED WITH...6.5,10.5 03965000
03966000
03967000
03968000