Annotation of 43BSDTahoe/new/B/doc/Description2, revision 1.1

1.1     ! root        1: .\" Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984.
        !             2: .St 6 "EXPRESSIONS, TARGETS AND TESTS"
        !             3: .Se 3 6.1 EXPRESSIONS
        !             4: .Xx scratch-pad copy
        !             5: .Xx compound
        !             6: .Tx
        !             7: In \*B, the evaluation of an expression cannot alter the values of targets
        !             8: that currently exist, nor can it create new targets that survive the expression.
        !             9: If an expression appears to alter a target, it effectively modifies
        !            10: a local ``scratch-pad''
        !            11: \fIcopy\fP of that target, and the change is invisible outside the expression.
        !            12: .Sy  3
        !            13: .Pr expression 4
        !            14: .Al
        !            15: single-expression
        !            16: .Al
        !            17: multiple-expression
        !            18: .Pr single-expression 3
        !            19: .Al
        !            20: basic-expression
        !            21: .Al
        !            22: \*(<:(\*(:> expression \*(<:)\*(:>
        !            23: .Pr basic-expression 3
        !            24: .Al
        !            25: simple-expression
        !            26: .Al
        !            27: formula
        !            28: .Pr simple-expression 7
        !            29: .Al
        !            30: constant
        !            31: .Al
        !            32: target-content
        !            33: .Al
        !            34: trimmed-text
        !            35: .Al
        !            36: table-selection
        !            37: .Al
        !            38: display
        !            39: .Al
        !            40: refined-expression
        !            41: .Pr tight-expression 3
        !            42: .Al
        !            43: simple-expression
        !            44: .Al
        !            45: zeroadic-formula
        !            46: .Al
        !            47: \*(<:(\*(:> expression \*(<:)\*(:>
        !            48: .Pr right-expression 3
        !            49: .Al
        !            50: tight-expression
        !            51: .Al
        !            52: monadic-formula
        !            53: .Eo 6 basic-:\0\0\k2simple-:\0\k3tight-:\0\0\0\0\k4right-expressions:
        !            54: \h'|\n1u'\*(<:a\*(:> \h'|\n2u'\*(<:a\*(:> \h'|\n3u'\*(<:a\*(:> \h'|\n4u'\*(<:a\*(:>
        !            55: \h'|\n1u'\*(<:-a\*(:> \h'|\n4u'\*(<:-a\*(:>
        !            56: \h'|\n1u'\*(<:a+b\*(:>
        !            57: \h'|\n3u'\*(<:(a+b)\*(:> \h'|\n4u'\*(<:(a+b)\*(:>
        !            58: .Xe
        !            59: .Tx
        !            60: The various kinds of expressions that are distinguished here
        !            61: serve to define the syntax
        !            62: in such a way that no parentheses are needed where the meaning is
        !            63: sufficiently clear.
        !            64: .Pr multiple-expression 1
        !            65: .Al
        !            66: single-expression\*(<:,\*(:> single-expression
        !            67: .Al
        !            68: single-expression\*(<:,\*(:> multiple-expression
        !            69: .Ex 3
        !            70: \k1multiple-expressions:
        !            71: \h'|\n1u'\*(<:1, 'abc'\*(:>
        !            72: \h'|\n1u'\*(<:(1, 0), (0, 1), (-1, 0), (0, -1)\*(:>
        !            73: .Xe
        !            74: .Tx
        !            75: The value of a multiple-expression composed of single-expressions
        !            76: separated by commas
        !            77: is the compound whose fields are the values of the
        !            78: successive single-expressions.
        !            79: .Se 3  6.1.1 NUMERIC-CONSTANTS
        !            80: .Sy  3
        !            81: .Pr numeric-constant 3
        !            82: .Al
        !            83: exact-constant
        !            84: .Al
        !            85: approximate-constant
        !            86: .Pr exact-constant 3
        !            87: .Al
        !            88: integral-part\0optional-fractional-part
        !            89: .Al
        !            90: integral-part \*(<:.\*(:>
        !            91: .Al
        !            92: fractional-part
        !            93: .Pr integral-part 3
        !            94: .Al
        !            95: digit
        !            96: .Al
        !            97: integral-part\0digit
        !            98: .Pr digit 2
        !            99: .Al
        !           100: \*(<:0\*(:>
        !           101: .Al
        !           102: \*(<:1\*(:>
        !           103: .Al
        !           104: \*(<:2\*(:>
        !           105: .Al
        !           106: \*(<:3\*(:>
        !           107: .Al
        !           108: \*(<:4\*(:>
        !           109: .Al
        !           110: \*(<:5\*(:>
        !           111: .Al
        !           112: \*(<:6\*(:>
        !           113: .Al
        !           114: \*(<:7\*(:>
        !           115: .Al
        !           116: \*(<:8\*(:>
        !           117: .Al
        !           118: \*(<:9\*(:>
        !           119: .Pr fractional-part 3
        !           120: .Al
        !           121: \&\*(<:.\*(:> digit
        !           122: .Al
        !           123: fractional-part\0digit
        !           124: .Pr approximate-constant 2
        !           125: .Sl
        !           126: exact-constant\0exponent-part
        !           127: .Pr exponent-part 2
        !           128: .Sl
        !           129: \*(<:E\*(:> optional-plusminus\0integral-part
        !           130: .Pr plusminus 2
        !           131: .Al
        !           132: \*(<:+\*(:>
        !           133: .Al
        !           134: \*(<:-\*(:>
        !           135: .Eo 5 exact-constants:\0\0\0\0\0\0\k2approximate-constants:
        !           136: \h'|\n1u'\*(<:666\*(:> \h'|\n2u'\*(<:2.99793E8\*(:>
        !           137: \h'|\n1u'\*(<:666.\*(:> \h'|\n2u'\*(<:2.99793E+8\*(:>
        !           138: \h'|\n1u'\*(<:3.14\*(:> \h'|\n2u'\*(<:1E-9\*(:>
        !           139: .Xe
        !           140: .Tx
        !           141: The value of an exact-constant is an exact number.
        !           142: For example, \*(<:1.25\*(:> stands for the exact number \*(<:5/4\*(:>.
        !           143: The value of an approximate-constant is an approximate number.
        !           144: The exponent-part gives the power of ten in floating-point notation.
        !           145: For example, \*(<:1.2345E2\*(:> and \*(<:~123.45\*(:> are (approximately) the same,
        !           146: because \*(<:123.45 = 1.2345*10**2\*(:>.
        !           147: .Se 2  6.1.2 TARGET-CONTENTS
        !           148: .Sy  2
        !           149: .Pr target-content 2
        !           150: .Sl
        !           151: tag
        !           152: .Tx
        !           153: The value of a target-content is the value last put in the target whose
        !           154: name is the given tag.
        !           155: .Se 2  6.1.3 TRIMMED-TEXTS
        !           156: .Xx integer
        !           157: .Sy  2
        !           158: .Pr trimmed-text 2
        !           159: .Al
        !           160: tight-expression \*(<:@\*(:> right-expression
        !           161: .Al
        !           162: tight-expression \*(<:|\*(:> right-expression
        !           163: .Ps
        !           164: .Ex 6
        !           165: \k1trimmed-texts:
        !           166: \h'|\n1u'\*(<:t@p\*(:>
        !           167: \h'|\n1u'\*(<:t|1\*(:>
        !           168: \h'|\n1u'\*(<:t|q@p\*(:>
        !           169: \h'|\n1u'\*(<:t@p|(q-p+1)\*(:>
        !           170: .Xe
        !           171: .Tx
        !           172: The value of the tight-expression must be a text T, and that
        !           173: of the right-expression must be an integer N.
        !           174: .br
        !           175: If the sign between the expressions is \*(<:@\*(:>, then the value of
        !           176: the trimmed-text is that of T after removing the first N\(mi1 characters.
        !           177: For example, \*(<:'lamplight'@4 = 'plight'\*(:>.
        !           178: N must be at least 1 and at most one more than the length of T.
        !           179: .br
        !           180: If the sign between the expressions is \*(<:|\*(:>, then the value of
        !           181: the trimmed-text is the text consisting of the first N characters of T.
        !           182: For example, \*(<:'scarface'|5 = 'scarf'\*(:>.
        !           183: N must be at least 0 and at most equal to the length of T.
        !           184: .br
        !           185: Note that the tight-expression itself may be a trimmed-text
        !           186: again.
        !           187: For example, \*(<:'department'|6@3 = 'depart'@3 = 'part'\*(:>.
        !           188: .Se 3  6.1.4 TABLE-SELECTIONS
        !           189: .Xx key
        !           190: .Xx associate
        !           191: .Xx table entry
        !           192: .Sy  3
        !           193: .Pr table-selection 3
        !           194: .Sl
        !           195: tight-expression \*(<:[\*(:> expression \*(<:]\*(:>
        !           196: .Sx 2 table-selection:
        !           197: \*(<:t[i, j]\*(:>
        !           198: .Xe
        !           199: .Tx
        !           200: The value of the tight-expression must be a table T, and
        !           201: the value of the expression between the square brackets must
        !           202: be a key K of T.
        !           203: The value of the table-selection is then the associate of
        !           204: the table entry in T whose key is K.
        !           205: .Se 3  6.1.5 DISPLAYS
        !           206: .Xx integer
        !           207: .Xx character
        !           208: .Xx quote
        !           209: .Xx convert to a text
        !           210: .Xx ambiguity
        !           211: .Xx empty list
        !           212: .Xx empty table
        !           213: .Xx key
        !           214: .Xx associate
        !           215: .Sy  3
        !           216: .Pr display 4
        !           217: .Al
        !           218: text-display
        !           219: .Al
        !           220: list-display
        !           221: .Al
        !           222: table-display
        !           223: .Pr text-display 3
        !           224: .Al
        !           225: \&\*(<:'\*(:> optional-text-body \*(<:'\*(:>
        !           226: .Al
        !           227: \*(<:"\*(:> optional-text-body \*(<:"\*(:>
        !           228: .Ps
        !           229: The text-displays \*(<:''\*(:> and \*(<:""\*(:> stand for the empty text.
        !           230: A text-body may be any sequence of printable characters
        !           231: (see section 1 under `Texts')
        !           232: and conversions
        !           233: (see below).
        !           234: However, in a text-display in the \*(<:'\*(:>\^...\^\*(<:'\*(:> style,
        !           235: any single quote \*(<:'\*(:> in the text must be written twice to give \*(<:''\*(:>.
        !           236: Otherwise, it will signal the end of the text-display.
        !           237: Similarly, in a text-display in the \*(<:"\*(:>\^...\^\*(<:"\*(:> style,
        !           238: any double quote \*(<:"\*(:> in the text must be written twice to give \*(<:""\*(:>.
        !           239: Finally, the back-quote \*(<:`\*(:> must be written twice too, giving \*(<:``\*(:>.
        !           240: Otherwise, it signals a conversion.
        !           241: .Pr conversion 2
        !           242: .Sl
        !           243: \*(<:`\*(:> expression \*(<:`\*(:>
        !           244: .Ps
        !           245: The requirement that some signs be written twice does not hold
        !           246: \fIinside\fP a conversion.
        !           247: For example, \*(<:'`t['a']`'\*(:> is proper, whereas \*(<:'`t[''a'']`'\*(:> is not.
        !           248: .Eo 6 text-displays:
        !           249: \h'|\n1u'\*(<:''\*(:>
        !           250: \h'|\n1u'\*(<:'He said: "Don''t!"'\*(:>
        !           251: \h'|\n1u'\*(<:"He said: ""Don't!"""\*(:>
        !           252: \h'|\n1u'\*(<:'altitude is `a/1E3` km'\*(:>
        !           253: .Xe
        !           254: .Tx
        !           255: The value of a text-display is the text composed of the
        !           256: characters given between the enclosing text quotes.
        !           257: If the text-display contains conversions, the expressions of
        !           258: these conversions are evaluated first and converted to a
        !           259: text in the same way as for a write-command.
        !           260: For example,
        !           261: since
        !           262: .Di 1
        !           263: \*(<:WRITE 239*4649\*(:>
        !           264: .Ed
        !           265: causes the text \*(<:1111111\*(:> to be written,
        !           266: the text-display
        !           267: .Di 1
        !           268: \&\*(<:'239 times 4649 gives `239*4649`'\*(:>
        !           269: .Ed
        !           270: is equivalent to
        !           271: .Di 1
        !           272: \&\*(<:'239 times 4649 gives 1111111'\*(:>.
        !           273: .Ed
        !           274: The quotes and conversion-signs that had to be written twice
        !           275: according to the above rules correspond to one character of
        !           276: the resulting text.
        !           277: For example,  the number of characters in \*(<:'x''y""z'\*(:> is 6,
        !           278: because it consists of one \*(<:x\*(:>, \fIone\fP \*(<:'\*(:> character,
        !           279: one \*(<:y\*(:>, \fItwo\fP \*(<:"\*(:> characters, and finally one \*(<:z\*(:>.
        !           280: Another way to specify the same text is \*(<:"x'y""""z"\*(:>.
        !           281: .Pr list-display 2
        !           282: .Sl
        !           283: \*(<:{\*(:> optional-list-body \*(<:}\*(:>
        !           284: .Pr list-body 5
        !           285: .Al
        !           286: list-filler-series
        !           287: .Al
        !           288: single-expression \*(<:..\*(:> single-expression
        !           289: .Ps
        !           290: The ambiguity in, e.g., \*(<:{1...9}\*(:>, is resolved by parsing it
        !           291: as \*(<:{1. .. 9}\*(:>.
        !           292: .Pr list-filler-series 2
        !           293: .Al
        !           294: list-filler
        !           295: .Al
        !           296: list-filler\*(<:;\*(:> list-filler-series
        !           297: .Pr list-filler 2
        !           298: .Sl
        !           299: single-expression
        !           300: .Eo 6 list-displays:
        !           301: \h'|\n1u'\*(<:{}\*(:>
        !           302: \h'|\n1u'\*(<:{x1; x2; x3}\*(:>
        !           303: \h'|\n1u'\*(<:{1..n-1}\*(:>
        !           304: \h'|\n1u'\*(<:{'a'..'z'}\*(:>
        !           305: .Xe
        !           306: .Tx
        !           307: The value of \*(<:{}\*(:> is an empty list.
        !           308: (It may also be an empty table; see below.)
        !           309: .br
        !           310: The value of a list-display containing list-fillers is the
        !           311: list whose entries are the values of those list-fillers.
        !           312: If values occur multiply, they give rise to multiple entries
        !           313: in the list.
        !           314: .br
        !           315: For a list-display of the form \*(<:{\*(:>p\*(<:..\*(:>q\*(<:}\*(:>, p and q must both be
        !           316: integers, or both be characters (texts of length one).
        !           317: The resulting value is then the list of all integers
        !           318: or characters x such that p\ \(<= x\ \(<=\ q.
        !           319: For example, \*(<:{1..4} = {1; 2; 3; 4}\*(:> and \*(<:{'a'..'c'} = {'a'; 'b'; 'c'}\*(:>.
        !           320: .br
        !           321: If p\ >\ q, the list is empty, but this is only allowed if p
        !           322: and q are adjacent.
        !           323: If there is an intervening integer or character x (such that
        !           324: p\ >\ x\ >\ q), an error is reported.
        !           325: .Pr table-display 2
        !           326: .Sl
        !           327: \*(<:{\*(:> optional-table-filler-series \*(<:}\*(:>
        !           328: .Pr table-filler-series 2
        !           329: .Al
        !           330: table-filler
        !           331: .Al
        !           332: table-filler\*(<:;\*(:> table-filler-series
        !           333: .Pr table-filler 2
        !           334: .Sl
        !           335: \*(<:[\*(:> expression \*(<:] :\*(:> single-expression
        !           336: .Eo 6 table-displays:
        !           337: \h'|\n1u'\*(<:{}\*(:>
        !           338: \h'|\n1u'\*(<:{[i, j]: 0}\*(:>
        !           339: \h'|\n1u'\*(<:{[0]: {}; [1]: {0}}\*(:>
        !           340: \h'|\n1u'\*(<:{[name]: (month, day, year)}\*(:>
        !           341: .Xe
        !           342: .Tx
        !           343: The table-display \*(<:{}\*(:> stands for an empty table.
        !           344: Otherwise, each table-filler gives a table entry with key K
        !           345: and associate A, where K is the value of the expression
        !           346: between square brackets, and A is the value of the
        !           347: single-expression following the colon.
        !           348: The result is then the table containing these table
        !           349: entries.
        !           350: .br
        !           351: If there are \fIdifferent\fP table entries with the same
        !           352: key, an error is reported.
        !           353: Multiple occurrences of the \fIsame\fP table entry, however,
        !           354: are allowed.
        !           355: The extra occurrences are then simply discarded.
        !           356: .Se 2  6.1.6 FORMULAS
        !           357: .Xx formula
        !           358: .Xx function
        !           359: .Xx ambiguity
        !           360: .Xx parentheses
        !           361: .Xx brackets
        !           362: .Xx priority
        !           363: .Xx user-defined-function
        !           364: .Xx yield-unit
        !           365: .Xx target
        !           366: .Xx scratch-pad copy
        !           367: .Xx local
        !           368: .Xx return-command
        !           369: .Xx predefined functions
        !           370: .Xx number
        !           371: .Xx denominator
        !           372: .Xx numerator
        !           373: .Xx text
        !           374: .Xx convert to a text
        !           375: .Xx text, list and table
        !           376: .Xx key
        !           377: .Xx character
        !           378: .Xx associate
        !           379: .Xx list entry
        !           380: .Xx integer
        !           381: .Sy  2
        !           382: .Pr zeroadic-formula 2
        !           383: .Sl
        !           384: zeroadic-function
        !           385: .Pr monadic-formula 2
        !           386: .Sl
        !           387: monadic-function\0actual-operand
        !           388: .Pr dyadic-formula 2
        !           389: .Al
        !           390: actual-operand\0dyadic-function\0actual-operand
        !           391: .Ps 
        !           392: The parsing ambiguities introduced by these rules 
        !           393: are resolved by priority rules, as follows:
        !           394: .in +\w'2.\ 'u
        !           395: .ti -\w'2.\ 'u
        !           396: 1.\ If there is no parsing ambiguity (as in \*(<:1 + sin x\*(:>),
        !           397: no parentheses are needed.
        !           398: .ti -\w'2.\ 'u
        !           399: 2.\ If the order makes no difference (as in \*(<:a*b*c\*(:>, \*(<:a*b/c\*(:> or
        !           400: \*(<:a^b^c\*(:>), no parentheses are needed.
        !           401: .ti -\w'2.\ 'u
        !           402: 3.\ The five arithmetic functions
        !           403: \*(<:**\*(:>, \*(<:*\*(:>, \*(<:/\*(:>, \*(<:+\*(:> and \*(<:-\*(:>
        !           404: have their traditional priority rules:
        !           405: .in +4
        !           406: \*(<:**\*(:> comes before \*(<:*\*(:>, \*(<:/\*(:>, \*(<:+\*(:> and \*(<:-\*(:>;
        !           407: .br
        !           408: \*(<:*\*(:> and \*(<:/\*(:> come before \*(<:+\*(:> and \*(<:-\*(:>;
        !           409: .br
        !           410: combinations of \*(<:+\*(:> and \*(<:-\*(:> are computed from left to right.
        !           411: .in -4
        !           412: Note, however, that \*(<:a**b**c\*(:>, \*(<:a/b*c\*(:> and \*(<:a/b/c\*(:> are wrong.
        !           413: .ti -\w'2.\ 'u
        !           414: 4.\ The function \*(<:#\*(:> has a high priority, higher than the
        !           415: five arithmetic functions, and the function \*(<:~\*(:> has a
        !           416: higher priority than all other functions.
        !           417: .ti -\w'2.\ 'u
        !           418: 5.\ All other functions,
        !           419: in particular \*(<:^\*(:>, \*(<:^^\*(:>, \*(<:<<\*(:>, \*(<:><\*(:>, \*(<:>>\*(:>
        !           420: and all tags (like \*(<:sin\*(:> or \*(<:floor\*(:>) have no established priority and
        !           421: may be used
        !           422: .in +4
        !           423: .ti -\w'\(em\ 'u
        !           424: \(em\ having formulas as operands only if these operands
        !           425: are parenthesized (except as in, e.g., \*(<:exp -x\*(:>, because of
        !           426: point 1 above, or as in \*(<:~1>>20\*(:> because of point 4);
        !           427: .ti -\w'\(em\ 'u
        !           428: \(em\ in operands of other formulas only if these operands are
        !           429: parenthesized (except as above).
        !           430: .in -4
        !           431: .in -\w'2.\ 'u
        !           432: .Bl 3
        !           433: None of
        !           434: \*(<:a/b/c\*(:>, \*(<:a/b*c\*(:> and \*(<:sin x+y\*(:>
        !           435: is a correct formula.
        !           436: Each of these can be made correct by inserting parentheses,
        !           437: depending on the intention:
        !           438: either \*(<:(a/b)/c\*(:> or \*(<:a/(b/c)\*(:>,
        !           439: either \*(<:(a/b)*c\*(:> or \*(<:a/(b*c)\*(:>,
        !           440: and either \*(<:(sin x) + y\*(:> or \*(<:sin(x+y)\*(:>.
        !           441: Note that because of point 5 above
        !           442: \*(<:sin(x)+1\*(:> is just as wrong as \*(<:sin x + 1\*(:>,
        !           443: in spite of what other programming languages might lead you to expect.
        !           444: .br
        !           445: The function \*(<:#\*(:> has been given
        !           446: a high priority since expressions like \*(<:#t+1\*(:> are so common,
        !           447: that it would be a nuisance to have to parenthesize these,
        !           448: and more so since \*(<:#(t+1)\*(:> is meaningless anyway.
        !           449: The reason for the high priority of the function \*(<:~\*(:> is
        !           450: to make
        !           451: \*(<:~0\*(:>, for example, for all practical purposes behave as a constant.
        !           452: .Pr zeroadic-function 2
        !           453: .Sl
        !           454: tag
        !           455: .Pr monadic-function 6
        !           456: .Al
        !           457: \*(<:~\*(:>
        !           458: .Al
        !           459: \*(<:+\*(:>
        !           460: .Al
        !           461: \*(<:-\*(:>
        !           462: .Al
        !           463: \*(<:*/\*(:>
        !           464: .Al
        !           465: \*(<:/*\*(:>
        !           466: .Al
        !           467: \*(<:#\*(:>
        !           468: .Al
        !           469: tag
        !           470: .Pr dyadic-function 3
        !           471: .Al
        !           472: \*(<:+\*(:>
        !           473: .Al
        !           474: \*(<:-\*(:>
        !           475: .Al
        !           476: \*(<:*\*(:>
        !           477: .Al
        !           478: \*(<:/\*(:>
        !           479: .Al
        !           480: \*(<:**\*(:>
        !           481: .Al
        !           482: \*(<:^\*(:>
        !           483: .Al
        !           484: \*(<:^^\*(:>
        !           485: .Al
        !           486: \*(<:<<\*(:>
        !           487: .Al
        !           488: \*(<:><\*(:>
        !           489: .Al
        !           490: \*(<:>>\*(:>
        !           491: .Al
        !           492: \*(<:#\*(:>
        !           493: .Al
        !           494: tag
        !           495: .Pr actual-operand 3
        !           496: .Sl
        !           497: single-expression
        !           498: .Eo 3 zeroadic-formula:\0\0\0\k2monadic-formula:\0\0\0\k3dyadic-formula:
        !           499: \h'|\n1u'\*(<:pi\*(:> \h'|\n2u'\*(<:atan(y/x)\*(:> \h'|\n3u'\*(<:x atan y\*(:>
        !           500: .Xe
        !           501: .Us 7 Formulas with user-defined functions
        !           502: A formula whose function is defined by a yield-unit, is
        !           503: evaluated in the following steps:
        !           504: .in \w'2.\ 'u
        !           505: .ti 0
        !           506: 1.\ A copy is made of the current environment (the value of
        !           507: all targets), and all computations during the evaluation of
        !           508: the formula will take place in this ``scratch-pad copy''.
        !           509: .ti 0
        !           510: 2.\ Any local tags in the yield-unit that might clash with tags currently
        !           511: in use are systematically replaced by other tags that do not cause conflict.
        !           512: .ti 0
        !           513: 3.\ Each actual-operand is evaluated and put in the
        !           514: corresponding formal-operand, used as a (new)
        !           515: target.
        !           516: .ti 0
        !           517: 4.\ The command-suite of the unit, thus modified, is executed.
        !           518: .in 0
        !           519: The evaluation of the formula is complete when the execution
        !           520: of this command-suite terminates because of the execution of a return-command;
        !           521: the value of the formula is the value returned.
        !           522: .Us 7 Formulas with predefined functions
        !           523: .de Qr
        !           524: .sp 1
        !           525: .in 0
        !           526: .ne 3
        !           527: ..
        !           528: .de Qe
        !           529: .br
        !           530: .sp -1
        !           531: .in 7m
        !           532: ..
        !           533: .Us 0 A. Functions on numbers
        !           534: .Qr
        !           535: \*(<:~x\*(:>
        !           536: .Qe
        !           537: returns an approximate number, as close as possible
        !           538: in arithmetic magnitude to \*(<:x\*(:>.
        !           539: .Qr
        !           540: \*(<:x+y\*(:>
        !           541: .Qe
        !           542: returns the sum of \*(<:x\*(:> and \*(<:y\*(:>.
        !           543: The result is exact if both operands are exact.
        !           544: .Qr
        !           545: \*(<:+x\*(:>
        !           546: .Qe
        !           547: returns the value of \*(<:x\*(:>.
        !           548: .Qr
        !           549: \*(<:x-y\*(:>
        !           550: .Qe
        !           551: returns the difference of \*(<:x\*(:> and \*(<:y\*(:>.
        !           552: The result is exact if both operands are exact.
        !           553: .Qr
        !           554: \*(<:-x\*(:>
        !           555: .Qe
        !           556: returns minus the value of \*(<:x\*(:>.
        !           557: The result is exact if the operand is exact.
        !           558: .Qr
        !           559: \*(<:x*y\*(:>
        !           560: .Qe
        !           561: returns the product of \*(<:x\*(:> and \*(<:y\*(:>.
        !           562: The result is exact if both operands are exact.
        !           563: .Qr
        !           564: \*(<:x/y\*(:>
        !           565: .Qe
        !           566: returns the quotient of \*(<:x\*(:> and \*(<:y\*(:>.
        !           567: The value of \*(<:y\*(:> must not be zero.
        !           568: The result is exact if both operands are exact.
        !           569: .Qr
        !           570: \*(<:x**y\*(:>
        !           571: .Qe
        !           572: returns \*(<:x\*(:> to the power \*(<:y\*(:>.
        !           573: The result is exact if \*(<:x\*(:> is exact and \*(<:y\*(:> is an integer.
        !           574: If \*(<:x\*(:> is negative,
        !           575: \*(<:y\*(:> must be an integer or an exact number with an odd denominator.
        !           576: If \*(<:x\*(:> is zero,
        !           577: \*(<:y\*(:> must not be negative.
        !           578: If \*(<:y\*(:> is zero, the result is one (exact or approximate).
        !           579: .Qr
        !           580: \*(<:n root x\*(:>
        !           581: .Qe
        !           582: returns the same as \*(<:x**(1/n)\*(:>.
        !           583: .Qr
        !           584: \*(<:root x\*(:>
        !           585: .Qe
        !           586: returns the same as \*(<:2 root x\*(:>, the square root of \*(<:x\*(:>.
        !           587: .Qr
        !           588: \*(<:abs x\*(:>
        !           589: .Qe
        !           590: returns the absolute value of \*(<:x\*(:>.
        !           591: The result is exact if the operand is exact.
        !           592: .Qr
        !           593: \*(<:sign x\*(:>
        !           594: .Qe
        !           595: returns \(mi1 if \*(<:x\*(:> is negative, 0 if \*(<:x\*(:> is zero, and 1 otherwise.
        !           596: .Qr
        !           597: \*(<:floor x\*(:>
        !           598: .Qe
        !           599: returns the largest integer not exceeding \*(<:x\*(:> in arithmetic
        !           600: magnitude.
        !           601: .Qr
        !           602: \*(<:ceiling x\*(:>
        !           603: .Qe
        !           604: returns the same as \*(<:- floor -x\*(:>.
        !           605: .Qr
        !           606: \*(<:n round x\*(:>
        !           607: .Qe
        !           608: returns the same as \*(<:(10**-n)*floor(x*10**n+.5)\*(:>.
        !           609: For example, \*(<:4 round pi = 3.1416\*(:>.
        !           610: The value of \*(<:n\*(:> must be an integer.
        !           611: It may be negative: \*(<:(-2) round 666 = 700\*(:>.
        !           612: .Qr
        !           613: \*(<:round x\*(:>
        !           614: .Qe
        !           615: returns the same as \*(<:0 round x\*(:>.
        !           616: .Qr
        !           617: \*(<:a mod n\*(:>
        !           618: .Qe
        !           619: returns the same as \*(<:a-n*floor(a/n)\*(:>,
        !           620: that is, the remainder after dividing \*(<:a\*(:> by \*(<:n\*(:>.
        !           621: (Both operands may be approximate, and \*(<:n\*(:> may be negative, but not zero.)
        !           622: .Qr
        !           623: \*(<:/*x\*(:>
        !           624: .Qe
        !           625: returns the ``denominator'' of \*(<:x\*(:>,
        !           626: that is, regarding \*(<:x\*(:> as the fraction \*(<:p/q\*(:>,
        !           627: the smallest positive integer \*(<:q\*(:> such that \*(<:q*x\*(:> is an integer.
        !           628: The value of \*(<:x\*(:> must be an exact number.
        !           629: .Qr
        !           630: \*(<:*/x\*(:>
        !           631: .Qe
        !           632: returns the corresponding ``numerator'' with the same sign as \*(<:x\*(:>,
        !           633: the same integer as \*(<:(/*x)*x\*(:>.
        !           634: So, if \*(<:x\*(:> is exact, \*(<:x = (*/x)/(/*x)\*(:>.
        !           635: .Qr
        !           636: \*(<:pi\*(:>
        !           637: .Qe
        !           638: returns approximately \*(<:3.1415926535\*(:>...
        !           639: .Qr
        !           640: \*(<:sin x\*(:>
        !           641: .Qe
        !           642: returns an approximate number by applying the sine function to \*(<:x\*(:>,
        !           643: with \*(<:x\*(:> in radians.
        !           644: .Qr
        !           645: \*(<:cos x\*(:>
        !           646: .Qe
        !           647: returns an approximate number by applying the cosine function to \*(<:x\*(:>,
        !           648: with \*(<:x\*(:> in radians.
        !           649: .Qr
        !           650: \*(<:tan x\*(:>
        !           651: .Qe
        !           652: returns the same as \*(<:(sin x) / (cos x)\*(:>.
        !           653: .Qr
        !           654: \*(<:x atan y\*(:>
        !           655: .Qe
        !           656: returns an approximate number \*(<:phi\*(:>, in the range from (about)
        !           657: \*(<:-pi\*(:> to \*(<:+pi\*(:>, such that
        !           658: \*(<:x\*(:> is approximated by \*(<:r * cos phi\*(:>
        !           659: and \*(<:y\*(:> by \*(<:r * sin phi\*(:>, where \*(<:r = root(x*x+y*y)\*(:>.
        !           660: The operands must not both be zero.
        !           661: .Qr
        !           662: \*(<:atan x\*(:>
        !           663: .Qe
        !           664: returns the same as \*(<:1 atan x\*(:>.
        !           665: .Qr
        !           666: \*(<:e\*(:>
        !           667: .Qe
        !           668: returns approximately \*(<:2.7182818284\*(:>...
        !           669: .Qr
        !           670: \*(<:exp x\*(:>
        !           671: .Qe
        !           672: returns approximately the same as \*(<:e**x\*(:>.
        !           673: .Qr
        !           674: \*(<:log x\*(:>
        !           675: .Qe
        !           676: returns an approximate number by applying the natural logarithm function
        !           677: (with base \*(<:e\*(:>)
        !           678: to \*(<:x\*(:>.
        !           679: The value of \*(<:x\*(:> must be positive.
        !           680: .Qr
        !           681: \*(<:b log x\*(:>
        !           682: .Qe
        !           683: returns the same as \*(<:(log x) / (log b)\*(:>,
        !           684: that is, the logarithm with base \*(<:b\*(:> of \*(<:x\*(:>.
        !           685: .Us 7 B. Functions on texts
        !           686: .Qr
        !           687: \*(<:t^u\*(:>
        !           688: .Qe
        !           689: returns the text consisting of \*(<:t\*(:> and \*(<:u\*(:> joined.
        !           690: For example, \*(<:'now'^'here' = 'nowhere'\*(:>.
        !           691: .Qr
        !           692: \*(<:t^^n\*(:>
        !           693: .Qe
        !           694: returns the text consisting of \*(<:n\*(:> copies of \*(<:t\*(:> joined together.
        !           695: For \pexample, \*(<:'Fi! '^^3 = 'Fi! Fi! Fi! '\*(:>.
        !           696: The value of \*(<:n\*(:> must be an integer and not negative.
        !           697: .Qr
        !           698: \*(<:x<<n\*(:>
        !           699: .Qe
        !           700: converts \*(<:x\*(:> to a text and adds space characters to
        !           701: the right until the length is \*(<:n\*(:>.
        !           702: For example, \*(<:123<<6 = '123   '\*(:>.
        !           703: In no case is the text truncated; if \*(<:n\*(:> is too small,
        !           704: the resulting text is as long as necessary.
        !           705: The value of \*(<:n\*(:> must be an integer, but \*(<:x\*(:> may be of any type.
        !           706: See write-commands, section 5.1.2, for details about converting values to
        !           707: texts.
        !           708: .Qr
        !           709: \*(<:x><n\*(:>
        !           710: .Qe
        !           711: converts \*(<:x\*(:> to a text and adds space characters to
        !           712: the right and to the left, in turn, until the length is \*(<:n\*(:>.
        !           713: For example, \*(<:123><6 = ' 123  '\*(:>.
        !           714: In no case is the text truncated.
        !           715: The value of \*(<:n\*(:> must be an integer, but \*(<:x\*(:> may be of any type.
        !           716: .Qr
        !           717: \*(<:x>>n\*(:>
        !           718: .Qe
        !           719: converts \*(<:x\*(:> to a text and adds space characters to
        !           720: the left until the length is \*(<:n\*(:>.
        !           721: For example, \*(<:123>>6 = '   123'\*(:>.
        !           722: In no case is the text truncated.
        !           723: The value of \*(<:n\*(:> must be an integer, but \*(<:x\*(:> may be of any type.
        !           724: .Bl 7
        !           725: .Us 7 C. Functions on texts, lists and tables
        !           726: .Qr
        !           727: \*(<:keys t\*(:>
        !           728: .Qe
        !           729: requires a table as operand, and returns a list of all keys
        !           730: in the table.
        !           731: For example, \*(<:keys {[1]: 1; [4]: 2; [9]: 3} = {1; 4; 9}\*(:>.
        !           732: .Qr
        !           733: \*(<:#t\*(:>
        !           734: .Qe
        !           735: accepts texts, lists and tables.
        !           736: For a text operand, its length is returned, and
        !           737: for a list or table operand, the number of
        !           738: entries is returned (where duplicates in lists are counted).
        !           739: .Qr
        !           740: \*(<:e#t\*(:>
        !           741: .Qe
        !           742: accepts texts, lists and tables for the right operand.
        !           743: .br
        !           744: For a text operand, the first operand must
        !           745: be a character, and the number of times the character
        !           746: occurs in the text is returned.
        !           747: For example, \*(<:'i'#'mississippi' = 4\*(:>.
        !           748: .br
        !           749: For a list operand, the number of entries is returned
        !           750: that are equal to the first operand
        !           751: (which must be of the same type as the list entries.)
        !           752: .br
        !           753: For example, \*(<:3#{1; 3; 3; 4} = 2\*(:>.
        !           754: .br
        !           755: .??
        !           756: For a table operand, the number of \fIassociates\fP is returned
        !           757: that are equal to the first operand
        !           758: (which must be of the same type as the associates in the table.)
        !           759: For example, \*(<:3#{[1]: 3; [2]: 4; [3]: 3} = 2\*(:>.
        !           760: .Qr
        !           761: \*(<:min t\*(:>
        !           762: .Qe
        !           763: accepts texts, lists and tables.
        !           764: For a text operand, its smallest (in the ASCII order) character is returned,
        !           765: for a list operand, its smallest
        !           766: entry is returned, and
        !           767: for a table operand, its smallest
        !           768: \fIassociate\fP
        !           769: .??
        !           770: is returned.
        !           771: For example, \*(<:min 'uscule' = 'c'\*(:>,
        !           772: \*(<:min{1; 3; 3; 4} = 1\*(:>, and
        !           773: \*(<:min{[1]: 3; [2]: 4; [3]: 3} = 3\*(:>.
        !           774: The text, list or table must not be empty.
        !           775: .br
        !           776: To get the smallest \fIkey\fP of a table \*(<:t\*(:>,
        !           777: use \*(<:min keys t\*(:>.
        !           778: .Qr
        !           779: \*(<:e min t\*(:>
        !           780: .Qe
        !           781: accepts texts, lists and tables for the right operand.
        !           782: .br
        !           783: For a text operand,
        !           784: the first operand
        !           785: must
        !           786: be a character, and the smallest character in the text
        !           787: \fIexceeding\fP
        !           788: that character is returned.
        !           789: For example, \*(<:'i' min 'mississippi' = 'm'\*(:>.
        !           790: .br
        !           791: For a list operand, the smallest
        !           792: entry is returned exceeding the first operand
        !           793: (which must be of the same type as the list entries.)
        !           794: For example, \*(<:3 min {1; 3; 3; 4} = 4\*(:>.
        !           795: .br
        !           796: For a table operand, the smallest associate
        !           797: is returned exceeding the first operand
        !           798: (which must be of the same type as the associates in the table.)
        !           799: For example, \*(<:3 min {[1]: 3; [2]: 4; [3]: 3} = 4\*(:>.
        !           800: .br
        !           801: There must be a character, list entry or table associate exceeding
        !           802: the first operand.
        !           803: .Qr
        !           804: \*(<:max t\*(:> and
        !           805: .br
        !           806: \*(<:e max t\*(:>
        !           807: .Qe
        !           808: .Qe
        !           809: are like \*(<:min\*(:>, except that they return the largest
        !           810: element, and in the dyadic case the largest element
        !           811: that is less than the first operand.
        !           812: For example, \*(<:'m' max 'mississippi' = 'i'\*(:>.
        !           813: .Qr
        !           814: \*(<:n th'of t\*(:>
        !           815: .Qe
        !           816: requires an integer in \*(<:{1..#t}\*(:> for the left operand, and
        !           817: accepts texts, lists and tables for the right operand.
        !           818: It returns the \*(<:n\*(:>'th character, list entry or associate.
        !           819: .br
        !           820: In fact, \*(<:n th'of t\*(:>, for a text \*(<:t\*(:>, is written as easily
        !           821: \*(<:t@n|1\*(:>.
        !           822: For a table, it is the same as \*(<:t[n th'of (keys t)]\*(:>,
        !           823: which is something different from \*(<:t[n]\*(:>, unless,
        !           824: of course, \*(<:keys t = {1..#t}\*(:>.
        !           825: For a list,
        !           826: \*(<:1 th'of t\*(:> is \*(<:min t\*(:>.
        !           827: .Se 2  6.1.7 REFINED-EXPRESSIONS
        !           828: .Xx expression-refinement
        !           829: .Xx scratch-pad copy
        !           830: .Xx return-command
        !           831: .Sy  2
        !           832: .Pr refined-expression 2
        !           833: .Sl
        !           834: tag
        !           835: .Ps 
        !           836: The tag of a refined-expression must occur as
        !           837: the tag of one
        !           838: expression-refinement in the unit
        !           839: in which it occurs.
        !           840: .Sx 3 \k1refined-expression:
        !           841: \*(<:stack'pointer\*(:>
        !           842: .Xe
        !           843: .Tx
        !           844: A refined-expression is
        !           845: evaluated in the following steps:
        !           846: .in \w'2.\ 'u
        !           847: .ti 0
        !           848: 1.\ A copy is made of the current environment (the value of
        !           849: all targets), and all computations during the evaluation of
        !           850: the expression will take place in this ``scratch-pad copy''.
        !           851: .ti 0
        !           852: 2.\ The command-suite of the corresponding
        !           853: expression-refinement is executed.
        !           854: .in 0
        !           855: The evaluation of the refined-expression is complete when the execution
        !           856: of this command-suite terminates because of the execution of a return-command;
        !           857: the value of the refined-expression is the value returned.
        !           858: .Sa
        !           859: expression-refinements (4.4).
        !           860: .Se 4 6.2 TARGETS
        !           861: .Xx compound
        !           862: .Sy  4
        !           863: .Pr target 4
        !           864: .Al
        !           865: single-target
        !           866: .Al
        !           867: multiple-target
        !           868: .Pr single-target 3
        !           869: .Al
        !           870: basic-target
        !           871: .Al
        !           872: \*(<:(\*(:> target \*(<:)\*(:>
        !           873: .Pr basic-target 4
        !           874: .Al
        !           875: tag
        !           876: .Al
        !           877: trimmed-text-target
        !           878: .Al
        !           879: table-selection-target
        !           880: .Tx
        !           881: For the use of a tag as target, see below under IDENTIFIERS.
        !           882: For other kinds of targets, see below under the appropriate heading.
        !           883: .Pr multiple-target 1
        !           884: .Al
        !           885: single-target\*(<:,\*(:> single-target
        !           886: .Al
        !           887: single-target\*(<:,\*(:> multiple-target
        !           888: .Ex 3
        !           889: \k1multiple-targets:
        !           890: \h'|\n1u'\*(<:nn, t2\*(:>
        !           891: \h'|\n1u'\*(<:(x0, y0), (x1, y1), (x2, y2), (x3, y3)\*(:>
        !           892: .Xe
        !           893: .Tx
        !           894: If a value is put in a multiple-target, the value must be
        !           895: a compound with as many fields as there are single-targets
        !           896: separated by commas in the multiple-target.
        !           897: The successive fields are then put in the
        !           898: successive single-targets.
        !           899: If it makes a difference in what order the fields are put in
        !           900: the single-targets (as in \*(<:PUT 1, 2 IN x, x\*(:>
        !           901: where the final value of \*(<:x\*(:> might be either \*(<:1\*(:> or \*(<:2\*(:>),
        !           902: an error is reported {{but this is currently not checked}}.
        !           903: .br
        !           904: Note that the meaning of \*(<:PUT a, b IN b, a\*(:>
        !           905: is well defined (provided that \*(<:a\*(:> and \*(<:b\*(:> are defined and have
        !           906: values of the same type):
        !           907: first the value of the expression \*(<:a, b\*(:> is determined,
        !           908: and that value is next put in \*(<:b, a\*(:>.
        !           909: Note also that the meaning of \*(<:PUT t[i], t[j] IN t[j], t[i]\*(:>
        !           910: is well defined, even if \*(<:i\*(:> and \*(<:j\*(:> have the same value.
        !           911: For although in this case a value is put twice in the same
        !           912: target, that value is the same each time, so the order does not matter.
        !           913: .Se 2  6.2.1 IDENTIFIERS
        !           914: .Xx tag
        !           915: .Xx target
        !           916: .Xx location
        !           917: .Xx local
        !           918: .Sy  2
        !           919: .Pr identifier 4
        !           920: .Al
        !           921: single-identifier
        !           922: .Al
        !           923: multiple-identifier
        !           924: .Pr single-identifier 3
        !           925: .Al
        !           926: tag
        !           927: .Al
        !           928: \*(<:(\*(:> identifier \*(<:)\*(:>
        !           929: .Pr multiple-identifier 1
        !           930: .Al
        !           931: single-identifier\*(<:,\*(:> single-identifier
        !           932: .Al
        !           933: single-identifier\*(<:,\*(:> multiple-identifier
        !           934: .Eo 6 identifiers:\0\0\0\0\0\0\0\0\0\0\0\k2single-identifiers:
        !           935: \h'|\n1u'\*(<:a\*(:>\h'|\n2u'\*(<:a\*(:>
        !           936: \h'|\n1u'\*(<:(a)\*(:>\h'|\n2u'\*(<:(a)\*(:>
        !           937: \h'|\n1u'\*(<:(a, b, (c, d))\*(:>\h'|\n2u'\*(<:(a, b, (c, d))\*(:>
        !           938: \h'|\n1u'\*(<:a, b, (c, d)\*(:>
        !           939: .Xe
        !           940: .Tx
        !           941: All identifiers can be used as targets, but the converse is
        !           942: not true.
        !           943: For example,
        !           944: .Di 1
        !           945: \*(<:FOR a[1] IN {1..3}: WRITE a\*(:>
        !           946: .Ed
        !           947: is wrong, because \*(<:a[1]\*(:>, although a target, is not an identifier.
        !           948: If something is put in a target that is a tag, and no
        !           949: location for that tag exists already, it is created first.
        !           950: If the location is created locally (the tag did not occur in
        !           951: an immediate command and was not listed in a share-heading),
        !           952: the location will cease to exist when the current unit is exited.
        !           953: For putting in multiple-identifiers, see multiple-targets in section 6.2.
        !           954: .Se 2  6.2.2 TRIMMED-TEXT-TARGETS
        !           955: .Sy  2
        !           956: .Pr trimmed-text-target 3
        !           957: .Al
        !           958: target \*(<:@\*(:> right-expression
        !           959: .Al
        !           960: target \*(<:|\*(:> right-expression
        !           961: .Ps\"(The \*(<:|\*(:> in the last line is not the BNF choice indicator, but should be takenliterally.)
        !           962: .Ex 6
        !           963: \k1trimmed-text-targets:
        !           964: \h'|\n1u'\*(<:t@p\*(:>
        !           965: \h'|\n1u'\*(<:t|1\*(:>
        !           966: \h'|\n1u'\*(<:t|q@p\*(:>
        !           967: \h'|\n1u'\*(<:t@p|(q-p+1)\*(:>
        !           968: .Xe
        !           969: .Tx
        !           970: The target must hold a text T, and the value
        !           971: of the right-expression must be an integer N.
        !           972: .br
        !           973: If the sign used is \*(<:@\*(:>, then the
        !           974: trimmed-text-target indicates a location consisting of the
        !           975: positions of T starting with the N'th position.
        !           976: N must be at least 1 and at most one more than the length of T.
        !           977: For example, after
        !           978: .Di 2
        !           979: \*(<:PUT 'computer' IN tt
        !           980: PUT 'ass' IN tt@5\*(:>
        !           981: .Ed
        !           982: \*(<:tt\*(:> will contain the text \*(<:'compass'\*(:>.
        !           983: .br
        !           984: If the sign used is \*(<:|\*(:>, then the
        !           985: trimmed-text-target indicates a location
        !           986: consisting of the first N characters of T.
        !           987: N must be at least 0 and at most equal to the length of T.
        !           988: For example, after
        !           989: .Di 2
        !           990: \*(<:PUT 'computer' IN tt
        !           991: PUT 'ne' IN tt|4\*(:>
        !           992: .Ed
        !           993: \*(<:tt\*(:> will contain the text \*(<:'neuter'\*(:>.
        !           994: .Bl 1
        !           995: Note that the target itself may be a trimmed-text-target
        !           996: again.
        !           997: For example, after
        !           998: .Di 2
        !           999: \*(<:PUT 'computer' IN tt
        !          1000: PUT 'm' IN tt@4|1\*(:>
        !          1001: .Ed
        !          1002: \*(<:tt\*(:> will contain the text \*(<:'commuter'\*(:>.
        !          1003: .br
        !          1004: Some useful special cases: \*(<:PUT '' IN t|1\*(:>
        !          1005: removes the first character of the text in \*(<:t\*(:>;
        !          1006: .br
        !          1007: \*(<:PUT '.' IN t@(#t+1)\*(:>
        !          1008: appends a period to the text in \*(<:t\*(:>.
        !          1009: .Se 2  6.2.3 TABLE-SELECTION-TARGETS
        !          1010: .Xx key
        !          1011: .Xx associate
        !          1012: .Xx table entry
        !          1013: .Xx location
        !          1014: .Xx type
        !          1015: .Sy  2
        !          1016: .Pr table-selection-target 2
        !          1017: .Sl
        !          1018: target \*(<:[\*(:> expression \*(<:]\*(:>
        !          1019: .Sx 3 \k1table-selection-target:
        !          1020: \*(<:t[i, j]\*(:>
        !          1021: .Xe
        !          1022: .Tx
        !          1023: The target must contain a table.
        !          1024: The value of the expression is a key K, to be used as selector.
        !          1025: For each key in the table, there is a location for the
        !          1026: corresponding associate.
        !          1027: If K is an existing key of the table, the location for the
        !          1028: table-selection-target is that of the associate corresponding to K.
        !          1029: If a value A is then put in the table-selection-target,
        !          1030: the original associate held in that location is superseded by A.
        !          1031: If K is not an existing key and a value A is to be put in the
        !          1032: table-selection-target, a new location is created, and the
        !          1033: (original) table is made to contain a new table entry
        !          1034: consisting of K and A.
        !          1035: K must be of the same type as the other keys of the
        !          1036: table, and A of the same type as the other associates.
        !          1037: .Se 5 6.3 TESTS
        !          1038: .Xx bound tags
        !          1039: .Xx scratch-pad copy
        !          1040: .Tx
        !          1041: Tests do not return a value, but succeed or fail when
        !          1042: tested.
        !          1043: In \*B, the testing of a test cannot alter the values of targets
        !          1044: that currently exist, nor can it create new targets that survive the test,
        !          1045: with the exception of the temporary survival of bound tags
        !          1046: as described under QUANTIFICATIONS (section 6.3.7) and
        !          1047: REFINED-TESTS (section 6.3.3).
        !          1048: .br
        !          1049: If a test appears to alter an existing target, it effectively modifies
        !          1050: a local, ``scratch-pad''
        !          1051: \fIcopy\fP of that target, and the change is invisible outside the test.
        !          1052: .Sy  6
        !          1053: .Pr test 6
        !          1054: .Al
        !          1055: tight-test
        !          1056: .Al
        !          1057: conjunction
        !          1058: .Al
        !          1059: disjunction
        !          1060: .Al
        !          1061: negation
        !          1062: .Al
        !          1063: quantification
        !          1064: .Pr tight-test 6
        !          1065: .Al
        !          1066: \*(<:(\*(:> test \*(<:)\*(:>
        !          1067: .Al
        !          1068: order-test
        !          1069: .Al
        !          1070: proposition
        !          1071: .Al
        !          1072: refined-test
        !          1073: .Pr right-test 4
        !          1074: .Al
        !          1075: tight-test
        !          1076: .Al
        !          1077: negation
        !          1078: .Al
        !          1079: quantification
        !          1080: .Tx
        !          1081: The various kinds of tests that are distinguished here
        !          1082: serve to define the syntax
        !          1083: in such a way that no parentheses are needed where the meaning is
        !          1084: sufficiently clear.
        !          1085: .Se 7  6.3.1 ORDER-TESTS
        !          1086: .Xx order
        !          1087: .Xx approximate
        !          1088: .Xx exact
        !          1089: .Xx equal
        !          1090: .Xx number
        !          1091: .Sy  7
        !          1092: .Pr order-test 3
        !          1093: .Al
        !          1094: single-expression\0order-sign\0single-expression
        !          1095: .Al
        !          1096: order-test\0order-sign\0single-expression
        !          1097: .Pr order-sign 7
        !          1098: .Al
        !          1099: \*(<:<\*(:>
        !          1100: .Al
        !          1101: \*(<:<=\*(:>
        !          1102: .Al
        !          1103: \*(<:=\*(:>
        !          1104: .Al
        !          1105: \*(<:<>\*(:>
        !          1106: .Al
        !          1107: \*(<:>=\*(:>
        !          1108: .Al
        !          1109: \*(<:>\*(:>
        !          1110: .Ps
        !          1111: (The order-sign \*(<:<>\*(:> stands for ``not equals''.)
        !          1112: .Ex 5
        !          1113: \k1order-tests:
        !          1114: \h'|\n1u'\*(<:(i', j') > (i, j)\*(:>
        !          1115: \&\h'|\n1u'\*(<:'0' <= d <= '9'\*(:>
        !          1116: \h'|\n1u'\*(<:fa <= f(x) >= fb\*(:>
        !          1117: .Xe
        !          1118: The single-expressions are evaluated one by one, from left to right,
        !          1119: and each adjacent pair is compared.
        !          1120: As soon as a comparison does not comply with the given order-sign,
        !          1121: the whole order-test fails and no further single-expressions are evaluated.
        !          1122: The order-test succeeds if all comparisons comply with the
        !          1123: specified order-signs.
        !          1124: .br
        !          1125: Note carefully that an approximate number is \fInever\fP equal to an exact
        !          1126: number, so, for instance, if you want to compare an approximate number \*(<:a\*(:>
        !          1127: for equality with an exact number \*(<:e\*(:>, you should write
        !          1128: .Di 1
        !          1129: \*(<:IF a = ~e:\*(:>\ ...
        !          1130: .Ed
        !          1131: .br
        !          1132: This also allows you to test if a number is exact or not:
        !          1133: .Di 3
        !          1134: \*(<:SELECT:
        !          1135:     x = ~x: WRITE 'Approximate'
        !          1136:     ELSE: WRITE 'Exact'\*(:>
        !          1137: .Ed
        !          1138: .Se 2  6.3.2 PROPOSITIONS
        !          1139: .Xx proposition
        !          1140: .Xx user-defined predicate
        !          1141: .Xx scratch-pad copy
        !          1142: .Xx test-unit
        !          1143: .Xx report-command
        !          1144: .Xx succeed-command
        !          1145: .Xx fail-command
        !          1146: .Xx text, list or table
        !          1147: .Sy  2
        !          1148: .Pr zeroadic-proposition 2
        !          1149: .Sl
        !          1150: zeroadic-predicate
        !          1151: .Pr monadic-proposition 2
        !          1152: .Sl
        !          1153: monadic-predicate\0actual-operand
        !          1154: .Pr dyadic-proposition 2
        !          1155: .Al
        !          1156: actual-operand\0dyadic-predicate\0actual-operand
        !          1157: .Pr zeroadic-predicate 2
        !          1158: .Sl
        !          1159: tag
        !          1160: .Pr monadic-predicate 2
        !          1161: .Sl
        !          1162: tag
        !          1163: .Pr dyadic-predicate 2
        !          1164: .Sl
        !          1165: tag
        !          1166: .Us 7 Propositions with user-defined predicates
        !          1167: A proposition whose predicate is defined by a test-unit, is
        !          1168: tested in the following steps:
        !          1169: .in \w'2.\ 'u
        !          1170: .ti 0
        !          1171: 1.\ A copy is made of the current environment (the value of
        !          1172: all targets), and all computations during the testing of
        !          1173: the proposition will take place in this ``scratch-pad copy''.
        !          1174: .ti 0
        !          1175: 2.\ Any local tags in the test-unit that might clash with tags currently
        !          1176: in use are systematically replaced by other tags that do not cause conflict.
        !          1177: .ti 0
        !          1178: 3.\ Each actual-operand is evaluated and put in the
        !          1179: corresponding formal-operand, used as a (new)
        !          1180: target.
        !          1181: .ti 0
        !          1182: 4.\ The command-suite of the unit, thus modified, is executed.
        !          1183: .in 0
        !          1184: The testing of the proposition is complete when the execution
        !          1185: of this command-suite terminates because of the execution
        !          1186: of a report-, succeed- or fail-command;
        !          1187: the proposition succeeds or fails accordingly.
        !          1188: .Us 7 Propositions with predefined predicates
        !          1189: .Qr
        !          1190: \*(<:e in t\*(:>
        !          1191: .Qe
        !          1192: accepts texts, lists and tables for the right operand.
        !          1193: It succeeds if \*(<:e#t > 0\*(:> succeeds,
        !          1194: in other words, if the value \*(<:e\*(:> occurs in \*(<:t\*(:>.
        !          1195: .Qr
        !          1196: \*(<:e not'in t\*(:>
        !          1197: .Qe
        !          1198: is the same as \*(<:(NOT e in t)\*(:>.
        !          1199: .Se 2  6.3.3 REFINED-TESTS
        !          1200: .Xx scratch-pad copy
        !          1201: .Xx report-command
        !          1202: .Xx succeed-command
        !          1203: .Xx fail-command
        !          1204: .Xx bound tags
        !          1205: .Sy  2
        !          1206: .Pr refined-test 2
        !          1207: .Sl
        !          1208: tag
        !          1209: .Sx 3 \k1refined-test:
        !          1210: \*(<:special'case\*(:>
        !          1211: .Xe
        !          1212: .Tx
        !          1213: A refined-test is
        !          1214: tested in the following steps:
        !          1215: .in \w'2.\ 'u
        !          1216: .ti 0
        !          1217: 1.\ A copy is made of the current environment (the value of all targets),
        !          1218: and all computations during the testing of
        !          1219: the test will take place in this ``scratch-pad copy''.
        !          1220: .ti 0
        !          1221: 2.\ The command-suite of the corresponding
        !          1222: test-refinement is executed.
        !          1223: .in 0
        !          1224: The testing of the refined-test is complete when the execution
        !          1225: of this command-suite terminates because of the execution
        !          1226: of a report-, succeed- or fail-command, and the refined-test
        !          1227: succeeds or fails accordingly.
        !          1228: .ne 3
        !          1229: .br
        !          1230: Any bound tags set by a for-command or
        !          1231: a quantification (see 6.3.7) at that time will temporarily survive
        !          1232: for those parts that are reachable only by virtue of the outcome of the test.
        !          1233: This is so that you can turn any test into a refined-test with the same effect.
        !          1234: .br
        !          1235: For example, in
        !          1236: .Di 3
        !          1237: \*(<:    IF divisible AND n > d**2: WRITE d
        !          1238:     \*(:>...\*(<:
        !          1239: divisible: REPORT SOME d IN {2..n-1} HAS n mod d = 0\*(:>,
        !          1240: .Ed
        !          1241: the bound tag \*(<:d\*(:> is set to a divisor of \*(<:n\*(:> if the
        !          1242: refined-test succeeds, and since the part \*(<:n > d**2\*(:>
        !          1243: is only reached after success, \*(<:d\*(:> may be used there.
        !          1244: The same is true for the write-command using \*(<:d\*(:>.
        !          1245: The line after (indicated with three dots), however, can be
        !          1246: reached if the divisibility test fails.
        !          1247: So there \*(<:d\*(:> has ceased to exist.
        !          1248: .Sa
        !          1249: test-refinements (4.4).
        !          1250: .Se 2  6.3.4 CONJUNCTIONS
        !          1251: .Sy  2
        !          1252: .Pr conjunction 3
        !          1253: .Al
        !          1254: tight-test \*(<:AND\*(:> right-test
        !          1255: .Al
        !          1256: tight-test \*(<:AND\*(:> conjunction
        !          1257: .Ex 4
        !          1258: \k1conjunctions:
        !          1259: \h'|\n1u'\*(<:a > 0 AND b > 0\*(:>
        !          1260: \h'|\n1u'\*(<:i in keys t AND t[i] in keys u AND u[t[i]] <> 'dummy'\*(:>
        !          1261: .Xe
        !          1262: .Tx
        !          1263: The tests of the conjunction, separated by \*(<:AND\*(:>, are tested
        !          1264: one by one, from left to right.
        !          1265: As soon as one of these tests fails,
        !          1266: the whole conjunction fails and no further parts
        !          1267: are tested.
        !          1268: The conjunction succeeds if all its tests succeed.
        !          1269: .Se 2  6.3.5 DISJUNCTIONS
        !          1270: .Sy  2
        !          1271: .Pr disjunction 3
        !          1272: .Al
        !          1273: tight-test \*(<:OR\*(:> right-test
        !          1274: .Al
        !          1275: tight-test \*(<:OR\*(:> disjunction
        !          1276: .Ex 4
        !          1277: \k1disjunctions:
        !          1278: \h'|\n1u'\*(<:a <= 0 OR b <= 0\*(:>
        !          1279: \h'|\n1u'\*(<:n = 0 OR s[1] = s[n] OR t[1] = t[n]\*(:>
        !          1280: .Xe
        !          1281: .Tx
        !          1282: The tests of the disjunction, separated by \*(<:OR\*(:>, are tested
        !          1283: one by one, from left to right.
        !          1284: As soon as one of these tests succeeds,
        !          1285: the whole disjunction succeeds and no further parts
        !          1286: are tested.
        !          1287: The disjunction fails if all its tests fail.
        !          1288: .Se 2  6.3.6 NEGATIONS
        !          1289: .Sy  2
        !          1290: .Pr negation 2
        !          1291: .Sl
        !          1292: \*(<:NOT\*(:> right-test
        !          1293: .Sx 3 \k1negation:
        !          1294: \*(<:NOT a subset b\*(:>
        !          1295: .Xe
        !          1296: .Tx
        !          1297: A negation succeeds if its right-test fails, and fails if
        !          1298: that test succeeds.
        !          1299: .Se 3  6.3.7 QUANTIFICATIONS
        !          1300: .Xx bound tags
        !          1301: .Xx text, list or table
        !          1302: .Xx character
        !          1303: .Xx list entry
        !          1304: .Xx associate
        !          1305: .Sy  3
        !          1306: .Pr quantification 2
        !          1307: .Sl
        !          1308: quantifier\0ranger \*(<:HAS\*(:> right-test
        !          1309: .Pr quantifier 4
        !          1310: .Al
        !          1311: \*(<:SOME\*(:>
        !          1312: .Al
        !          1313: \*(<:EACH\*(:>
        !          1314: .Al
        !          1315: \*(<:NO\*(:>
        !          1316: .Pr ranger 3
        !          1317: .Al
        !          1318: in-ranger
        !          1319: .Al
        !          1320: parsing-ranger
        !          1321: .Pr parsing-ranger 3
        !          1322: .Sl
        !          1323: multiple-identifier \*(<:PARSING\*(:> expression
        !          1324: .Ps
        !          1325: Note that the identifier of a parsing-ranger must be a multiple-identifier
        !          1326: (like \*(<:p, q, r\*(:>):
        !          1327: it may not be a single-identifier (like \*(<:pqr\*(:>).
        !          1328: Moreover, each of the single-identifiers (like \*(<:p\*(:>) must be
        !          1329: plain tags.
        !          1330: The reason is that this determines the number of parts
        !          1331: which the value of the expression must be split into (see below).
        !          1332: .Bl 1
        !          1333: (For in-rangers, see for-commands, section 5.2.4.)
        !          1334: .Ex 5
        !          1335: \k1quantifications:
        !          1336: \h'|\n1u'\*(<:SOME p, q, r PARSING line HAS q in {'. '; '? '; '! '}\*(:>
        !          1337: \h'|\n1u'\*(<:EACH i, j IN keys t HAS t[i, j] = t[j, i]\*(:>
        !          1338: \h'|\n1u'\*(<:NO d IN {2..n-1} HAS n mod d = 0\*(:>
        !          1339: .Xe
        !          1340: .Tx
        !          1341: The tags of the identifier of a quantifier may not be used as targets
        !          1342: or target-contents
        !          1343: outside such a quantifier.
        !          1344: They are ``bound tags'', and lose their meaning outside the
        !          1345: quantifier, except as described below.
        !          1346: .Bl 2
        !          1347: The meaning of quantifications will first be described for
        !          1348: the case of \*(<:SOME\*(:>\ ...\ \*(<:IN\*(:>\ ...
        !          1349: .br
        !          1350: The value of the expression must be a text, list or table.
        !          1351: The items (characters, list entries or associates) of that value are
        !          1352: assigned one by one to the identifier, and the right-test is
        !          1353: tested each time.
        !          1354: The quantification succeeds as soon as
        !          1355: the right-test succeeds once.
        !          1356: It fails only if the text, list or table is exhausted and the
        !          1357: right-test has failed each time.
        !          1358: .br
        !          1359: If the quantification succeeds,
        !          1360: the bound tags set at that moment
        !          1361: will temporarily survive and may be used
        !          1362: in those parts that are reachable only by virtue of the
        !          1363: outcome of the test.
        !          1364: .br
        !          1365: For example, in
        !          1366: .Di 3
        !          1367: \*(<: IF (SOME d IN {2..n-1} HAS n mod d = 0) AND n > d**2: WRITE d
        !          1368: \*(:>\ ...
        !          1369: .Ed
        !          1370: the bound tag \*(<:d\*(:> is set to a divisor of \*(<:n\*(:> if the
        !          1371: quantification succeeds, and since the part \*(<:n > d**2\*(:>
        !          1372: is only reached after success, \*(<:d\*(:> may be used there.
        !          1373: The same is true for the write-command using \*(<:d\*(:>.
        !          1374: So, if \*(<:n\*(:> has the value \*(<:77\*(:>, \*(<:7\*(:> will be written, since
        !          1375: the test \*(<:n mod d = 0\*(:> succeeds the first time when
        !          1376: \*(<:d\*(:> is set to \*(<:7\*(:> (and \*(<:77 > 7**2\*(:>).
        !          1377: The line after (indicated with three dots), however, can be
        !          1378: reached if the divisibility test fails.
        !          1379: So there \*(<:d\*(:> has ceased to exist and may not be used.
        !          1380: .sp
        !          1381: The meaning of a quantification \*(<:SOME id IN tlt HAS prop\*(:>
        !          1382: can also be described as the meaning of the refined-test
        !          1383: \*(<:test'if'some\*(:>, given
        !          1384: a test-refinement
        !          1385: .Di 4
        !          1386: \*(<:test'if'some:
        !          1387:     FOR id IN tlt:
        !          1388:         IF prop: SUCCEED
        !          1389:     FAIL\*(:>
        !          1390: .Ed
        !          1391: .Bl 3
        !          1392: The meaning of \*(<:EACH id IN tlt HAS prop\*(:>
        !          1393: is the same as that of \*(<:NOT SOME id IN tlt HAS NOT prop\*(:>.
        !          1394: In other words, an \*(<:EACH\*(:> quantification succeeds only if its
        !          1395: right-test succeeds each time.
        !          1396: .br
        !          1397: The meaning of \*(<:NO id IN tlt HAS prop\*(:>
        !          1398: is the same as that of \*(<:NOT SOME id IN tlt HAS prop\*(:>.
        !          1399: In other words, a \*(<:NO\*(:> quantification succeeds only if its
        !          1400: right-test fails each time.
        !          1401: .br
        !          1402: The rules for temporary survival are the same as for \*(<:SOME\*(:>.
        !          1403: So an \*(<:EACH\*(:> or \*(<:NO\*(:> quantification will only have set its
        !          1404: bound tags on failure.
        !          1405: Thus, in the following, the bound tag \*(<:d\*(:> survives into the \*(<:ELSE\*(:>:
        !          1406: .Di 4
        !          1407: \*(<:SELECT:
        !          1408:     NO d IN {2..n-1} HAS n mod d = 0:
        !          1409:         WRITE 'prime'
        !          1410:     ELSE: WRITE 'divisible by `d`'\*(:>
        !          1411: .Ed
        !          1412: .Bl 3
        !          1413: If \*(<:PARSING\*(:> is specified,
        !          1414: all \fIparsings\fP of the value of the given expression are
        !          1415: tried, instead of its items.
        !          1416: The value of the expression must be a text.
        !          1417: A ``parsing'' of a text is a way of splitting it in parts.
        !          1418: The text is split in all possible ways in as many parts as
        !          1419: there are tags in the multiple-identifier, and each split
        !          1420: is put in that identifier, whereupon the right-test is tested.
        !          1421: For example,
        !          1422: .Di 1
        !          1423: \*(<:SOME p, q, r PARSING 'abracadabra' HAS (p = r AND #p > 3)\*(:>
        !          1424: .Ed
        !          1425: will succeed with \*(<:p\*(:> and \*(<:r\*(:> set to \*(<:'abra'\*(:> and \*(<:q\*(:> set to \*(<:'cad'\*(:>.
        !          1426: If the test \*(<:#p > 3\*(:> is omitted, the quantification will
        !          1427: succeed with the uninteresting result that \*(<:p\*(:> and \*(<:r\*(:> are set
        !          1428: to \*(<:''\*(:> and \*(<:q\*(:> to \*(<:'abracadabra'\*(:>.
        !          1429: .br
        !          1430: To give another example,
        !          1431: .Di 3
        !          1432: \*(<:    PUT 'a man, a plan, a canal: panama!' IN palindrome
        !          1433:     WHILE SOME hd, x, tl PARSING palindrome HAS x'non'letter:
        !          1434:         PUT hd^tl IN palindrome
        !          1435:     WRITE palindrome /
        !          1436: x'non'letter: REPORT #x = 1 AND x not'in {'a'..'z'}\*(:>
        !          1437: .Ed
        !          1438: will successively find and remove all non-letters from the
        !          1439: text in \*(<:palindrome\*(:> finally leaving the text \*(<:'amanaplanacanalpanama'\*(:>.
        !          1440: (This is not a recommended way, because it will be very slow.
        !          1441: There are equally simple and much faster ways to achieve the same effect.
        !          1442: The example is only chosen to illustrate the possibilities of \*(<:PARSING\*(:>.)
        !          1443: Note that the test \*(<:#x = 1\*(:> here is essential.
        !          1444: If it is omitted, the program will go
        !          1445: into an endless loop ``removing'' empty texts \*(<:x\*(:> from \*(<:palindrome\*(:>.
        !          1446: .br
        !          1447: The meaning of \*(<:SOME p, q,\*(:>\ ...\ \*(<:PARSING whole HAS prop\*(:>
        !          1448: may more precisely be described as follows.
        !          1449: Let \*(<:parsings\*(:> stand for a list, containing
        !          1450: \fIall\fP compounds with the same number of fields as the
        !          1451: multiple-identifier \*(<:p, q,\*(:>\ ..., such that those fields
        !          1452: (which are texts) joined together give the text \*(<:whole\*(:>.
        !          1453: For example, in
        !          1454: .Di 1
        !          1455: \*(<:SOME p, q, r PARSING 'abracadabra' HAS (p = r AND #p > 3)\*(:>
        !          1456: .Ed
        !          1457: the list \*(<:parsings\*(:> will begin with
        !          1458: .Di 1
        !          1459: \*(<:{('', '', 'abracadabra'); ('', 'a', 'bracadabra');\*(:>\ ...\ ,
        !          1460: .Ed
        !          1461: contain somewhere in the middle
        !          1462: .Di 1
        !          1463: \&...\ \*(<:; ('abra', 'cad', 'abra');\*(:>\ ...\ ,
        !          1464: .Ed
        !          1465: and end with
        !          1466: .Di 1
        !          1467: \&...\ \*(<:; ('abracadabr', 'a', ''); ('abracadabra', '', '')}\*(:>.
        !          1468: .Ed
        !          1469: The effect of the quantification is then the same as that
        !          1470: of
        !          1471: .Di 1
        !          1472: \*(<:SOME p, q,\*(:>\ ...\ \*(<:IN parsings HAS prop\*(:>.
        !          1473: .Ed
        !          1474: The meaning of \*(<:EACH\*(:> or \*(<:NO\*(:> is accordingly defined.
        !          1475: .Sa
        !          1476: for-commands (5.2.4).
        !          1477: .ps 10
        !          1478: .vs 12
        !          1479: .de PH\"Page Header
        !          1480: .ie \\n+(cl<3 \{\
        !          1481: .po +\\n(TWu/3u
        !          1482: .rt
        !          1483: .ns \}
        !          1484: .el \{\
        !          1485: .po \\n(POu
        !          1486: .nr f1 \\n(.f\"        current font
        !          1487: .ft
        !          1488: .nr f2 \\n(.f\"        previous font
        !          1489: .ft R
        !          1490: .nr sp \\n(.s\"current point size
        !          1491: .ps \\n(ms-1   
        !          1492: 'bp
        !          1493: .CM \" Cut Mark
        !          1494: 'ie o 'tl ''\\*(TL'\\*(Sn'
        !          1495: 'el   'tl '\\*(Sn'\\*(TL''
        !          1496: .ft \\n(f2\"   restore previous font
        !          1497: .ft \\n(f1\"   restore current font
        !          1498: .ps \\n(sp\"restore point size
        !          1499: 'sp 2
        !          1500: .mk
        !          1501: 'ns
        !          1502: 'EH\"Extra Header
        !          1503: 'nr cl 0 1 \}
        !          1504: 'na
        !          1505: ..
        !          1506: .ch PH
        !          1507: .wh -(\n(HFu-1v) PH
        !          1508: .de Fo\" Page footer
        !          1509: .nr f1 \\n(.f\"        current font
        !          1510: .ft
        !          1511: .nr f2 \\n(.f\"        previous font
        !          1512: .ft R
        !          1513: .nr sp \\n(.s\"current point size
        !          1514: .ps \\n(ms-1
        !          1515: .po \\n(POu
        !          1516: .if \\n%>2 .tl ''%''
        !          1517: .po
        !          1518: .ft \\n(f2\"   restore previous font
        !          1519: .ft \\n(f1\"   restore current font
        !          1520: .ps \\n(sp\"restore point size
        !          1521: ..
        !          1522: .de XX
        !          1523: .br
        !          1524: .ti 0
        !          1525: ..
        !          1526: .ds Sn Index
        !          1527: .nr cl 4 1
        !          1528: .ll \n(TWu/3u-2n
        !          1529: .na
        !          1530: .bp
        !          1531: .Us 3 INDEX
        !          1532: .mk
        !          1533: .in 2n
        !          1534: .XX
        !          1535: actual-operand 6.1.6
        !          1536: .XX
        !          1537: actual-parameter 5.1.16
        !          1538: .XX
        !          1539: alternative-sequence 5.2.2
        !          1540: .XX
        !          1541: alternative-suite 5.2.2
        !          1542: .XX
        !          1543: ambiguity 6.1.5, 6.1.6
        !          1544: .XX
        !          1545: approximate 6.3.1
        !          1546: .XX
        !          1547: approximate-constant 6.1.1
        !          1548: .XX
        !          1549: approximate number 1
        !          1550: .XX
        !          1551: associate 1, 5.1.6, 5.2.4, 6.1.4, 6.1.5, 6.1.6, 6.2.3, 6.3.7
        !          1552: .XX
        !          1553: basic-expression 6.1
        !          1554: .XX
        !          1555: basic-target 6.2
        !          1556: .XX
        !          1557: bound tags 5.1.13, 5.1.14, 5.1.15, 5.2.4, 6.3, 6.3.3, 6.3.7
        !          1558: .XX
        !          1559: brackets 6.1.6
        !          1560: .XX
        !          1561: character 1, 5.1.6, 5.2.4, 6.1.5, 6.1.6, 6.3.7
        !          1562: .XX
        !          1563: check-command 5.1.1
        !          1564: .XX
        !          1565: choose-command 5.1.6
        !          1566: .XX
        !          1567: command 5
        !          1568: .XX
        !          1569: command-refinement 4.4, 5.1.11, 5.1.17
        !          1570: .XX
        !          1571: command-sequence 4.5
        !          1572: .XX
        !          1573: command-suite 4.5
        !          1574: .XX
        !          1575: comment 3
        !          1576: .XX
        !          1577: compound 1, 6.1, 6.2
        !          1578: .XX
        !          1579: conjunction 6.3.4
        !          1580: .XX
        !          1581: control-command 5.2
        !          1582: .XX
        !          1583: conversion 6.1.5
        !          1584: .XX
        !          1585: convert to a text 5.1.2, 6.1.5, 6.1.6
        !          1586: .XX
        !          1587: decrease-indentation 3
        !          1588: .XX
        !          1589: delete-command 5.1.10
        !          1590: .XX
        !          1591: denominator 6.1.6
        !          1592: .XX
        !          1593: digit 6.1.1
        !          1594: .XX
        !          1595: disjunction 6.3.5
        !          1596: .XX
        !          1597: display 6.1.5
        !          1598: .XX
        !          1599: draw-command 5.1.5
        !          1600: .XX
        !          1601: dyadic 4.2, 4.3
        !          1602: .XX
        !          1603: dyadic-formula 6.1.6
        !          1604: .XX
        !          1605: dyadic-function 6.1.6
        !          1606: .XX
        !          1607: dyadic-predicate 6.3.2
        !          1608: .XX
        !          1609: dyadic-proposition 6.3.2
        !          1610: .XX
        !          1611: else-alternative 5.2.2
        !          1612: .XX
        !          1613: empty 2
        !          1614: .XX
        !          1615: empty list 6.1.5
        !          1616: .XX
        !          1617: empty table 6.1.5
        !          1618: .XX
        !          1619: entry 1
        !          1620: .XX
        !          1621: equal 6.3.1
        !          1622: .XX
        !          1623: exact 6.3.1
        !          1624: .XX
        !          1625: exact-constant 6.1.1
        !          1626: .XX
        !          1627: exact number 1
        !          1628: .XX
        !          1629: exponent-part 6.1.1
        !          1630: .XX
        !          1631: expression 6.1
        !          1632: .XX
        !          1633: expression-refinement 4.4, 4.5, 5.1.12, 6.1.7
        !          1634: .XX
        !          1635: fail-command 4.5, 5.1.15, 6.3.2, 6.3.3
        !          1636: .XX
        !          1637: field 1
        !          1638: .XX
        !          1639: for-command 5.2.4
        !          1640: .XX
        !          1641: formal-dyadic-formula 4.2
        !          1642: .XX
        !          1643: formal-dyadic-proposition 4.3
        !          1644: .XX
        !          1645: formal-formula 4.2
        !          1646: .XX
        !          1647: formal-monadic-formula 4.2
        !          1648: .XX
        !          1649: formal-monadic-proposition 4.3
        !          1650: .XX
        !          1651: formal-operand 4.2
        !          1652: .XX
        !          1653: formal-parameter 4.1
        !          1654: .XX
        !          1655: formal-proposition 4.3
        !          1656: .XX
        !          1657: formal-tail 4.1
        !          1658: .XX
        !          1659: formal-trailer 4.1
        !          1660: .XX
        !          1661: formal-user-defined-command 4.1
        !          1662: .XX
        !          1663: formal-zeroadic-formula 4.2
        !          1664: .XX
        !          1665: formal-zeroadic-proposition 4.3
        !          1666: .XX
        !          1667: formula 4.2, 4.3, 6.1.6
        !          1668: .XX
        !          1669: fractional-part 6.1.1
        !          1670: .XX
        !          1671: function 4.2, 4.3, 6.1.6
        !          1672: .XX
        !          1673: further-comment 3
        !          1674: .XX
        !          1675: global 4.5, 5
        !          1676: .XX
        !          1677: how-to-unit 4.1, 5.1.11, 5.1.16
        !          1678: .XX
        !          1679: identifier 6.2.1
        !          1680: .XX
        !          1681: if-command 5.2.1
        !          1682: .XX
        !          1683: immediate command 5, 5.1.11
        !          1684: .XX
        !          1685: in-ranger 5.2.4
        !          1686: .XX
        !          1687: increase-indentation 3
        !          1688: .XX
        !          1689: indentation 3
        !          1690: .XX
        !          1691: insert-command 5.1.9
        !          1692: .XX
        !          1693: integer 6.1.3, 6.1.5, 6.1.6
        !          1694: .XX
        !          1695: integral-part 6.1.1
        !          1696: .XX
        !          1697: interrupt key 5, 5.1.2
        !          1698: .XX
        !          1699: key 1, 6.1.4, 6.1.5, 6.1.6, 6.2.3
        !          1700: .XX
        !          1701: keyword 3, 4.1, 4.4, 5.1.16, 5.1.17
        !          1702: .XX
        !          1703: list 1
        !          1704: .XX
        !          1705: list-body 6.1.5
        !          1706: .XX
        !          1707: list-display 6.1.5
        !          1708: .XX
        !          1709: list entry 1, 5.1.6, 5.1.8, 5.1.9, 5.2.4, 6.1.6, 6.3.7
        !          1710: .XX
        !          1711: list-filler 6.1.5
        !          1712: .XX
        !          1713: list-filler-series 6.1.5
        !          1714: .XX
        !          1715: local 4.5, 6.1.6, 6.2.1
        !          1716: .XX
        !          1717: location 5.1.4, 5.1.10, 6.2.1, 6.2.3
        !          1718: .XX
        !          1719: monadic 4.2, 4.3
        !          1720: .XX
        !          1721: monadic-formula 6.1.6
        !          1722: .XX
        !          1723: monadic-function 6.1.6
        !          1724: .XX
        !          1725: monadic-predicate 6.3.2
        !          1726: .XX
        !          1727: monadic-proposition 6.3.2
        !          1728: .XX
        !          1729: multiple-expression 6.1
        !          1730: .XX
        !          1731: multiple-identifier 6.2.1
        !          1732: .XX
        !          1733: multiple-target 6.2
        !          1734: .XX
        !          1735: negation 6.3.6
        !          1736: .XX
        !          1737: new-line 3
        !          1738: .XX
        !          1739: new-line-proper 3
        !          1740: .XX
        !          1741: new-liners 5.1.2
        !          1742: .XX
        !          1743: number 1, 5.1.5, 6.1.6, 6.3.1
        !          1744: .XX
        !          1745: numerator 6.1.6
        !          1746: .XX
        !          1747: numeric-constant 6.1.1
        !          1748: .XX
        !          1749: optional-ANYTHING 2
        !          1750: .XX
        !          1751: order 1, 6.3.1
        !          1752: .XX
        !          1753: order-sign 6.3.1
        !          1754: .XX
        !          1755: order-test 6.3.1
        !          1756: .XX
        !          1757: overloading of functions and predicates 4.2, 4.3
        !          1758: .XX
        !          1759: parentheses 6.1.6
        !          1760: .XX
        !          1761: parsing-ranger 6.3.7
        !          1762: .XX
        !          1763: permanent environment 4.5, 5.1.2, 5.1.11
        !          1764: .XX
        !          1765: plusminus 6.1.1
        !          1766: .XX
        !          1767: predefined functions 6.1.6
        !          1768: .XX
        !          1769: predefined predicates 6.3.2
        !          1770: .XX
        !          1771: predicate 4.2, 4.3
        !          1772: .XX
        !          1773: priority 6.1.6
        !          1774: .XX
        !          1775: proposition 4.3, 6.3.2
        !          1776: .XX
        !          1777: put-command 5.1.4
        !          1778: .XX
        !          1779: quantification 6.3.7
        !          1780: .XX
        !          1781: quantifier 6.3.7
        !          1782: .XX
        !          1783: quit-command 5.1.11, 5.1.16, 5.1.17
        !          1784: .XX
        !          1785: quote 6.1.5
        !          1786: .XX
        !          1787: random 5.1.5, 5.1.6, 5.1.7
        !          1788: .XX
        !          1789: ranger 6.3.7
        !          1790: .XX
        !          1791: read-command 5.1.3
        !          1792: .XX
        !          1793: refined-command 5.1.17
        !          1794: .XX
        !          1795: refined-expression 5.1.12, 6.1.7
        !          1796: .XX
        !          1797: refined-test 5.1.13, 5.1.14, 5.1.15, 6.3.3
        !          1798: .XX
        !          1799: refinement 4.4
        !          1800: .XX
        !          1801: refinement-suite 4
        !          1802: .XX
        !          1803: remove-command 5.1.8
        !          1804: .XX
        !          1805: report-command 4.5, 5.1.13, 6.3.2, 6.3.3
        !          1806: .XX
        !          1807: return-command 4.5, 5.1.12, 6.1.6, 6.1.7
        !          1808: .XX
        !          1809: right-expression 6.1
        !          1810: .XX
        !          1811: right-test 6.3
        !          1812: .XX
        !          1813: scratch-pad copy 6.1, 6.1.6, 6.1.7, 6.3, 6.3.2, 6.3.3
        !          1814: .XX
        !          1815: select-command 5.2.2
        !          1816: .XX
        !          1817: set-random-command 5.1.7
        !          1818: .XX
        !          1819: share-heading 4.5
        !          1820: .XX
        !          1821: simple-command 5.1
        !          1822: .XX
        !          1823: simple-expression 6.1
        !          1824: .XX
        !          1825: single-alternative 5.2.2
        !          1826: .XX
        !          1827: single-expression 6.1
        !          1828: .XX
        !          1829: single-identifier 6.2.1
        !          1830: .XX
        !          1831: single-target 6.2
        !          1832: .XX
        !          1833: spaces 3
        !          1834: .XX
        !          1835: succeed-command 4.5, 5.1.14, 6.3.2, 6.3.3
        !          1836: .XX
        !          1837: table 1
        !          1838: .XX
        !          1839: table-display 6.1.5
        !          1840: .XX
        !          1841: table entry 1, 5.1.10, 6.1.4, 6.2.3
        !          1842: .XX
        !          1843: table-filler 6.1.5
        !          1844: .XX
        !          1845: table-filler-series 6.1.5
        !          1846: .XX
        !          1847: table-selection 6.1.4
        !          1848: .XX
        !          1849: table-selection-target 5.1.10, 6.2.3
        !          1850: .XX
        !          1851: tag 3, 6.2.1
        !          1852: .XX
        !          1853: target 4.5, 5.1.4, 5.2.4, 6.1.6, 6.2, 6.2.1
        !          1854: .XX
        !          1855: target-content 6.1.2
        !          1856: .XX
        !          1857: terminating-command 5.1, 5.2.3
        !          1858: .XX
        !          1859: test 4.3, 6.3
        !          1860: .XX
        !          1861: test-refinement 4.4, 4.5, 5.1.13, 5.1.14, 5.1.15
        !          1862: .XX
        !          1863: test-unit 4.3, 4.5, 5.1.13, 5.1.14, 5.1.15, 6.3.2
        !          1864: .XX
        !          1865: text 1, 6.1.6
        !          1866: .XX
        !          1867: text, list and table 5.1.6, 5.2.4, 6.1.6, 6.3.2, 6.3.7
        !          1868: .XX
        !          1869: text-display 6.1.5
        !          1870: .XX
        !          1871: tight-expression 6.1
        !          1872: .XX
        !          1873: tight-test 6.3
        !          1874: .XX
        !          1875: trailer 5.1.16
        !          1876: .XX
        !          1877: trimmed-text 6.1.3
        !          1878: .XX
        !          1879: trimmed-text-target 6.2.2
        !          1880: .XX
        !          1881: type 5.1.4, 6.2.3
        !          1882: .XX
        !          1883: unit 4
        !          1884: .XX
        !          1885: user-defined-command 4.1, 5.1.16
        !          1886: .XX
        !          1887: user-defined-function 4.2, 5.1.12, 6.1.6
        !          1888: .XX
        !          1889: user-defined-predicate 4.3, 5.1.13, 5.1.14, 5.1.15, 6.3.2
        !          1890: .XX
        !          1891: while-command 5.2.3
        !          1892: .XX
        !          1893: work-space 4, 4.5
        !          1894: .XX
        !          1895: write-command 5.1.2
        !          1896: .XX
        !          1897: yield-unit 4.2, 4.5, 5.1.12, 6.1.6
        !          1898: .XX
        !          1899: zeroadic 4.2, 4.3
        !          1900: .XX
        !          1901: zeroadic-formula 6.1.6
        !          1902: .XX
        !          1903: zeroadic-function 6.1.6
        !          1904: .XX
        !          1905: zeroadic-predicate 6.3.2
        !          1906: .XX
        !          1907: zeroadic-proposition 6.3.2
        !          1908: .rm PH
        !          1909: .wh -0 CM
        !          1910: .bp

unix.superglobalmegacorp.com

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