Annotation of 43BSD/contrib/B/doc/Description1, revision 1.1.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.