Annotation of 43BSD/contrib/B/doc/Description1, revision 1.1

1.1     ! root        1: .\" Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984.
        !             2: .Du START
        !             3: .sp 1
        !             4: .in 0
        !             5: .ce 99
        !             6: DESCRIPTION OF B
        !             7: 
        !             8: Lambert Meertens
        !             9: Steven Pemberton
        !            10: 
        !            11: CWI
        !            12: Amsterdam
        !            13: 
        !            14: April 1984
        !            15: .ce 0
        !            16: .Co
        !            17: .ds Sn Contents
        !            18: .bp
        !            19: .in 15
        !            20: .nf
        !            21: .ps 8
        !            22: .vs 10
        !            23: CONTENTS
        !            24: 
        !            25: 0.\0INTRODUCTION
        !            26: 1.\0VALUES IN B
        !            27: 2.\0SYNTAX DESCRIPTION METHOD
        !            28: 3.\0REPRESENTATIONS
        !            29: 4.\0UNITS
        !            30:         4.1.\0HOW-TO-UNITS
        !            31:         4.2.\0YIELD-UNITS
        !            32:         4.3.\0TEST-UNITS
        !            33:         4.4.\0REFINEMENTS
        !            34:         4.5.\0COMMAND-SUITES
        !            35: 5.\0COMMANDS
        !            36:         5.1.\0\0SIMPLE-COMMANDS
        !            37:                 5.1.1.\0\0CHECK-COMMANDS
        !            38:                 5.1.2.\0\0WRITE-COMMANDS
        !            39:                 5.1.3.\0\0READ-COMMANDS
        !            40:                 5.1.4.\0\0PUT-COMMANDS
        !            41:                 5.1.5.\0\0DRAW-COMMANDS
        !            42:                 5.1.6.\0\0CHOOSE-COMMANDS
        !            43:                 5.1.7.\0\0SET-RANDOM-COMMANDS
        !            44:                 5.1.8.\0\0REMOVE-COMMANDS
        !            45:                 5.1.9.\0\0INSERT-COMMANDS
        !            46:                 5.1.10.\0DELETE-COMMANDS
        !            47:                 5.1.11.\0QUIT-COMMAND
        !            48:                 5.1.12.\0RETURN-COMMANDS
        !            49:                 5.1.13.\0SUCCEED-COMMAND
        !            50:                 5.1.14.\0FAIL-COMMAND
        !            51:                 5.1.15.\0USER-DEFINED-COMMANDS
        !            52:                 5.1.16.\0REFINED-COMMANDS
        !            53:         5.2.\0CONTROL-COMMANDS
        !            54:                 5.2.1.\0IF-COMMANDS
        !            55:                 5.2.2.\0SELECT-COMMANDS
        !            56:                 5.2.3.\0WHILE-COMMANDS
        !            57:                 5.2.4.\0FOR-COMMANDS
        !            58: 6.\0EXPRESSIONS, TARGETS AND TESTS
        !            59:         6.1.\0EXPRESSIONS
        !            60:                 6.1.1.\0NUMERIC-CONSTANTS
        !            61:                 6.1.2.\0TARGET-CONTENTS
        !            62:                 6.1.3.\0TRIMMED-TEXTS
        !            63:                 6.1.4.\0TABLE-SELECTIONS
        !            64:                 6.1.5.\0DISPLAYS
        !            65:                 6.1.6.\0FORMULAS
        !            66:                         Formulas with user-defined functions
        !            67:                         Formulas with predefined functions
        !            68:                 6.1.7.\0REFINED-EXPRESSIONS
        !            69:         6.2.\0TARGETS
        !            70:                 6.2.1.\0IDENTIFIERS
        !            71:                 6.2.2.\0TRIMMED-TEXT-TARGETS
        !            72:                 6.2.3.\0TABLE-SELECTION-TARGETS
        !            73:         6.3.\0TESTS
        !            74:                 6.3.1.\0ORDER-TESTS
        !            75:                 6.3.2.\0PROPOSITIONS
        !            76:                         Propositions with user-defined predicates
        !            77:                         Propositions with predefined predicates
        !            78:                 6.3.3.\0REFINED-TESTS
        !            79:                 6.3.4.\0CONJUNCTIONS
        !            80:                 6.3.5.\0DISJUNCTIONS
        !            81:                 6.3.6.\0NEGATIONS
        !            82:                 6.3.7.\0QUANTIFICATIONS
        !            83: INDEX
        !            84: .ps 10
        !            85: .vs 12
        !            86: .in 0
        !            87: .ds Sn Introduction
        !            88: .bp
        !            89: .St 0 INTRODUCTION
        !            90: .fi
        !            91: .Tx
        !            92: \*B is a simple but powerful new programming language, designed for use in
        !            93: personal computing.
        !            94: (Note: the name ``\*B'' is only a temporary working title,
        !            95: and the new language bears no relation to the predecessor of
        !            96: C.)\ 
        !            97: The foremost aim in the design of \*B has been the ease of use for
        !            98: programmers who want to produce working programs without having
        !            99: to master a complex tool.
        !           100: An implementation of \*B is available from the \*B group at
        !           101: the CWI, currently only under UNIX* or its look-alikes, but soon
        !           102: (scheduled early 1985) also for the IBM-PC under MS-DOS.
        !           103: Remarks concerning the implementation appear in this description
        !           104: between double braces {{ and }}.
        !           105: .sp 0.6v
        !           106: This description of \*B originated from a text, prepared by
        !           107: the first author, for use in teaching \*B during the Fall
        !           108: term of 1982 at New York University.
        !           109: The aim is to provide a reference book for the users of \*B that is more
        !           110: accessible than the somewhat formal ``Draft Proposal'' [2].
        !           111: While it is not a text book, it should also be useful
        !           112: to people who already have ample programming
        !           113: experience and want to learn \*B.
        !           114: A text book for beginners is also available from the CWI [1].
        !           115: .sp 0.6v
        !           116: In this description we have tried to remain close to the Draft Proposal
        !           117: in order to facilitate cross-referencing. To this end, all section numbers
        !           118: from section 4 onwards are the same as in the Draft Proposal.
        !           119: However there are some changes in terminology.
        !           120: Some minor differences are
        !           121: .sp 0.6v
        !           122: .ta 2m \w'mmTYPE-TYPES-expressionmm'u \w'mmTYPE-TYPES-expressionmm'u+\w'multiple-expressionmm'u
        !           123: .nf
        !           124: \&     Draft Proposal: This description:
        !           125: .sp 0.4v
        !           126: \&     textual-display text-display
        !           127: \&     textual-body    text-body
        !           128: \&     LIST-body       optional-list-body
        !           129: \&     TABLE-body      optional-table-filler-series
        !           130: .fi
        !           131: .sp 0.6v
        !           132: But the main difference is perhaps in the treatment of ``collateral'':
        !           133: .sp 0.6v
        !           134: .nf
        !           135: \&     Draft Proposal: This description:       Examples
        !           136: .sp 0.4v
        !           137: \&     collateral-expression   expression      \*(<:a   (a, b)   a, b\*(:>
        !           138: \&     TYPE-expression single-expression       \*(<:a   (a, b)\*(:>
        !           139: \&     TYPE-TYPES-expression   multiple-expression     \*(<:             a, b\*(:>
        !           140: .fi
        !           141: .sp 0.6v
        !           142: Whereas these are purely descriptional differences,
        !           143: there are also a few differences in content.
        !           144: Where the Draft Proposal has the keyword \*(<:ALLOW\*(:>,
        !           145: \*B now has the keyword \*(<:SHARE\*(:>;
        !           146: a command \*(<:READ\*(:>\ ...\ \*(<:RAW\*(:> has been added;
        !           147: and approximate-constants may no longer consist of just an exponent-part:
        !           148: \*(<:E-1\*(:> must now be written \*(<:1E-1\*(:>.
        !           149: .sp 0.6v
        !           150: References
        !           151: .sp 0.5v
        !           152: .in +\w'[1]\ 'u
        !           153: .ti 0
        !           154: [1]\ \fIComputer Programming for Beginners, Introducing the B Language,
        !           155: Part 1\fP,
        !           156: .br
        !           157: Leo Geurts, CWI, Amsterdam, 1984
        !           158: .sp 0.5v
        !           159: .ti 0
        !           160: [2]\ \fIDraft Proposal for the B Programming Language\fP,
        !           161: .br
        !           162: Lambert Meertens, CWI, Amsterdam, 1981
        !           163: .sp 0.6v
        !           164: .in 0
        !           165: *\ \s-2Unix is a trademark of Bell Laboratories.\s0
        !           166: .fi
        !           167: .SN 1
        !           168: .bp
        !           169: .St 1 "VALUES IN \*B"
        !           170: .de tY
        !           171: .sp 1
        !           172: .ne 5
        !           173: .in \w'Compounds\0\0'u
        !           174: .ta \w'Compounds\0\0'u
        !           175: .ti 0
        !           176: \\$1\t\c
        !           177: ..
        !           178: .Xx number
        !           179: .Xx exact number
        !           180: .Xx approximate number
        !           181: .Xx text
        !           182: .Xx character
        !           183: .Xx order
        !           184: .Xx compound
        !           185: .Xx field
        !           186: .Xx list
        !           187: .Xx entry
        !           188: .Xx list entry
        !           189: .Xx table
        !           190: .Xx table entry
        !           191: .Xx key
        !           192: .Xx associate
        !           193: .Tx
        !           194: \*B has two basic types of values: numbers and texts, and three ways of making
        !           195: new types of values from existing ones: compounds, lists and tables.
        !           196: The built-in functions for operating on these values are described
        !           197: in section 6.1.6 entitled ``Formulas with predefined functions''.
        !           198: .tY Numbers
        !           199: Numbers come in two kinds: exact and approximate.
        !           200: Exact numbers are rational numbers.
        !           201: For example, \*(<:1.25\*(:> = \*(<:5/4\*(:>, and \*(<:(1/3)*3\*(:> = \*(<:1\*(:>.
        !           202: There is no restriction on the size of numerator and denominator.
        !           203: Approximate numbers are implemented by whatever the hardware has to offer
        !           204: for fast but approximate arithmetic (floating point).
        !           205: .br
        !           206: The arithmetic operations and many other functions give an exact result
        !           207: when their operands are exact,
        !           208: and an approximate result otherwise,
        !           209: but the function \*(<:sin\*(:>, for example, always returns an approximate number.
        !           210: .br
        !           211: An exact number can be made approximate with the \*(<:~\*(:> function
        !           212: (e.g. \*(<:~1.25\*(:>);
        !           213: the functions \*(<:round\*(:>, \*(<:floor\*(:> and \*(<:ceiling\*(:> can be used to convert
        !           214: an approximate number to an exact one.
        !           215: .br
        !           216: Exact and approximate numbers may be mixed in arithmetic, as in \*(<:4 * atan 1\*(:>.
        !           217: .tY Texts
        !           218: Texts (strings) are composed of printable ASCII characters.
        !           219: They are variable length, and are ordered in the usual lexicographic way:
        !           220: \&\*(<:'a' < 'aa' < 'b'\*(:>.
        !           221: There is no type ``character'': a text of length one will do.
        !           222: .br
        !           223: The printable characters
        !           224: are the 95 characters represented on the lines below,
        !           225: where the blank space preceding `\*(<:!\*(:>' stands for the
        !           226: (otherwise invisible) space character:
        !           227: .Di 5
        !           228: \*(<: !"#$%&'()*+,-./0123456789:;<=>?
        !           229: @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_
        !           230: `abcdefghijklmnopqrstuvwxyz{|}~\*(:>
        !           231: .br
        !           232: .Ed
        !           233: The ordering
        !           234: on the characters is the ASCII collating order, which is the order
        !           235: in which the characters are displayed above.
        !           236: .tY Compounds
        !           237: A compound consists of a sequence of other values, its ``fields''.
        !           238: For example,
        !           239: the number \*(<:3\*(:> and the text \*(<:'xyz'\*(:> may be combined to give the
        !           240: compound \*(<:3, 'xyz'\*(:>.
        !           241: Compounds are also ordered lexicographically.
        !           242: .br
        !           243: For example, \*(<:(3, 'xyz') < (3, 'yz') < (pi, 'aaa')\*(:>.
        !           244: For this to be meaningful, the compounds that are compared must
        !           245: be of the same type.
        !           246: This means that they have the
        !           247: same number of fields, and that corresponding fields are of the same type.
        !           248: .br
        !           249: The only way to obtain the individual fields of a compound is to put it
        !           250: in a multiple-target with the right number of components, as in
        !           251: .Di 1
        !           252: \*(<:PUT name IN last'name, first'name, middle'name\*(:>.
        !           253: .Ed
        !           254: .tY Lists
        !           255: A list is a \fIsorted\fP sequence of values, its ``entries''.
        !           256: All entries of a list must be of the same type, and this determines
        !           257: the type of the list.
        !           258: The length of a list may vary without influencing its type.
        !           259: When an entry is inserted in a list (with an \*(<:INSERT\*(:> command), it is automatically
        !           260: inserted in the list in the proper position in the sorting order.
        !           261: A list may contain duplicates of the same entry.
        !           262: Entries may be removed with the \*(<:REMOVE\*(:> command.
        !           263: Again, lists themselves are ordered lexicographically.
        !           264: .tY Tables
        !           265: A table consists of a (sorted) sequence of ``table entries''.
        !           266: Each table entry is a pair of two values: a \fIkey\fP and an \fIassociate\fP.
        !           267: All keys of a table must be of the same type; similarly, all associates must
        !           268: also be of the same type (but that type may be different to
        !           269: that of the keys).
        !           270: A table may not contain duplicate keys.
        !           271: If \*(<:k\*(:> is a key of the table \*(<:t\*(:>, then \*(<:t[k]\*(:>
        !           272: gives the associate corresponding to \*(<:k\*(:>.
        !           273: New entries can be made, or existing entries modified, by putting the
        !           274: associate value in the table after selecting with the key value, as
        !           275: in \*(<:PUT a IN t[k]\*(:>.
        !           276: Entries can be deleted with the \*(<:DELETE\*(:> command, as in \*(<:DELETE t[k]\*(:>.
        !           277: The ordering is again lexicographic.
        !           278: .St 2 "SYNTAX DESCRIPTION METHOD"
        !           279: .Tx
        !           280: The syntax of \*B is given in the following form:
        !           281: each rule starts with the name of the thing being defined followed by a colon;
        !           282: following this are one or more alternatives,
        !           283: each marked with a \(bu in front.
        !           284: Each alternative is composed of symbols that stand for
        !           285: themselves, or the names of other rules.
        !           286: These other rules are then defined elsewhere in the grammar,
        !           287: or possibly in the same rule.
        !           288: As an example, here is a simple grammar for a small part of English:
        !           289: .Sy  4
        !           290: .Pn  sentence 3
        !           291: .Al
        !           292: declarative
        !           293: .Al
        !           294: declarative \*(<:,\*(:> connective\0sentence
        !           295: .Pn  declarative 3
        !           296: .Al
        !           297: collective-noun\0verb\0collective-noun
        !           298: .Al
        !           299: collective-noun \*(<:do not\*(:> verb\0collective-noun
        !           300: .Pn collective-noun 2
        !           301: .Al
        !           302: \*(<:cats\*(:>
        !           303: .Al
        !           304: \*(<:dogs\*(:>
        !           305: .Al
        !           306: \*(<:people\*(:>
        !           307: .Al
        !           308: \*(<:the police\*(:>
        !           309: .Pn verb 2
        !           310: .Al
        !           311: \*(<:love\*(:>
        !           312: .Al
        !           313: \*(<:hate\*(:>
        !           314: .Al
        !           315: \*(<:eat\*(:>
        !           316: .Al
        !           317: \*(<:hassle\*(:>
        !           318: .Pn connective 2
        !           319: .Al
        !           320: \*(<:and\*(:>
        !           321: .Al
        !           322: \*(<:but\*(:>
        !           323: .Al
        !           324: \*(<:although\*(:>
        !           325: .Al
        !           326: \*(<:because\*(:>
        !           327: .Al
        !           328: \*(<:yet\*(:>
        !           329: .Tx
        !           330: This produces sentences like:
        !           331: .Di 4
        !           332: .in -6
        !           333: \*(<:dogs do not love the police\*(:>
        !           334: \*(<:the police hassle dogs\*(:>
        !           335: \*(<:cats do not hate cats , but cats hate dogs , because dogs hate cats\*(:>
        !           336: \*(<:people eat dogs , yet dogs love people\*(:>
        !           337: .in +6
        !           338: .Ed
        !           339: .in 0
        !           340: You will notice that the names of rules are in a different
        !           341: typeface to words that stand for themselves.
        !           342: In the grammar of \*B that follows, furthermore, rule names
        !           343: are all in lower-case letters, while words that stand for themselves are all
        !           344: in upper-case letters, so they are easily distinguished.
        !           345: .sp
        !           346: It often happens that a part of an alternative is optional.
        !           347: There is a special rule for this:
        !           348: .Sy  4
        !           349: .Pr empty 2
        !           350: .Al
        !           351: .br
        !           352: .Pr optional-ANYTHING 3
        !           353: .Al
        !           354: empty
        !           355: .Al
        !           356: ANYTHING
        !           357: .Tx
        !           358: The ``optional'' rule is included to save many rules in the definition.
        !           359: For example, it stands for a rule
        !           360: .Pn  optional-comment 3
        !           361: .Al
        !           362: empty
        !           363: .Al
        !           364: comment
        !           365: .Tx
        !           366: and similar rules.
        !           367: (Empty produces an empty result.)
        !           368: .St 3 REPRESENTATIONS
        !           369: .Xx indentation
        !           370: .Xx increase-indentation
        !           371: .Xx decrease-indentation
        !           372: .Xx new-line-proper
        !           373: .Xx keyword
        !           374: .Xx tag
        !           375: .Pr new-line 2
        !           376: .Sl
        !           377: optional-comment\0new-line-proper\0indent
        !           378: .Ps
        !           379: A \*B program consists of indented lines.
        !           380: A new-line-proper marks a transition to a new line.
        !           381: An indent stands for the left margin blank offset.
        !           382: Initially, the left margin has zero width.
        !           383: The indentation is increased by an increase-indentation
        !           384: and decreased again by a decrease-indentation.
        !           385: These always come in pairs and serve for grouping, just as BEGIN-END pairs
        !           386: do in other programming languages.
        !           387: An increase-indentation is always preceded by a line ending with a colon
        !           388: (possibly followed by comment).
        !           389: .Pr comment 3
        !           390: .Al
        !           391: optional-new-line-proper\0optional-spaces
        !           392: \*(<:\\\*(:> comment-body\0optional-further-comment
        !           393: .Pr further-comment 3
        !           394: .Al
        !           395: new-line-proper\0optional-spaces
        !           396: \*(<:\\\*(:> comment-body\0optional-further-comment
        !           397: .Pr spaces 2
        !           398: .Sl
        !           399: space\0optional-spaces
        !           400: .Ps
        !           401: Comments may be placed at the end of a line or may stand alone
        !           402: on a line.
        !           403: No comment may precede the first line of a unit (see section 4).
        !           404: .br
        !           405: A comment-body may be any sequence of printable characters.
        !           406: .Sx 2 comment:
        !           407: \*(<:\\modified 6/4/84 to reject passwords of length < 6\*(:>
        !           408: .Tx
        !           409: Keywords are composed of CAPITAL letters (\*(<:A\*(:> to \*(<:Z\*(:>), digits,
        !           410: and quotes (\*(<:'\*(:> and \*(<:"\*(:>).
        !           411: A keyword must start with a letter.
        !           412: For example, \*(<:A3'B"\*(:> is a keyword.
        !           413: .Tx
        !           414: Tags are composed of lower-case letters (\*(<:a\*(:> to \*(<:z\*(:>), digits, 
        !           415: and quotes (\*(<:'\*(:> and \*(<:"\*(:>).
        !           416: A tag must start with a letter.
        !           417: For example, \*(<:a3'b"\*(:> is a tag.
        !           418: .Tx
        !           419: Some other signs are composite: \*(<:..\*(:>, \*(<:**\*(:>, \*(<:*/\*(:>, \*(<:/*\*(:>, \*(<:^^\*(:>,
        !           420: \*(<:<<\*(:>, \*(<:><\*(:>, \*(<:>>\*(:>, \*(<:<=\*(:>, \*(<:<>\*(:> and \*(<:>=\*(:>.
        !           421: Spaces are freely allowed between symbols, but not
        !           422: within keywords, tags,  numeric-constants and composite signs.
        !           423: Sometimes spaces are required to separate keywords and tags from following
        !           424: symbols.
        !           425: For example, \*(<:cos y\*(:> is not the same as \*(<:cosy\*(:>: the latter is
        !           426: taken to be one tag.
        !           427: .St 4 UNITS 
        !           428: .Xx work-space
        !           429: .Sy  4
        !           430: .Pr unit 4
        !           431: .Al
        !           432: how-to-unit
        !           433: .Al
        !           434: yield-unit
        !           435: .Al
        !           436: test-unit
        !           437: .Ps
        !           438: Units are the building blocks of a \*B ``program''.
        !           439: Users can define new commands, functions and predicates by writing a unit.
        !           440: These units reside in a work-space.
        !           441: .Pr refinement-suite 2
        !           442: .Al
        !           443: new-line\0refinement\0optional-refinement-suite
        !           444: .Ps
        !           445: When writing a unit, the specification of some parts
        !           446: (commands, expressions and tests) may be deferred by
        !           447: using a ``refinement''.
        !           448: These refinements are then specified at the end of the unit.
        !           449: .Se 3  4.1 HOW-TO-UNITS
        !           450: .Xx keyword
        !           451: .Xx user-defined-command
        !           452: .Sy  3
        !           453: .Pr how-to-unit 3
        !           454: .Al
        !           455: \*(<:HOW'TO\*(:> formal-user-defined-command\*(<::\*(:>
        !           456: .br
        !           457: command-suite
        !           458: .br
        !           459: optional-refinement-suite
        !           460: .Pr formal-user-defined-command 2
        !           461: .Sl
        !           462: keyword\0optional-formal-tail
        !           463: .Ps 
        !           464: The first keyword of a formal-user-defined-command must be unique, i.e.,
        !           465: different from the first keywords of all predefined and other
        !           466: user-defined commands.
        !           467: So it is impossible to redefine the built-in commands of \*B.
        !           468: It may also not be \*(<:HOW'TO\*(:>, \*(<:YIELD\*(:>, \*(<:TEST\*(:>, \*(<:SHARE\*(:> or \*(<:ELSE\*(:>.
        !           469: Otherwise, it may be chosen freely.
        !           470: There are no restrictions on the second and further keywords.
        !           471: .Pr formal-tail 3
        !           472: .Al
        !           473: formal-parameter\0optional-formal-trailer
        !           474: .Al
        !           475: formal-trailer
        !           476: .Pr formal-trailer 2
        !           477: .Sl
        !           478: keyword\0optional-formal-tail
        !           479: .Pr formal-parameter 1
        !           480: .Sl
        !           481: tag
        !           482: .Ps
        !           483: Note that, although actual-parameters (section 5.1.16)
        !           484: and formal-operands (section 4.2) may be composite,
        !           485: formal-parameters must be simple tags.
        !           486: .Sx 5 \k1how-to-unit:
        !           487: \*(<:HOW'TO PUSH value ON stack:
        !           488:     PUT value IN stack[#stack+1]\*(:>
        !           489: .Tx
        !           490: A how-to-unit defines the meaning of a new command
        !           491: (see ``user-defined-commands'', section 5.1.16).
        !           492: The above unit defines a \*(<:PUSH\*(:>\ ...\ \*(<:ON\*(:>\ ... command.
        !           493: Once the command has been defined, it may be used in the
        !           494: same way as the built-in commands.
        !           495: Other user-defined commands may be used in the body of a unit
        !           496: even if they have not yet been defined,
        !           497: though they must be defined by the time the unit is invoked.
        !           498: .Xe
        !           499: .Sa
        !           500: quit-command (5.1.11),
        !           501: share-heading (4.5),
        !           502: user-defined-commands (5.1.16).
        !           503: .Se 3  4.2 YIELD-UNITS
        !           504: .Xx "overloading of functions and predicates"
        !           505: .Xx user-defined functions
        !           506: .Xx formula
        !           507: .Xx function
        !           508: .Xx predicate
        !           509: .Xx zeroadic
        !           510: .Xx monadic
        !           511: .Xx dyadic
        !           512: .Sy  3
        !           513: .Pr yield-unit 3
        !           514: .Al
        !           515: \*(<:YIELD\*(:> formal-formula\*(<::\*(:>
        !           516: .br
        !           517: command-suite
        !           518: .br
        !           519: optional-refinement-suite
        !           520: .Pr formal-formula 4
        !           521: .Al
        !           522: formal-zeroadic-formula
        !           523: .Al
        !           524: formal-monadic-formula
        !           525: .Al
        !           526: formal-dyadic-formula
        !           527: .Pr formal-zeroadic-formula 2
        !           528: .Sl
        !           529: zeroadic-function
        !           530: .Pr formal-monadic-formula 2
        !           531: .Sl
        !           532: monadic-function\0formal-operand
        !           533: .Pr formal-dyadic-formula 2
        !           534: .Al
        !           535: formal-operand\0dyadic-function\0formal-operand
        !           536: .Ps 
        !           537: Functions must not be ``overloaded'' (multiply defined),
        !           538: and a user-defined function must be represented by a tag.
        !           539: However, a given tag may be used, at the same time, for
        !           540: a dyadic-function and either a zeroadic- or a monadic-function or -predicate.
        !           541: (In other words, you may not have a function that is both monadic
        !           542: and zeroadic, for otherwise it would be impossible to decide what was meant
        !           543: in cases such as \*(<:f + 1\*(:>,
        !           544: where \*(<:f\*(:> could be either zeroadic or monadic, and the restrictions
        !           545: also apply to combinations of functions and predicates.)
        !           546: .Pr formal-operand 2
        !           547: .Sl
        !           548: single-identifier
        !           549: .Sx 5 \k1yield-unit:
        !           550: \*(<:YIELD (a, b) over (c, d):
        !           551:     PUT c*c+d*d IN rr
        !           552:     RETURN (a*c+b*d)/rr, (-a*d+b*c)/rr\*(:>
        !           553: .Xe
        !           554: .Tx
        !           555: A yield-unit defines the meaning of a new function
        !           556: (see ``Formulas with user-defined functions'', section 6.1.6).
        !           557: The example given above defines complex division.
        !           558: (Complex numbers are not a built-in type of \*B.)
        !           559: .br
        !           560: Functions may be zeroadic (no operands), monadic (one trailing operand)
        !           561: or dyadic (two operands, one at the left and one at the right).
        !           562: .Sa
        !           563: return-commands (5.1.12),
        !           564: share-headings (4.5),
        !           565: formulas with user-defined functions (6.1.6).
        !           566: .Se 3  4.3 TEST-UNITS
        !           567: .Xx "overloading of functions and predicates"
        !           568: .Xx user-defined-predicates
        !           569: .Xx test
        !           570: .Xx formula
        !           571: .Xx function
        !           572: .Xx predicate
        !           573: .Xx proposition
        !           574: .Xx zeroadic
        !           575: .Xx monadic
        !           576: .Xx dyadic
        !           577: .Sy  3
        !           578: .Pr test-unit 3
        !           579: .Al
        !           580: \*(<:TEST\*(:> formal-proposition\*(<::\*(:>
        !           581: .br
        !           582: command-suite
        !           583: .br
        !           584: optional-refinement-suite
        !           585: .Pr formal-proposition 4
        !           586: .Al
        !           587: formal-zeroadic-proposition
        !           588: .Al
        !           589: formal-monadic-proposition
        !           590: .Al
        !           591: formal-dyadic-proposition
        !           592: .Pr formal-zeroadic-proposition 2
        !           593: .Sl
        !           594: zeroadic-predicate
        !           595: .Pr formal-monadic-proposition 2
        !           596: .Al
        !           597: monadic-predicate\0formal-operand
        !           598: .Pr formal-dyadic-proposition 2
        !           599: .Al
        !           600: formal-operand\0dyadic-predicate\0formal-operand
        !           601: .Ps 
        !           602: Like functions, predicates must not be ``overloaded'',
        !           603: though a given tag may be used, at the same time, for
        !           604: a dyadic-predicate and either a zeroadic- or a monadic-function or -predicate.
        !           605: .Sx 5 \k1test-unit:
        !           606: \*(<:TEST a subset b:
        !           607:     REPORT EACH x IN a HAS x in b\*(:>
        !           608: .Xe
        !           609: .Tx
        !           610: A test-unit defines the meaning of a new predicate
        !           611: (see ``Propositions with user-defined predicates'', section 6.3.2).
        !           612: Like functions, predicates may be zeroadic, monadic or dyadic.
        !           613: .br
        !           614: Tests do not return a value, but succeed or fail via the \*(<:REPORT\*(:>,
        !           615: \*(<:SUCCEED\*(:> and \*(<:FAIL\*(:> commands.
        !           616: .Sa
        !           617: report-commands (5.1.13),
        !           618: succeed-command (5.1.14),
        !           619: fail-command (5.1.15),
        !           620: share-headings (4.5),
        !           621: propositions with user-defined predicates (6.3.2).
        !           622: .Se 4  4.4 REFINEMENTS
        !           623: .Xx keyword
        !           624: .Sy  4
        !           625: .Pr refinement 4
        !           626: .Al
        !           627: command-refinement
        !           628: .Al
        !           629: expression-refinement
        !           630: .Al
        !           631: test-refinement
        !           632: .Pr command-refinement 2
        !           633: .Sl
        !           634: keyword\*(<::\*(:> command-suite
        !           635: .Ps
        !           636: The keyword of a command-refinement must be different from the first keywords
        !           637: of all predefined commands,
        !           638: and it may also not be \*(<:HOW'TO\*(:>, \*(<:YIELD\*(:>, \*(<:TEST\*(:>, \*(<:SHARE\*(:> or \*(<:ELSE\*(:>.
        !           639: It may, however, be the same as the first keyword of a user-defined-command.
        !           640: .Sx 4 \k1command-refinement:
        !           641: \*(<:SELECT'TASK:
        !           642:     PUT min tasks IN task
        !           643:     REMOVE task FROM tasks\*(:>
        !           644: .Pr expression-refinement 2
        !           645: .Sl
        !           646: tag\*(<::\*(:> command-suite
        !           647: .Sx 4 expression-refinement:
        !           648: \*(<:stack'pointer:
        !           649:     IF stack = {}: RETURN 0
        !           650:     RETURN max keys stack\*(:>
        !           651: .Pr test-refinement 2
        !           652: .Sl
        !           653: tag\*(<::\*(:> command-suite
        !           654: .Sx 4 test-refinement:
        !           655: \*(<:special'case:
        !           656:     REPORT position+d = line'length\*(:>
        !           657: .Xe
        !           658: .Tx
        !           659: Refinements support the method of ``top-down'' programming, also
        !           660: known as programming by ``stepwise refinement''.
        !           661: The body of a unit may be written using refined-commands, -expressions
        !           662: and -tests that reflect the appropriate, coarse-grained, level of
        !           663: abstraction for expressing the algorithmic intention.
        !           664: In subsequent refinements, these may be refined to
        !           665: the necessary detail, possibly in several steps.
        !           666: As with units, there are three kinds of refinements.
        !           667: The differences with units are:
        !           668: .in (\w'\(em\ 'u+3m)u
        !           669: .ti 3m
        !           670: \(em\ refinements are bound to a unit and may not be invoked
        !           671: from other units;
        !           672: .ti 3m
        !           673: \(em\ all tags known inside the unit are also known inside the
        !           674: refinement;
        !           675: .ti 3m
        !           676: \(em\ no parameters or operands can be passed when the
        !           677: refinement is invoked.
        !           678: .in 0
        !           679: {{Currently, refinements may only occur within unit bodies, and not
        !           680: in ``immediate commands''.}}
        !           681: .Sa
        !           682: refined-commands (5.1.17),
        !           683: refined-expressions (6.1.7),
        !           684: refined-tests (6.3.3).
        !           685: .Se 4  4.5 COMMAND-SUITES
        !           686: .Xx target
        !           687: .Xx local
        !           688: .Xx global
        !           689: .Xx work-space
        !           690: .Xx permanent environment
        !           691: .Xx yield-unit
        !           692: .Xx expression-refinement
        !           693: .Xx return-command
        !           694: .Xx test-unit
        !           695: .Xx test-refinement
        !           696: .Xx report-command
        !           697: .Xx succeed-command
        !           698: .Xx fail-command
        !           699: .Sy  4
        !           700: .Pr command-suite 4
        !           701: .Al
        !           702: simple-command
        !           703: .Al
        !           704: increase-indentation\0optional-share-heading
        !           705: optional-command-sequence\0decrease-indentation
        !           706: .Ps
        !           707: A command-suite may only follow the preceding colon on the same line
        !           708: if it is a simple-command.
        !           709: Otherwise, it starts on a new line, with
        !           710: all lines of the command-suite indented.
        !           711: .Sx 4 command-suite
        !           712: \*(<:SHARE name'list, abbreviation'table
        !           713: IF name in keys abbreviation'table:
        !           714:     PUT abbreviation'table[name] IN name
        !           715: IF name not'in name'list:
        !           716:     INSERT name IN name'list\*(:>
        !           717: .Xe
        !           718: .Pr share-heading 3
        !           719: .Al
        !           720: new-line \*(<:SHARE\*(:> identifier\0optional-share-heading
        !           721: .Ps 
        !           722: Tags used as targets (variables) in a unit
        !           723: (except those that are formal-parameters)
        !           724: are by default local to the unit.
        !           725: If a target should be shared between several units,
        !           726: this can be indicated by listing the tag
        !           727: in a share-heading at the start of the unit body.
        !           728: It stands then for a global target of the work-space.
        !           729: The global targets together with their contents are also called the ``permanent
        !           730: environment'', because they survive on logging out.
        !           731: .br
        !           732: A share-heading may only occur in the command-suite of a unit (and not
        !           733: of a refinement or compound-command).
        !           734: .Sx 2 share-heading
        !           735: \*(<:SHARE name'list, abbreviation'table\*(:>
        !           736: .Xe
        !           737: .Pr command-sequence 2
        !           738: .Al
        !           739: new-line\0command\0optional-command-sequence
        !           740: .Ps 
        !           741: The execution of the command-suite of a yield-unit or
        !           742: expression-refinement must end in a return-command, and return-commands
        !           743: may only occur within such command-suites.
        !           744: .Ps 
        !           745: The execution of the command-suite of a test-unit or
        !           746: test-refinement must end in a report-, succeed- or fail-command, and these
        !           747: may only occur within such command-suites.
        !           748: .Sx 3 command-sequence
        !           749: \*(<:IF name in keys abbreviation'table:
        !           750:     PUT abbreviation'table[name] IN name
        !           751: IF name not'in name'list:
        !           752:     INSERT name IN name'list\*(:>
        !           753: .Xe
        !           754: .St 5 COMMANDS
        !           755: .Xx immediate command
        !           756: .Xx global
        !           757: .Xx interrupt key
        !           758: .Tx
        !           759: Commands may be given as ``immediate commands'', directly from
        !           760: the terminal, or may be part of a unit.
        !           761: If commands are given as immediate commands, they are obeyed
        !           762: directly.
        !           763: Any targets in the command are then interpreted as global targets
        !           764: from the permanent environment.
        !           765: Within a unit, targets are local, unless they have been listed
        !           766: in a share-heading (see above).
        !           767: .br
        !           768: If the user presses the interrupt key while a command is executing,
        !           769: execution is aborted, and the user is prompted for another immediate command.
        !           770: .Sy  3
        !           771: .Pr command 3
        !           772: .Al
        !           773: simple-command
        !           774: .Al
        !           775: control-command
        !           776: .Se 3  5.1 SIMPLE-COMMANDS
        !           777: .Sy  3
        !           778: .Pr simple-command 3
        !           779: .Al
        !           780: check-command
        !           781: .Al
        !           782: write-command
        !           783: .Al
        !           784: read-command
        !           785: .Al
        !           786: put-command
        !           787: .Al
        !           788: draw-command
        !           789: .Al
        !           790: choose-command
        !           791: .Al
        !           792: set-random-command
        !           793: .Al
        !           794: remove-command
        !           795: .Al
        !           796: insert-command
        !           797: .Al
        !           798: delete-command
        !           799: .Al
        !           800: terminating-command
        !           801: .Al
        !           802: user-defined-command
        !           803: .Al
        !           804: refined-command
        !           805: .Pr terminating-command 3
        !           806: .Al
        !           807: quit-command
        !           808: .Al
        !           809: return-command
        !           810: .Al
        !           811: report-command
        !           812: .Al
        !           813: succeed-command
        !           814: .Al
        !           815: fail-command
        !           816: .Se 2  5.1.1 CHECK-COMMANDS
        !           817: .Sy  2
        !           818: .Pr check-command 2
        !           819: .Sl
        !           820: \*(<:CHECK\*(:> test
        !           821: .Sx 3 \k1check-command:
        !           822: \*(<:CHECK i >= 0 AND j >= 0 AND i+j <= n\*(:>
        !           823: .Xe
        !           824: .Tx
        !           825: When a check-command is executed, its test is tested.
        !           826: If the test fails, an error is reported and execution halts.
        !           827: Otherwise, no message is given and execution continues.
        !           828: Check-commands may be used, for example, to check the requirements of
        !           829: parameters or operands on entry to a unit.
        !           830: The liberal use of check-commands helps to get programs correct quickly.
        !           831: .Se 3  5.1.2 WRITE-COMMANDS
        !           832: .Xx convert to a text
        !           833: .Xx permanent environment
        !           834: .Xx interrupt key
        !           835: .Sy  3
        !           836: .Pr write-command 3
        !           837: .Al
        !           838: \*(<:WRITE\*(:> new-liners
        !           839: .Al
        !           840: \*(<:WRITE\*(:> optional-new-liners\0expression\0optional-new-liners
        !           841: .Pr new-liners 2
        !           842: .Sl
        !           843: \*(<:/\*(:> optional-new-liners
        !           844: .Ex 3
        !           845: \k1write-commands:
        !           846: \h'|\n1u'\*(<:WRITE //\*(:>
        !           847: \h'|\n1u'\*(<:WRITE // 'Give a value in the range 1 through `n`: '\*(:>
        !           848: .Tx
        !           849: The expression is converted to a text and written to the screen.
        !           850: Each \*(<:/\*(:> gives a transition to a new line.
        !           851: Note that you write no comma before or after the \*(<:/\*(:>s.
        !           852: .br
        !           853: With the exception of adjacent texts,
        !           854: values that are adjacent are written separated by a space.
        !           855: Compounds within other values (within lists, tables or other compounds)
        !           856: are written with commas between their fields,
        !           857: and where necessary, the whole surrounded by brackets.
        !           858: Similarly, inner texts are written enclosed by quotes.
        !           859: Compounds and texts not within other values are output without commas,
        !           860: brackets and quotes.
        !           861: Thus,
        !           862: .Di 2
        !           863: \*(<:WRITE 0, 1, ',', 2, '!', '!', 3
        !           864: WRITE {1; 2}, {['a','b']:('b','a'); ['b','a']:('a','b')} /\*(:>
        !           865: .Ed
        !           866: gives
        !           867: .Di 1
        !           868: \*(<:0 1 , 2 !! 3 {1; 2} {['a', 'b']: ('b', 'a'); ['b', 'a']: ('a', 'b')}\*(:>
        !           869: .Ed
        !           870: For formatting purposes, see the operators \*(<:>>\*(:>, \*(<:<<\*(:>, and \*(<:><\*(:>
        !           871: in section 6.1.6, ``Functions on Texts'',
        !           872: and the conversions in text-displays in section 6.1.5, ``Displays''.
        !           873: .Se 3  5.1.3 READ-COMMANDS
        !           874: .Sy  3
        !           875: .Pr read-command 4
        !           876: .Al
        !           877: \*(<:READ\*(:> target \*(<:EG\*(:> expression
        !           878: .Al
        !           879: \*(<:READ\*(:> target \*(<:RAW\*(:>
        !           880: .Ex 3
        !           881: read-commands:
        !           882: \*(<:READ n, s EG 0, ''
        !           883: READ line RAW\*(:>
        !           884: .Xe
        !           885: .Tx
        !           886: The execution of a read-command prompts the user
        !           887: to supply one input line.
        !           888: .br
        !           889: If an \*(<:EG\*(:> part is present, the input is interpreted as an
        !           890: \fIexpression\fP of the same type as the expression following \*(<:EG\*(:>.
        !           891: (Usually, the example expression will consist of constants,
        !           892: but other expressions are also allowed.)
        !           893: The input expression is evaluated in the permanent environment
        !           894: (so local tags of units cannot be used) and put in the target.
        !           895: To input a text-display (literal), text quotes are required.
        !           896: .br
        !           897: If \*(<:RAW\*(:> is specified, the target must be a text target.
        !           898: The input line is put in the target literally.
        !           899: No text quotes are needed.
        !           900: .br
        !           901: If the user presses the interrupt key instead of supplying a value,
        !           902: the read-command, and in fact the whole program, is aborted.
        !           903: This is useful for entering a sequence of data of unspecified length.
        !           904: .Se 3  5.1.4 PUT-COMMANDS
        !           905: .Xx target
        !           906: .Xx location
        !           907: .Xx type
        !           908: .Sy  3
        !           909: .Pr put-command 3
        !           910: .Sl
        !           911: \*(<:PUT\*(:> expression \*(<:IN\*(:> target
        !           912: .Sx 3 \k1put-command:
        !           913: \*(<:PUT a+1, ({}, {1..a}) IN a, b\*(:>
        !           914: .Xe
        !           915: .Tx
        !           916: The value of the expression is put in the target.
        !           917: This means that the value will be held in a location
        !           918: for the target, until a different value is put in the target,
        !           919: or the target is deleted.
        !           920: If no such location exists already, it is created on
        !           921: the spot.
        !           922: Here, as in other cases, the types must agree.
        !           923: {{This is currently not checked in general.}}
        !           924: See also the sections on various kinds of targets below (section 6.2).
        !           925: .Se 2  5.1.5 DRAW-COMMANDS
        !           926: .Xx random
        !           927: .Xx number
        !           928: .Sy  2
        !           929: .Pr draw-command 2
        !           930: .Sl
        !           931: \*(<:DRAW\*(:> target
        !           932: .Sx 3 \k1draw-command:
        !           933: \*(<:DRAW r\*(:>
        !           934: .Xe
        !           935: .Tx
        !           936: A random approximate number
        !           937: (from \*(<:~0\*(:> up to, but not including, \*(<:~1\*(:>)
        !           938: is drawn and put in the target.
        !           939: .Se 4  5.1.6 CHOOSE-COMMANDS
        !           940: .Xx text, list or table
        !           941: .Xx random
        !           942: .Xx character
        !           943: .Xx list entry
        !           944: .Xx associate
        !           945: .Sy  4
        !           946: .Pr choose-command 4
        !           947: .Sl
        !           948: \*(<:CHOOSE\*(:> target \*(<:FROM\*(:> expression
        !           949: .Sx 3 \k1choose-command:
        !           950: \*(<:CHOOSE exit FROM exits[current'room]\*(:>
        !           951: .Xe
        !           952: .Tx
        !           953: The expression must have a text, list or table as value.
        !           954: This value must not be empty.
        !           955: An item is drawn at random from the value
        !           956: (characters from a text, entries from a list and associates
        !           957: from a table)
        !           958: and put in the target.
        !           959: The item is not removed from the value.
        !           960: .Se 2  5.1.7 SET-RANDOM-COMMANDS
        !           961: .Xx random
        !           962: .Sy  2
        !           963: .Pr set-random-command 2
        !           964: .Sl
        !           965: \*(<:SET'RANDOM\*(:> expression
        !           966: .Sx 3 \k1set-random-command:
        !           967: \*(<:SET'RANDOM 'Monte Carlo', run\*(:>
        !           968: .Xe
        !           969: .Tx
        !           970: The (pseudo-)random sequence
        !           971: used for draw- and choose-commands
        !           972: is reset to a point, depending on the
        !           973: value of the expression.
        !           974: .Se 3  5.1.8 REMOVE-COMMANDS
        !           975: .Xx list entry
        !           976: .Sy  3
        !           977: .Pr remove-command 3
        !           978: .Sl
        !           979: \*(<:REMOVE\*(:> expression \*(<:FROM\*(:> target
        !           980: .Sx 3 \k1remove-command:
        !           981: \*(<:REMOVE task FROM tasks\*(:>
        !           982: .Xe
        !           983: .Tx
        !           984: The target must hold a list, and the value of the expression must be
        !           985: an entry of that list.
        !           986: The entry is removed.
        !           987: If it was present more than once, only one instance is removed.
        !           988: .Se 3  5.1.9 INSERT-COMMANDS
        !           989: .Xx list entry
        !           990: .Sy  3
        !           991: .Pr insert-command 3
        !           992: .Sl
        !           993: \*(<:INSERT\*(:> expression \*(<:IN\*(:> target
        !           994: .Sx 3 \k1insert-command:
        !           995: \*(<:INSERT new'task IN tasks\*(:>
        !           996: .Xe
        !           997: .Tx
        !           998: The target must hold a list.
        !           999: The value of the expression is inserted as a list entry.
        !          1000: If that entry was already present, one more instance will be present.
        !          1001: .Se 2  5.1.10 DELETE-COMMANDS
        !          1002: .Xx location
        !          1003: .Xx table entry
        !          1004: .Xx table-selection-target
        !          1005: .Sy  2
        !          1006: .Pr delete-command 2
        !          1007: .Sl
        !          1008: \*(<:DELETE\*(:> target
        !          1009: .Sx 3 \k1delete-command:
        !          1010: \*(<:DELETE t[i], u[i, j]\*(:>
        !          1011: .Xe
        !          1012: .Tx
        !          1013: The location for the target ceases to exist.
        !          1014: If a multiple-target is given, all its single-targets are deleted.
        !          1015: If a table-selection-target is given, the table must contain the key
        !          1016: that is used as selector.
        !          1017: The table entry with that key is then deleted from the table.
        !          1018: It is an error to delete a trimmed-text-target (e.g., \*(<:t@2\*(:>).
        !          1019: .Se 2  5.1.11 QUIT-COMMAND
        !          1020: .Xx how-to-unit
        !          1021: .Xx command-refinement
        !          1022: .Xx immediate-command
        !          1023: .Xx permanent environment
        !          1024: .Sy  2
        !          1025: .Pr quit-command 2
        !          1026: .Sl
        !          1027: \*(<:QUIT\*(:>
        !          1028: .Ps 
        !          1029: A quit-command may only occur in the command-suite of a
        !          1030: how-to-unit or command-refinement, or as an immediate command.
        !          1031: .Sx 3 \k1quit-command:
        !          1032: \*(<:QUIT\*(:>
        !          1033: .Xe
        !          1034: .Tx
        !          1035: The execution of a quit-command causes the termination of the execution
        !          1036: of the how-to-unit or command-refinement in whose command-suite
        !          1037: it occurs.
        !          1038: If it occurs in a command-refinement, the execution of
        !          1039: the invoking refined-command is thereby terminated and the further
        !          1040: execution continues as if the refined-command had terminated normally.
        !          1041: Otherwise, the execution of
        !          1042: the invoking user-defined-command is terminated and the further
        !          1043: execution continues similarly.
        !          1044: .br
        !          1045: Given as an immediate command, \*(<:QUIT\*(:> terminates the current
        !          1046: session.
        !          1047: All units and targets in the permanent environment
        !          1048: survive and can be used again at the next session.
        !          1049: .Se 2  5.1.12 RETURN-COMMANDS
        !          1050: .Xx expression-refinement
        !          1051: .Xx user-defined-function
        !          1052: .Xx refined-expression
        !          1053: .Xx yield-unit
        !          1054: .Sy  2
        !          1055: .Pr return-command 2
        !          1056: .Sl
        !          1057: \*(<:RETURN\*(:> expression
        !          1058: .Sx 3 \k1return-command:
        !          1059: \*(<:RETURN (a*c+b*d)/rr, (-a*d+b*c)/rr\*(:>
        !          1060: .Xe
        !          1061: .Tx
        !          1062: The execution of a return-command causes the termination of the execution
        !          1063: of the yield-unit or expression-refinement in whose command-suite
        !          1064: it occurs.
        !          1065: The value of the expression is returned as the value of the invoking
        !          1066: user-defined function or refined-expression.
        !          1067: Return-commands may only occur within the command-suite of a
        !          1068: yield-unit or expression-refinement.
        !          1069: .Se 2  5.1.13 REPORT-COMMANDS
        !          1070: .Xx test-unit
        !          1071: .Xx test-refinement
        !          1072: .Xx user-defined-predicate
        !          1073: .Xx refined-test
        !          1074: .Xx bound tags
        !          1075: .Pr report-command 2
        !          1076: .Sl
        !          1077: \*(<:REPORT\*(:> test
        !          1078: .Sx 3 \k1report-command:
        !          1079: \*(<:REPORT i in keys t\*(:>
        !          1080: .Xe
        !          1081: .Tx
        !          1082: The execution of a report-command causes the termination of the execution
        !          1083: of the test-unit or test-refinement in whose command-suite
        !          1084: it occurs.
        !          1085: The invoking user-defined predicate or refined-test
        !          1086: succeeds/fails if the test of the report-command succeeds/fails.
        !          1087: If the invoker is a test-refinement,
        !          1088: any bound tags set by a for-command (see section 5.2.4) or
        !          1089: a quantification (section 6.3.7) will temporarily survive,
        !          1090: as described under REFINED-TESTS (section 6.3.3).
        !          1091: .br
        !          1092: Report-commands may only occur within the command-suite of a
        !          1093: test-unit or test-refinement.
        !          1094: .br
        !          1095: The command ``\*(<:REPORT\*(:> test'' is equivalent to
        !          1096: .Di 3
        !          1097: \*(<:SELECT:
        !          1098:     \*(:>test\*(<:: SUCCEED
        !          1099:     ELSE: FAIL\*(:>
        !          1100: .Ed
        !          1101: .Se 2  5.1.14 SUCCEED-COMMAND
        !          1102: .Xx test-unit
        !          1103: .Xx test-refinement
        !          1104: .Xx user-defined-predicate
        !          1105: .Xx refined-test
        !          1106: .Xx bound tags
        !          1107: .Sy  2
        !          1108: .Pr succeed-command 2
        !          1109: .Sl
        !          1110: \*(<:SUCCEED\*(:>
        !          1111: .Sx 3 \k1succeed-command:
        !          1112: \*(<:SUCCEED\*(:>
        !          1113: .Xe
        !          1114: .Tx
        !          1115: The execution of a succeed-command causes the termination of the execution
        !          1116: of the test-unit or test-refinement in whose command-suite
        !          1117: it occurs.
        !          1118: The invoking user-defined predicate or refined-test succeeds.
        !          1119: As with report-commands, bound tags temporarily survive.
        !          1120: .br
        !          1121: Succeed-commands may only occur within the command-suite of a
        !          1122: test-unit or test-refinement.
        !          1123: .br
        !          1124: The command \*(<:SUCCEED\*(:> is equivalent to \*(<:REPORT 0 = 0\*(:>.
        !          1125: .Se 2  5.1.15 FAIL-COMMAND
        !          1126: .Xx test-unit
        !          1127: .Xx test-refinement
        !          1128: .Xx user-defined-predicate
        !          1129: .Xx refined-test
        !          1130: .Xx bound tags
        !          1131: .Sy  2
        !          1132: .Pr fail-command 2
        !          1133: .Sl
        !          1134: \*(<:FAIL\*(:>
        !          1135: .Sx 3 \k1fail-command:
        !          1136: \*(<:FAIL\*(:>
        !          1137: .Xe
        !          1138: .Tx
        !          1139: The execution of a fail-command causes the termination of the execution
        !          1140: of the test-unit or test-refinement in whose command-suite
        !          1141: it occurs.
        !          1142: The invoking user-defined predicate or refined-test fails.
        !          1143: As with report-commands, bound tags temporarily survive.
        !          1144: .br
        !          1145: Fail-commands may only occur within the command-suite of a
        !          1146: test-unit or test-refinement.
        !          1147: .br
        !          1148: The command \*(<:FAIL\*(:> is equivalent to \*(<:REPORT 0 = 1\*(:>.
        !          1149: .Se 2  5.1.16 USER-DEFINED-COMMANDS
        !          1150: .Xx keyword
        !          1151: .Xx how-to-unit
        !          1152: .Xx quit-command
        !          1153: .Sy  2
        !          1154: .Pr user-defined-command 2
        !          1155: .Sl
        !          1156: keyword\0optional-actual-parameter\0optional-trailer
        !          1157: .Pr trailer 2
        !          1158: .Sl
        !          1159: keyword\0optional-actual-parameter\0optional-trailer
        !          1160: .Pr actual-parameter 2
        !          1161: .Al
        !          1162: identifier
        !          1163: .Al
        !          1164: target
        !          1165: .Al
        !          1166: expression
        !          1167: .Ps 
        !          1168: The keywords and actual-parameters must correspond one to one to those
        !          1169: of the formal-user-defined-command of one unique how-to-unit.
        !          1170: .Ex 6
        !          1171: \k1user-defined-commands:
        !          1172: \h'|\n1u'\*(<:CLEAN'UP\*(:>
        !          1173: \h'|\n1u'\*(<:DRINK me\*(:>
        !          1174: \h'|\n1u'\*(<:TURN a UPSIDE DOWN\*(:>
        !          1175: \h'|\n1u'\*(<:PUSH v ON operand'stack\*(:>
        !          1176: .Xe
        !          1177: .Tx
        !          1178: A user-defined-command is executed in the following steps:
        !          1179: .in \w'2.\ 'u
        !          1180: .ti 0
        !          1181: 1.\ Any local tags in the how-to-unit that might clash with tags currently
        !          1182: in use are systematically replaced by other tags that do not cause conflict.
        !          1183: .ti 0
        !          1184: 2.\ Each actual-parameter is placed between parentheses \*(<:(\*(:> and \*(<:)\*(:>
        !          1185: and then
        !          1186: substituted throughout the unit for the corresponding formal-parameter.
        !          1187: .ti 0
        !          1188: 3.\ The command-suite of the unit, thus modified, is executed.
        !          1189: .in 0
        !          1190: The execution of the user-defined-command is complete when the execution
        !          1191: of this command-suite terminates (normally, or because of the execution
        !          1192: of a quit-command).
        !          1193: After the execution is complete,
        !          1194: the local tags of the unit are no longer accessible.
        !          1195: .Se 2  5.1.17 REFINED-COMMANDS
        !          1196: .Xx keyword
        !          1197: .Xx command-refinement
        !          1198: .Xx quit-command
        !          1199: .Sy  2
        !          1200: .Pr refined-command 2
        !          1201: .Sl
        !          1202: keyword
        !          1203: .Ps 
        !          1204: The keyword of a refined-command must occur as the keyword of one
        !          1205: command-refinement in the unit
        !          1206: in which it occurs.
        !          1207: That command-refinement specifies the meaning of the refined-command.
        !          1208: .Sx 3 \k1refined-command:
        !          1209: \*(<:REMOVE'MULTIPLES\*(:>
        !          1210: .Xe
        !          1211: .Tx
        !          1212: A refined-command is executed by executing
        !          1213: the command-suite of the corresponding command-refinement.
        !          1214: The execution of the refined-command is complete when the execution
        !          1215: of this command-suite terminates
        !          1216: (normally, or because of the execution of a quit-command).
        !          1217: .Se 5  5.2 CONTROL-COMMANDS
        !          1218: .Sy  5
        !          1219: .Pr control-command 5
        !          1220: .Al
        !          1221: if-command
        !          1222: .Al
        !          1223: select-command
        !          1224: .Al
        !          1225: while-command
        !          1226: .Al
        !          1227: for-command
        !          1228: .Se 2  5.2.1 IF-COMMANDS
        !          1229: .Sy  2
        !          1230: .Pr if-command 2
        !          1231: .Sl
        !          1232: \*(<:IF\*(:> test\*(<::\*(:> command-suite
        !          1233: .Sx 3 \k1if-command:
        !          1234: \*(<:IF i < 0: PUT -i, -j IN i, j\*(:>
        !          1235: .Xe
        !          1236: .Tx
        !          1237: The test is tested.
        !          1238: If it succeeds, the command-suite is executed;
        !          1239: if it fails, the command-suite is not executed.
        !          1240: .br
        !          1241: (If something should be executed on failure too, or there are
        !          1242: more alternatives, you should use a select-command instead.)
        !          1243: .br
        !          1244: The command
        !          1245: ``\*(<:IF\*(:> test\*(<::\*(:> command-suite''
        !          1246: is equivalent to:
        !          1247: .Di 3
        !          1248: \*(<:SELECT:
        !          1249:     \*(:>test\*(<:: \*(:>command-suite\*(<:
        !          1250:     ELSE: \\do nothing.\*(:>
        !          1251: .Ed
        !          1252: .Se 2  5.2.2 SELECT-COMMANDS
        !          1253: .Sy  2
        !          1254: .Pr select-command 2
        !          1255: .Sl
        !          1256: \*(<:SELECT:\*(:> alternative-suite
        !          1257: .Pr alternative-suite 3
        !          1258: .Al
        !          1259: increase-indentation\0new-line\0alternative-sequence\0decrease-indentation
        !          1260: .Pr alternative-sequence 4
        !          1261: .Al
        !          1262: single-alternative
        !          1263: .Al
        !          1264: else-alternative
        !          1265: .Al
        !          1266: single-alternative\0new-line\0alternative-sequence
        !          1267: .Pr single-alternative 2
        !          1268: .Sl
        !          1269: test\*(<::\*(:> command-suite
        !          1270: .Pr else-alternative 2
        !          1271: .Sl
        !          1272: \*(<:ELSE:\*(:> command-suite
        !          1273: .Eo 5 select-commands:\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\k2\":
        !          1274: \h'|\n1u'\*(<:SELECT:\*(:> \h'|\n2u'\*(<:SELECT:\*(:>
        !          1275: \h'|\n1u'\*(<:    a < 0: RETURN -a\*(:> \h'|\n2u'\*(<:    a < 0: RETURN -a\*(:>
        !          1276: \h'|\n1u'\*(<:    a >= 0: RETURN a\*(:> \h'|\n2u'\*(<:    ELSE: RETURN a\*(:>
        !          1277: .Xe
        !          1278: .Tx
        !          1279: The tests of the alternatives are tested one by one,
        !          1280: starting with the first and proceeding downwards, until one
        !          1281: is found that succeeds.
        !          1282: The corresponding command-suite is then executed.
        !          1283: \*(<:ELSE\*(:> may be used in the final alternative as a test that always succeeds.
        !          1284: If all the tests fail, an error is reported.
        !          1285: .Se 2  5.2.3 WHILE-COMMANDS
        !          1286: .Xx terminating command
        !          1287: .Sy  2
        !          1288: .Pr while-command 2
        !          1289: .Sl
        !          1290: \*(<:WHILE\*(:> test\*(<::\*(:> command-suite
        !          1291: .Sx 3 \k1while-command:
        !          1292: \*(<:WHILE x > 1: PUT x/10, c+1 IN x, c\*(:>
        !          1293: .Xe
        !          1294: .Tx
        !          1295: If the test succeeds, the command-suite is executed, and the
        !          1296: while-command is repeated, and so on, until the test fails,
        !          1297: or until an escape is forced by a terminating command.
        !          1298: If the test fails the very first time, the command-suite is
        !          1299: not executed at all.
        !          1300: .Se 3  5.2.4 FOR-COMMANDS
        !          1301: .Xx text, list or table
        !          1302: .Xx character
        !          1303: .Xx list entry
        !          1304: .Xx associate
        !          1305: .Xx target
        !          1306: .Xx bound tags
        !          1307: .Sy  3
        !          1308: .Pr for-command 3
        !          1309: .Sl
        !          1310: \*(<:FOR\*(:> in-ranger\*(<::\*(:> command-suite
        !          1311: .Pr in-ranger 2
        !          1312: .Sl
        !          1313: identifier \*(<:IN\*(:> expression
        !          1314: .Sx 3 \k1for-command:
        !          1315: \*(<:FOR i, j IN keys t: PUT t[i, j] IN t'[j, i]\*(:>
        !          1316: .Xe
        !          1317: .Tx
        !          1318: The value of the expression must be a text, list or table.
        !          1319: One by one, each item of that value
        !          1320: (characters for a text, list entries for a list and associates for a table)
        !          1321: is put in the identifier, and the command-suite executed.
        !          1322: For example,
        !          1323: .Di 1
        !          1324: \*(<:FOR c IN 'ABC': WRITE 'letter is', c /\*(:>
        !          1325: .Ed
        !          1326: is equivalent to
        !          1327: .Di 3
        !          1328: \*(<:WRITE 'letter is', 'A' /
        !          1329: WRITE 'letter is', 'B' /
        !          1330: WRITE 'letter is', 'C' /\*(:>
        !          1331: .Ed
        !          1332: If \*(<:t\*(:> is a table, then
        !          1333: ``\*(<:FOR a IN t: TREAT a\*(:>''
        !          1334: treats the associates of \*(<:t\*(:> in the same way as
        !          1335: .Di 3
        !          1336: \*(<:FOR k IN keys t:
        !          1337:     PUT t[k] IN a
        !          1338:     TREAT a\*(:>
        !          1339: .Ed
        !          1340: The tags of the identifier of a for-command may not be used as targets
        !          1341: or target-contents
        !          1342: outside such a for-command.
        !          1343: They are ``bound tags'', and lose their meaning outside the
        !          1344: for-command.
        !          1345: There is one exception to this rule:
        !          1346: if a for-command is used in a test-refinement, and within
        !          1347: the for-command a report-, succeed- or fail-command is
        !          1348: executed, the currently bound tags will temporarily survive
        !          1349: as described under REFINED-TESTS (section 6.3.3).
        !          1350: .Sa
        !          1351: quantifications (6.3.7).

unix.superglobalmegacorp.com

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