mirror of
https://github.com/retro-software/B5500-software.git
synced 2026-03-02 17:44:40 +00:00
1. Commit library tape images, directories, and extracted text files. 2. Commit additional utilities under Unisys-Emode-Tools.
3969 lines
314 KiB
Plaintext
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
|