BSD 4_4_Lite2 release
[unix-history] / usr / src / usr.bin / pascal / USD.doc / pumanA.n
CommitLineData
ad787160
C
1.\" Copyright (c) 1980, 1993
2.\" The Regents of the University of California. All rights reserved.
38b87663 3.\"
ad787160
C
4.\" Redistribution and use in source and binary forms, with or without
5.\" modification, are permitted provided that the following conditions
6.\" are met:
7.\" 1. Redistributions of source code must retain the above copyright
8.\" notice, this list of conditions and the following disclaimer.
9.\" 2. Redistributions in binary form must reproduce the above copyright
10.\" notice, this list of conditions and the following disclaimer in the
11.\" documentation and/or other materials provided with the distribution.
12.\" 3. All advertising materials mentioning features or use of this software
13.\" must display the following acknowledgement:
14.\" This product includes software developed by the University of
15.\" California, Berkeley and its contributors.
16.\" 4. Neither the name of the University nor the names of its contributors
17.\" may be used to endorse or promote products derived from this software
18.\" without specific prior written permission.
3edcb7c8 19.\"
ad787160
C
20.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30.\" SUCH DAMAGE.
31.\"
fd88f5c5 32.\" @(#)pumanA.n 8.2 (Berkeley) 6/1/94
38b87663 33.\"
38b87663
KM
34.if !\n(xx \{\
35.so tmac.p \}
36.ND
37.nr H1 0
38.af H1 A
39.NH
40Appendix to Wirth's Pascal Report
41.PP
42This section is an appendix to
43the definition of the Pascal language in Niklaus Wirth's
44.I "Pascal Report"
45and, with that Report, precisely defines the
46Berkeley
47implementation.
48This appendix includes a summary of extensions to the language,
49gives the ways in which the undefined specifications were resolved,
50gives limitations and restrictions of the current implementation,
51and lists the added functions and procedures available.
52It concludes with a list of differences with the commonly available
53Pascal 6000\-3.4 implementation,
54and some comments on standard and portable Pascal.
55.NH 2
56Extensions to the language Pascal
57.PP
58This section defines non-standard language constructs available in
59.UP .
60The
61.B s
62standard Pascal option of the translators
63.PI
64and
65.PC
66can be used to detect these extensions in programs which are to be transported.
67.SH
68String padding
69.PP
70.UP
71will pad constant strings with blanks in expressions and as
72value parameters to make them as long as is required.
73The following is a legal
74.UP
75program:
76.LS
77\*bprogram\fP x(output);
78\*bvar\fP z : \*bpacked\fP \*barray\fP [ 1 .. 13 ] \*bof\fP char;
79\*bbegin\fP
80 z := 'red';
81 writeln(z)
82\*bend\fP;
83.LE
84The padded blanks are added on the right.
85Thus the assignment above is equivalent to:
86.LS
87z := 'red '
88.LE
89which is standard Pascal.
90.SH
91Octal constants, octal and hexadecimal write
92.PP
93Octal constants may be given as a sequence of octal digits followed
94by the character `b' or `B'.
95The forms
96.LS
97write(a:n \*boct\fP)
98.LE
99and
100.LS
101write(a:n \*bhex\fP)
102.LE
103cause the internal representation of
104expression
105.I a,
106which must be Boolean, character, integer, pointer, or a user-defined enumerated
107type,
108to be written in octal or hexadecimal respectively.
109.SH
110Assert statement
111.PP
112An
113.B assert
114statement causes a
115.I Boolean
116expression to be evaluated
117each time the statement is executed.
118A runtime error results if any of the expressions evaluates to be
119.I false .
120The
121.B assert
122statement is treated as a comment if run-time tests are disabled.
123The syntax for
124.B assert
125is:
126.LS
127\*bassert\fP <expr>
128.LE
129.SH
130Enumerated type input-output
131.PP
132Enumerated types may be read and written.
133On output the string name associated with the enumerated
134value is output.
135If the value is out of range,
136a runtime error occurs.
137On input an identifier is read and looked up
138in a table of names associated with the
139type of the variable, and
140the appropriate internal value is assigned to the variable being
141read.
142If the name is not found in the table
143a runtime error occurs.
144.SH
145Structure returning functions
146.PP
147An extension has been added which allows functions
148to return arbitrary sized structures rather than just
149scalars as in the standard.
150.SH
151Separate compilation
152.PP
153The compiler
154.PC
155has been extended to allow separate compilation of programs.
156Procedures and functions declared at the global level
157may be compiled separately.
158Type checking of calls to separately compiled routines is performed
159at load time to insure that the program as a whole
160is consistent.
161See section 5.10 for details.
162.NH 2
163Resolution of the undefined specifications
164.SH
165File name \- file variable associations
166.PP
167Each Pascal file variable is associated with a named
168.UX
169file.
170Except for
171.I input
172and
173.I output,
174which are
175exceptions to some of the rules, a name can become associated
176with a file in any of three ways:
177.IP "\ \ \ \ \ 1)" 10
178If a global Pascal file variable appears in the
179.B program
180statement
181then it is associated with
182.UX
183file of the same name.
184.IP "\ \ \ \ \ 2)"
185If a file was reset or rewritten using the
186extended two-argument form of
187.I reset
188or
189.I rewrite
190then the given name
191is associated.
192.IP "\ \ \ \ \ 3)"
193If a file which has never had
194.UX
195name associated
196is reset or rewritten without specifying a name
197via the second argument, then a temporary name
198of the form `tmp.x'
199is associated with the file.
200Temporary names start with
201`tmp.1' and continue by incrementing the last character in the
202.SM
203USASCII
204.NL
205ordering.
206Temporary files are removed automatically
207when their scope is exited.
208.SH
209The program statement
210.PP
211The syntax of the
212.B program
213statement is:
214.LS
215\*bprogram\fP <id> ( <file id> { , <file id > } ) ;
216.LE
217The file identifiers (other than
218.I input
219and
220.I output )
221must be declared as variables of
222.B file
223type in the global declaration part.
224.SH
225The files input and output
226.PP
227The formal parameters
228.I input
229and
230.I output
231are associated with the
232.UX
233standard input and output and have a
234somewhat special status.
235The following rules must be noted:
236.IP "\ \ \ \ \ 1)" 10
237The program heading
238.B must
239contains the formal parameter
240.I output.
241If
242.I input
243is used, explicitly or implicitly, then it must
244also be declared here.
245.IP "\ \ \ \ \ 2)"
246Unlike all other files, the
247Pascal files
248.I input
249and
250.I output
251must not be defined in a declaration,
252as their declaration is automatically:
253.LS
254\*bvar\fP input, output: text
255.LE
256.IP "\ \ \ \ \ 3)"
257The procedure
258.I reset
259may be used on
260.I input.
261If no
262.UX
263file name has ever been associated with
264.I input,
265and no file name is given, then an attempt will be made
266to `rewind'
267.I input.
268If this fails, a run time
269error will occur.
270.I Rewrite
271calls to output act as for any other file, except that
272.I output
273initially has no associated file.
274This means that a simple
275.LS
276rewrite(output)
277.LE
278associates a temporary name with
279.I output.
280.SH
281Details for files
282.PP
283If a file other than
284.I input
285is to be read,
286then reading must be initiated by a call to the
287procedure
288.I reset
289which causes the Pascal system to attempt to open the
290associated
291.UX
292file for reading.
293If this fails, then a runtime error occurs.
294Writing of a file other than
295.I output
296must be initiated by a
297.I rewrite
298call,
299which causes the Pascal system to create the associated
300.UX
301file and
302to then open the file for writing only.
303.SH
304Buffering
305.PP
306The buffering for
307.I output
308is determined by the value of the
309.B b
310option
311at the end of the
312.B program
313statement.
314If it has its default value 1,
315then
316.I output
317is
318buffered in blocks of up to 512 characters,
319flushed whenever a writeln occurs
320and at each reference to the file
321.I input.
322If it has the value 0,
323.I output
324is unbuffered.
325Any value of
3262 or more gives block buffering without line or
327.I input
328reference flushing.
329All other output files are always buffered in blocks of 512 characters.
330All output buffers are flushed when the files are closed at scope exit,
331whenever the procedure
332.I message
333is called, and can be flushed using the
334built-in procedure
335.I flush.
336.PP
337An important point for an interactive implementation is the definition
338of `input\(ua'.
339If
340.I input
341is a teletype, and the Pascal system reads a character at the beginning
342of execution to define `input\(ua', then no prompt could be printed
343by the program before the user is required to type some input.
344For this reason, `input\(ua' is not defined by the system until its definition
345is needed, reading from a file occurring only when necessary.
346.SH
347The character set
348.PP
349Seven bit
350.SM USASCII
351is the character set used on
352.UX .
353The standard Pascal
354symbols `and', 'or', 'not', '<=', '>=', '<>',
355and the uparrow `\(ua' (for pointer qualification)
356are recognized.\*(dg
357.FS
358\*(dgOn many terminals and printers, the up arrow is represented
359as a circumflex `^'.
360These are not distinct characters, but rather different graphic
361representations of the same internal codes.
362.FE
363Less portable are the
364synonyms tilde `~'
365for
366.B not ,
367`&' for
368.B and ,
369and `|' for
370.B or .
371.PP
372Upper and lower case are considered to be distinct.\*(st
373.FS
374\*(stThe proposed standard for Pascal considers them to be the same.
375.FE
376Keywords and built-in
377.B procedure
378and
379.B function
380names are
381composed of all lower case letters.
382Thus the identifiers GOTO and GOto are distinct both from each other and
383from the keyword
384\*bgoto\fP.
385The standard type `boolean' is also available as `Boolean'.
386.PP
387Character strings and constants may be delimited by the character
388`\''
389or by the character `#';
390the latter is sometimes convenient when programs are to be transported.
391Note that the `#' character has special meaning
392.up
393when it is the first character on a line \- see
394.I "Multi-file programs"
395below.
396.SH
397The standard types
398.PP
399The standard type
400.I integer
401is conceptually defined as
402.LS
403\*btype\fP integer = minint .. maxint;
404.LE
405.I Integer
406is implemented with 32 bit twos complement arithmetic.
407Predefined constants of type
408.I integer
409are:
410.LS
411\*bconst\fP maxint = 2147483647; minint = -2147483648;
412.LE
413.PP
414The standard type
415.I char
416is conceptually defined as
417.LS
418\*btype\fP char = minchar .. maxchar;
419.LE
420Built-in character constants are `minchar' and `maxchar', `bell' and `tab';
421ord(minchar) = 0, ord(maxchar) = 127.
422.PP
423The type
424.I real
425is implemented using 64 bit floating point arithmetic.
426The floating point arithmetic is done in `rounded' mode, and
427provides approximately 17 digits of precision
428with numbers as small as 10 to the negative 38th power and as large as
42910 to the 38th power.
430.SH
431Comments
432.PP
433Comments can be delimited by either `{' and `}' or by `(*' and `*)'.
434If the character `{' appears in a comment delimited by `{' and `}',
435a warning diagnostic is printed.
436A similar warning will be printed if the sequence `(*' appears in
437a comment delimited by `(*' and `*)'.
438The restriction implied by this warning is not part of standard Pascal,
439but detects many otherwise subtle errors.
440.SH
441Option control
442.PP
443Options of the translators may be controlled
444in two distinct ways.
445A number of options may appear on the command line invoking the translator.
446These options are given as one or more strings of letters preceded by the
447character `\-' and cause the default setting of
448each given option to be changed.
449This method of communication of options is expected to predominate
450for
451.UX .
452Thus the command
453.LS
454% \*bpi \-l \-s foo.p\fR
455.LE
456translates the file foo.p with the listing option enabled (as it normally
457is off), and with only standard Pascal features available.
458.PP
459If more control over the portions of the program where options are enabled is
460required, then option control in comments can and should be used.
461The
462format for option control in comments is identical to that used in Pascal
4636000\-3.4.
464One places the character `$' as the first character of the comment
465and follows it by a comma separated list of directives.
466Thus an equivalent to the command line example given above would be:
467.LS
468{$l+,s+ listing on, standard Pascal}
469.LE
470as the first line of the program.
471The `l'
472option is more appropriately specified on the command line,
473since it is extremely unlikely in an interactive environment
474that one wants a listing of the program each time it is translated.
475.PP
476Directives consist of a letter designating the option,
477followed either by a `+' to turn the option on, or by a `\-' to turn the
478option off.
479The
480.B b
481option takes a single digit instead of
482a `+' or `\-'.
483.SH
484Notes on the listings
485.PP
486The first page of a listing
487includes a banner line indicating the version and date of generation of
488.PI
489or
490.PC .
491It also
492includes the
493.UX
494path name supplied for the source file and the date of
495last modification of that file.
496.PP
497Within the body of the listing, lines are numbered consecutively and
498correspond to the line numbers for the editor.
499Currently, two special
500kinds of lines may be used to format the listing:
501a line consisting of a form-feed
502character, control-l, which causes a page
503eject in the listing, and a line with
504no characters which causes the line number to be suppressed in the listing,
505creating a truly blank line.
506These lines thus correspond to `eject' and `space' macros found in many
507assemblers.
508Non-printing characters are printed as the character `?' in the listing.\*(dg
509.FS
510\*(dgThe character generated by a control-i indents
511to the next `tab stop'.
512Tab stops are set every 8 columns in
513.UX .
514Tabs thus provide a quick way of indenting in the program.
515.FE
516.SH
517The standard procedure write
518.PP
519If no minimum field length parameter is specified
520for a
521.I write,
522the following default
523values are assumed:
524.KS
525.TS
526center;
527l n.
528integer 10
529real 22
530Boolean length of `true' or `false'
531char 1
532string length of the string
533oct 11
534hex 8
535.TE
536.KE
537The end of each line in a text file should be explicitly
538indicated by `writeln(f)', where `writeln(output)' may be written
539simply as `writeln'.
540For
541.UX ,
542the built-in function `page(f)' puts a single
543.SM ASCII
544form-feed character on the output file.
545For programs which are to be transported the filter
546.I pcc
547can be used to interpret carriage control, as
548.UX
549does not normally do so.
550.NH 2
551Restrictions and limitations
552.SH
553Files
554.PP
555Files cannot be members of files or members of dynamically
556allocated structures.
557.SH
558Arrays, sets and strings
559.PP
560The calculations involving array subscripts and set elements
561are done with 16 bit arithmetic.
562This
563restricts the types over which arrays and sets may be defined.
564The lower bound of such a range must be greater than or equal to
565\-32768, and the upper bound less than 32768.
566In particular, strings may have any length from 1 to 65535 characters,
567and sets may contain no more than 65535 elements.
568.SH
569Line and symbol length
570.PP
571There is no intrinsic limit on the length of identifiers.
572Identifiers
573are considered to be distinct if they differ
574in any single position over their entire length.
575There is a limit, however, on the maximum input
576line length.
577This limit is quite generous however, currently exceeding 160
578characters.
579.SH
580Procedure and function nesting and program size
581.PP
582At most 20 levels of
583.B procedure
584and
585.B function
586nesting are allowed.
587There is no fundamental, translator defined limit on the size of the
588program which can be translated.
589The ultimate limit is supplied by the
590hardware and thus, on the \s-2PDP\s0-11,
591by the 16 bit address space.
592If
593one runs up against the `ran out of memory' diagnostic the program may yet
594translate if smaller procedures are used, as a lot of space is freed
595by the translator at the completion of each
596.B procedure
597or
598.B function
599in the current
600implementation.
601.PP
602On the \s-2VAX\s0-11, there is an implementation defined limit
603of 65536 bytes per variable.
604There is no limit on the number of variables.
605.SH
606Overflow
607.PP
608There is currently no checking for overflow on arithmetic operations at
609run-time on the \s-2PDP\s0-11.
610Overflow checking is performed on the \s-2VAX\s0-11 by the hardware.
611.br
612.ne 15
613.NH 2
614Added types, operators, procedures and functions
615.SH
616Additional predefined types
617.PP
618The type
619.I alfa
620is predefined as:
621.LS
622\*btype\fP alfa = \*bpacked\fP \*barray\fP [ 1..10 ] \*bof\fP \*bchar\fP
623.LE
624.PP
625The type
626.I intset
627is predefined as:
628.LS
629\*btype\fP intset = \*bset of\fP 0..127
630.LE
631In most cases the context of an expression involving a constant
632set allows the translator to determine the type of the set, even though the
633constant set itself may not uniquely determine this type.
634In the
635cases where it is not possible to determine the type of the set from
636local context, the expression type defaults to a set over the entire base
637type unless the base type is integer\*(dg.
638.FS
639\*(dgThe current translator makes a special case of the construct
640`if ... in [ ... ]' and enforces only the more lax restriction
641on 16 bit arithmetic given above in this case.
642.FE
643In the latter case the type defaults to the current
644binding of
645.I intset,
646which must be ``type set of (a subrange of) integer'' at that point.
647.PP
648Note that if
649.I intset
650is redefined via:
651.LS
652\*btype\fP intset = \*bset of\fP 0..58;
653.LE
654then the default integer set is the implicit
655.I intset
656of
657Pascal 6000\-3.4
658.SH
659Additional predefined operators
660.PP
661The relationals `<' and `>' of proper set
662inclusion are available.
663With
664.I a
665and
666.I b
667sets, note that
668.LS
669(\*bnot\fR (\fIa\fR < \fIb\fR)) <> (\fIa\fR >= \fIb\fR)
670.LE
671As an example consider the sets
672.I a
673= [0,2]
674and
675.I b
676= [1].
677The only relation true between these sets is `<>'.
678.SH
679Non-standard procedures
680.IP argv(i,a) 25
681where
682.I i
683is an integer and
684.I a
685is a string variable
686assigns the (possibly truncated or blank padded)
687.I i \|'th
688argument
689of the invocation of the current
690.UX
691process to the variable
692.I a .
693The range of valid
694.I i
695is
696.I 0
697to
698.I argc\-1 .
699.IP date(a)
700assigns the current date to the alfa variable
701.I a
702in the format `dd mmm yy ', where `mmm' is the first
703three characters of the month, i.e. `Apr'.
704.IP flush(f)
705writes the output buffered for Pascal file
706.I f
707into the associated
708.UX
709file.
710.IP halt
711terminates the execution of the program with
712a control flow backtrace.
713.IP linelimit(f,x)\*(dd
714.FS
715\*(ddCurrently ignored by pdp-11
716.X .
717.FE
718with
719.I f
720a textfile and
721.I x
722an integer expression
723causes
724the program to be abnormally terminated if more than
725.I x
726lines are
727written on file
728.I f .
729If
730.I x
731is less than 0 then no limit is imposed.
732.IP message(x,...)
733causes the parameters, which have the format of those
734to the
735built-in
736.B procedure
737.I write,
738to be written unbuffered on the diagnostic unit 2,
739almost always the user's terminal.
740.IP null
741a procedure of no arguments which does absolutely nothing.
742It is useful as a place holder,
743and is generated by
744.XP
745in place of the invisible empty statement.
746.IP remove(a)
747where
748.I a
749is a string causes the
750.UX
751file whose
752name is
753.I a,
754with trailing blanks eliminated, to be removed.
755.IP reset(f,a)
756where
757.I a
758is a string causes the file whose name
759is
760.I a
761(with blanks trimmed) to be associated with
762.I f
763in addition
764to the normal function of
765.I reset.
766.IP rewrite(f,a)
767is analogous to `reset' above.
768.IP stlimit(i)
769where
770.I i
771is an integer sets the statement limit to be
772.I i
773statements.
774Specifying the
775.B p
776option to
777.I pc
778disables statement limit counting.
779.IP time(a)
780causes the current time in the form `\ hh:mm:ss\ ' to be
781assigned to the alfa variable
782.I a.
783.SH
784Non-standard functions
785.IP argc 25
786returns the count of arguments when the Pascal program
787was invoked.
788.I Argc
789is always at least 1.
790.IP card(x)
791returns the cardinality of the set
792.I x,
793i.e. the
794number of elements contained in the set.
795.IP clock
796returns an integer which is the number of central processor
797milliseconds of user time used by this process.
798.IP expo(x)
799yields the integer valued exponent of the floating-point
800representation of
801.I x ;
802expo(\fIx\fP) = entier(log2(abs(\fIx\fP))).
803.IP random(x)
804where
805.I x
806is a real parameter, evaluated but otherwise
807ignored, invokes a linear congruential random number generator.
808Successive seeds are generated as (seed*a + c) mod m and
809the new random number is a normalization of the seed to the range 0.0 to 1.0;
810a is 62605, c is 113218009, and m is
811536870912.
812The initial seed
813is 7774755.
814.IP seed(i)
815where
816.I i
817is an integer sets the random number generator seed
818to
819.I i
820and returns the previous seed.
821Thus seed(seed(i))
822has no effect except to yield value
823.I i.
824.IP sysclock
825an integer function of no arguments returns the number of central processor
826milliseconds of system time used by this process.
827.IP undefined(x)
828a Boolean function.
829Its argument is a real number and
830it always returns false.
831.IP wallclock
832an integer function of no arguments returns the time
833in seconds since 00:00:00 GMT January 1, 1970.
834.NH 2
835Remarks on standard and portable Pascal
836.PP
837It is occasionally desirable to prepare Pascal programs which will be
838acceptable at other Pascal installations.
839While certain system dependencies are bound to creep in,
840judicious design and programming practice can usually eliminate
841most of the non-portable usages.
842Wirth's
843.I "Pascal Report"
844concludes with a standard for implementation and program exchange.
845.PP
846In particular, the following differences may cause trouble when attempting
847to transport programs between this implementation and Pascal 6000\-3.4.
848Using the
849.B s
850translator option may serve to indicate many problem areas.\*(dg
851.FS
852\*(dgThe
853.B s
854option does not, however, check that identifiers differ
855in the first 8 characters.
856.I Pi
857and
858.PC
859also do not check the semantics of
860.B packed .
861.FE
862.SH
863Features not available in Berkeley Pascal
864.IP
865Segmented files and associated functions and procedures.
866.IP
867The function
868.I trunc
869with two arguments.
870.IP
871Arrays whose indices exceed the capacity of 16 bit arithmetic.
872.SH
873Features available in Berkeley Pascal but not in Pascal 6000-3.4
874.IP
875The procedures
876.I reset
877and
878.I rewrite
879with file names.
880.IP
881The functions
882.I argc,
883.I seed,
884.I sysclock,
885and
886.I wallclock.
887.IP
888The procedures
889.I argv,
890.I flush,
891and
892.I remove.
893.IP
894.I Message
895with arguments other than character strings.
896.IP
897.I Write
898with keyword
899.B hex .
900.IP
901The
902.B assert
903statement.
904.IP
905Reading and writing of enumerated types.
906.IP
907Allowing functions to return structures.
908.IP
909Separate compilation of programs.
910.IP
911Comparison of records.
912.SH
913Other problem areas
914.PP
915Sets and strings are more general in \*
916.UP ;
917see the restrictions given in
918the
919Jensen-Wirth
920.I "User Manual"
921for details on the 6000\-3.4 restrictions.
922.PP
923The character set differences may cause problems,
924especially the use of the function
925.I chr,
926characters as arguments to
927.I ord,
928and comparisons of characters,
929since the character set ordering
930differs between the two machines.
931.PP
932The Pascal 6000\-3.4 compiler uses a less strict notion of type equivalence.
933In
934.UP ,
935types are considered identical only if they are represented
936by the same type identifier.
937Thus, in particular, unnamed types are unique
938to the variables/fields declared with them.
939.PP
940Pascal 6000\-3.4 doesn't recognize our option
941flags, so it is wise to
942put the control of
943.UP
944options to the end of option lists or, better
945yet, restrict the option list length to one.
946.PP
947For Pascal 6000\-3.4 the ordering of files in the program statement has
948significance.
949It is desirable to place
950.I input
951and
952.I output
953as the first two files in the
954.B program
955statement.
bfa2fca9
KM
956.sp 2
957.SH
958Acknowledgments
959.PP
960The financial support of William Joy and Susan Graham by
961the National Science Foundation under grants
962MCS74-07644-A04, MCS78-07291, and MCS80-05144,
2b2f4fc2 963and of William Joy by an
bfa2fca9
KM
964.SM IBM
965Graduate Fellowship are gratefully acknowledged.