Annotation of 43BSDReno/share/doc/ps1/04.pascal/pumanA.n, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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