language.md Remove typo inherited from the original document
[mudman.git] / md / language.md
index 01c68d890314f559bdc872eb5a6c723b5cd0e9e1..e066cf4e7571870388e2571ff84ab3afb1a6bbbe 100644 (file)
@@ -19,21 +19,22 @@ This document is free of known copyright restrictions.
 Abstract
 ========
 
-The Muddle programming language began existence in late 1970 as a
-successor to Lisp (Moon, 1974), a candidate vehicle for the Dynamic
-Modeling System, and a possible base for implementation of Planner
-(Hewitt, 1969). The original design goals included an interactive
-integrated environment for programming, debugging, loading, and
-editing: ease in learning and use; facilities for structured, modular,
-shared programs; extensibility of syntax, data types and operators:
-data-type checking for debugging and optional data-type declarations
-for compiled efficiency; associative storage, coroutining, and
-graphics. Along the way to reaching those goals, it developed flexible
-input/output (including the ARPA Network), and flexible interrupt and
-signal handling. It now serves as a base for software prototyping,
-research, development, education, and implementation of the majority
-of programs at MIT-DMS: a library of sharable modules, a coherent user
-interface, special research projects, autonomous daemons, etc.
+The Muddle programming language began existence in late 1970 (under
+the name Muddle) as a successor to Lisp (Moon, 1974), a candidate
+vehicle for the Dynamic Modeling System, and a possible base for
+implementation of Planner (Hewitt, 1969). The original design goals
+included an interactive integrated environment for programming,
+debugging, loading, and editing: ease in learning and use; facilities
+for structured, modular, shared programs; extensibility of syntax,
+data types and operators: data-type checking for debugging and
+optional data-type declarations for compiled efficiency; associative
+storage, coroutining, and graphics. Along the way to reaching those
+goals, it developed flexible input/output (including the ARPA
+Network), and flexible interrupt and signal handling. It now serves as
+a base for software prototyping, research, development, education, and
+implementation of the majority of programs at MIT-DMS: a library of
+sharable modules, a coherent user interface, special research
+projects, autonomous daemons, etc.
 
 This document was originally intended to be a simple low-level
 introduction to Muddle. It has, however, acquired a case of
@@ -73,8 +74,8 @@ For editing the content of this document and correcting some
 misconceptions, I would like to thank Chris Reeve, Bruce Daniels, and
 especially Gerald Sussman, one of whose good ideas I finally did use.
 
-*Greg Pfister\
-December 15, 1972*
+Greg Pfister\
+December 15, 1972
 
 Since Greg left the fold, I have taken up the banner and updated his
 document. The main sources for small revisions have been the on-line
@@ -97,8 +98,8 @@ richness of Muddle from the inside. I especially thank Chris Reeve
 ("the oracle") for the patience to answer questions and resolve
 doubts, as he no doubt as done innumerable times before.
 
-*S. W. Galley\
-May 23, 1979*
+S. W. Galley\
+May 23, 1979
 
 This work was supported by the Advanced Research Projects Agency of
 the Department of Defense and was monitored by the Office of Naval
@@ -129,11 +130,11 @@ cases, the examples contain illustrations of important points which
 are not covered in the text. Ignore examples as your peril.
 
 This document does not assume knowledge of any specific programming
-language on the \[sic\] your part. However, "computational literacy"
-is assumed: you should have written at least one program before. Also
-very little familiarity is assumed with the interactive time-sharing
-operating systems under which Muddle runs -- ITS, Tenex, and Tops-20
--- namely just file and user naming conventions.
+language on your part. However, "computational literacy" is assumed:
+you should have written at least one program before. Also very little
+familiarity is assumed with the interactive time-sharing operating
+systems under which Muddle runs -- ITS, Tenex, and Tops-20 -- namely
+just file and user naming conventions.
 
 ### Notation
 
@@ -143,7 +144,7 @@ reading, text within brackets like these should be ignored.\]
 
 Most specifically indicated examples herein are composed of pairs of
 lines. The first line of a pair, the input, always ends in `$` (which
-is how the ASCII character ESC is represented, and which always
+is how the ASCII character `ESC` is represented, and which always
 represents it). The second line is the result of Muddle's groveling
 over the first. If you were to type all the first lines at Muddle, it
 would respond with all the second lines. (More exactly, the "first
@@ -159,8 +160,8 @@ but sometimes one of those will be ommitted, for obvious reasons.
 
 An ellipsis (...) indicates that something uninteresting has been
 omitted. The character `^` means that the following character is to be
-"controllified": it is usually typed by holding down a terminal's CTRL
-key and striking the other key.
+"controllified": it is usually typed by holding down a terminal's
+`CTRL` key and striking the other key.
 
 Chapter 1. Basic Introduction
 =============================
@@ -202,61 +203,61 @@ Typing a character at Muddle normally just causes that character to be
 echoed (printed on your terminal) and remembered in a buffer. The only
 characters for which this is normally not true act as follows:
 
-Typing `$` (ESC) causes Muddle to echo dollar-sign and causes the
+Typing `$` (`ESC`) causes Muddle to echo dollar-sign and causes the
 contents of the buffer (the characters which you've typed) to be
 interpreted as an expression(s) in Muddle. When this interpretation is
 done, the result will be printed and Muddle will wait for more typing.
-ESC will be represented by the glyph `$` in this document.
-
-Typing the rubout character (DEL in the ITS and Top-20 versions,
-CTRL+A in the Tenex version) causes the last character in the buffer
--- the one most recently typed -- to be thrown away (deleted). If you
-now immediately type another rubout, once again the last character is
-deleted -- namely the second most recently typed. Etc. The character
-deleted is echoed, so you can see what you're doing. On some "display"
-terminals, rubout will "echo" by causing the deleted character to
-disappear. If no characters are in the buffer, rubout echoes as a
-carriage-return line-feed.
-
-Typing \^@ (CTRL+@) deletes everything you have typed since the last
-`$`, and prints a carriage-return line-feed.
-
-Typing \^D (CTRL+D) causes the current input buffer to be typed back
-out at you. This allows you to see what you really have, without the
-confusing re-echoed characters produced by rubout.
-
-Typing \^L (CTRL+L) produces the same effect as typing \^D, except
-that, if your terminal is a "display" terminal (for example, IMLAC,
-ARDS, Datapoint), it firsts clears the screen.
-
-Typing \^G (CTRL+G) causes Muddle to stop whatever it is doing and act
-as if an error had occurred ([section
-1.4](#14-errors-simple-considerations-1)). \^G is generally most
+`ESC` will be represented by the glyph `$` in this document.
+
+Typing the rubout character (`DEL` in the ITS and Top-20 versions,
+`CTRL`+`A` in the Tenex version) causes the last character in the
+buffer -- the one most recently typed -- to be thrown away (deleted).
+If you now immediately type another rubout, once again the last
+character is deleted -- namely the second most recently typed. Etc.
+The character deleted is echoed, so you can see what you're doing. On
+some "display" terminals, rubout will "echo" by causing the deleted
+character to disappear. If no characters are in the buffer, rubout
+echoes as a carriage-return line-feed.
+
+Typing `^@` (`CTRL`+`@`) deletes everything you have typed since the
+last `$`, and prints a carriage-return line-feed.
+
+Typing `^D` (`CTRL`+`D`) causes the current input buffer to be typed
+back out at you. This allows you to see what you really have, without
+the confusing re-echoed characters produced by rubout.
+
+Typing `^L` (`CTRL`+`L`) produces the same effect as typing `^D`,
+except that, if your terminal is a "display" terminal (for example,
+IMLAC, ARDS, Datapoint), it firsts clears the screen.
+
+Typing `^G` (`CTRL`+`G`) causes Muddle to stop whatever it is doing
+and act as if an error had occurred ([section
+1.4](#14-errors-simple-considerations-1)). `^G` is generally most
 useful for temporary interruptions to check the progress of a
-computation. \^G is "reversible" -- that is, it does not destroy any
-of the "state" of the computation it interrupts. To "undo" a \^G, type
-the characters
+computation. `^G` is "reversible" -- that is, it does not destroy any
+of the "state" of the computation it interrupts. To "undo" a `^G`,
+type the characters
 
     <ERRET T>$
 
 (This is discussed more fully far below, in section 16.4.)
 
-Typing \^S (CTRL+S) causes Muddle to **throw away** what it is
+Typing `^S` (`CTRL`+`S`) causes Muddle to **throw away** what it is
 currently doing and return a normal "listening" state. (In the Tenex
-and Tops-20 versions, \^O also should have the same effect.) \^S is
+and Tops-20 versions, `^O` also should have the same effect.) `^S` is
 generally most useful for aborting infinite loops and similar terrible
-things. \^S **destroys** whatever is going on, and so it is **not**
+things. `^S` **destroys** whatever is going on, and so it is **not**
 reversible.
 
 Most expressions in Muddle include "brackets" (generically meant) that
 must be correctly paired and nested. If you end your typing with the
-pair of characters `!$` (!+ESC), all currently unpaired brackets (but
-not double-quotes, which bracket strings of characters) will
-automatically be paired and interpretation will start. Without the !,
-Muddle will just sit there waiting for you to pair them. If you have
-improperly nested parentheses, brackets, etc., within the expression
-you typed, an error will occur, and Muddle will tell you what is
-wrong.
+pair of characters `!$` (`!`+`ESC`), all currently unpaired brackets
+(but not double-quotes, which bracket strings of characters) will
+automatically be paired and interpretation will start. Without the
+`!`, Muddle will just sit there waiting for you to pair them. If you
+have improperly nested parentheses, brackets, etc., within the
+expression you typed, an error will occur, and Muddle will tell you
+what is wrong.
 
 Once the brackets are properly paired, Muddle will immediately echo
 carriage-return and line-feed, and the next thing it prints will be
@@ -264,8 +265,8 @@ the result of the evaluation. Thus, if a plain `$` is not so echoed,
 you have some expression unclosed. In that case, if you have not typed
 any characters beyond the `$`, you can usually rub out the `$` and
 other characters back to the beginning of the unclosed expression.
-Otherwise, what you have typed is beyond the help of rubout and \^@;
-if you want to abort it, use \^S.
+Otherwise, what you have typed is beyond the help of rubout and `^@`;
+if you want to abort it, use `^S`.
 
 Muddle accepts and distinguishes between upper and lower case. All
 "built-in functions" must be referenced in upper case.
@@ -583,9 +584,9 @@ brackets to be closed. In other cases, they will produce errors during
 met. Instead, the right-hand column will be used to state just what
 `READ` thought the input in the left-hand column really was.
 
-  --------------------------------------------------------------------------------
+  ------------------------------------------------------------------------------------
   Input                       Explanation
-  --------------------------- ----------------------------------------------------
+  --------------------------- --------------------------------------------------------
   `ABC$`                      an `ATOM` of `PNAME` `ABC`
 
   `abc$`                      an `ATOM` of `PNAME` `abc`
@@ -608,9 +609,9 @@ met. Instead, the right-hand column will be used to state just what
                               something else (The something else will contain an
                               `ATOM` of `PNAME` beginning `cd.`)
 
-  `12345A34$`                 an `ATOM` of `PNAME` `12345A35` (If the A had been
-                              an E, the object would have been a `FLOAT`.)
-  --------------------------------------------------------------------------------
+  `12345A34$`                 an `ATOM` of `PNAME` `12345A35` (If the A had been an E,
+                              the object would have been a `FLOAT`.)
+  ------------------------------------------------------------------------------------
 
 #### 2.6.3.3.  (Backslash) in ATOMs
 
@@ -639,19 +640,19 @@ non-standard, this time not because anything is unfinished or in
 error, but because commenting is needed: `PRINT` doesn't do it full
 justice.
 
-  ---------------------------------------------------------------------------
+  -------------------------------------------------------------------------------
   Input                    Explanation
-  ------------------------ --------------------------------------------------
+  ------------------------ ------------------------------------------------------
   `a\ one\ and\ a\ two$`   one `ATOM`, whose `PNAME` has four spaces in it
 
-  `1234\56789$`            an `ATOM` of `PNAME` `123456789`, which `PRINT`s
-                           as `\1233456789`
+  `1234\56789$`            an `ATOM` of `PNAME` `123456789`, which `PRINT`s as
+                           `\1233456789`
 
   `123\ $`                 an `ATOM` of `PNAME` `123space`, which `PRINT`s as
                            `\123\`, with a space on the end
 
   `\\$`                    an `ATOM` whose `PNAME` is a single backslash
-  ---------------------------------------------------------------------------
+  -------------------------------------------------------------------------------
 
 Chapter 3. Built-in Functions
 =============================
@@ -3884,7 +3885,7 @@ which are more fully explained in chapter 11. Another example can be
 found in chapter 13.
 
 Example: the following `FUNCTION` reads characters from the current
-input channel until an `$` (ESC) is read, and then returns what was
+input channel until an `$` (`ESC`) is read, and then returns what was
 read as one `STRING`. (The `SUBR` `READCHR` reads one character from
 the input channel and returns it. `NEXTCHR` returns the next
 `CHARACTER` which `READCHR` will return -- chapter 11.)
@@ -3998,8 +3999,8 @@ discussion of which will be deferred until later.
 ### 11.1.1. Input
 
 All of the following input Subroutines, when directed at a terminal,
-hang until `$` (ESC) is typed and allow normal use of rubout, \^D, \^L
-and \^@.
+hang until `$` (`ESC`) is typed and allow normal use of `rubout`,
+`^D`, `^L` and `^@`.
 
 #### 11.1.1.1. READ
 
@@ -4131,30 +4132,30 @@ used on the `CHANNEL`, and whether or not the *device* is a terminal.
 The following table tells which `SUBR`s can be used with which modes,
 where `OK` indicates an allowed use:
 
-  -------------------------------------------------------------------------------------------------------------------------------------------
-  "READ"               "PRINT"              "READB"              "PRINTB", "PRINTO"                         mode / SUBRs
-  -------------------- -------------------- -------------------- ------------------------------------------ ---------------------------------
-  OK                                        OK                                                              `READ` `READCHR` `NEXTCHR`
-                                                                                                            `READSTRING` `FILECOPY`
-                                                                                                            `FILE-LENGTH LOAD`
+  -------------------------------------------------------------------------------------------------------------------------------------------------
+  "READ"               "PRINT"               "READB"               "PRINTB", "PRINTO"                           mode / SUBRs
+  -------------------- --------------------- --------------------- -------------------------------------------- -----------------------------------
+  OK                                         OK                                                                 `READ` `READCHR` `NEXTCHR`
+                                                                                                                `READSTRING` `FILECOPY`
+                                                                                                                `FILE-LENGTH LOAD`
 
-                       OK                                        OK\*                                       `PRINT` `PRIN1` `PRINC` `IMAGE`
-                                                                                                            `CRLF` `TERPRI` `FILECOPY`
-                                                                                                            `PRINTSTRING` `BUFOUT` `NETS`
-                                                                                                            `RENAME`
+                       OK                                          OK\*                                         `PRINT` `PRIN1` `PRINC` `IMAGE`
+                                                                                                                `CRLF` `TERPRI` `FILECOPY`
+                                                                                                                `PRINTSTRING` `BUFOUT` `NETS`
+                                                                                                                `RENAME`
 
-                                            OK                                                              `READB` `GC-READ`
+                                             OK                                                                 `READB` `GC-READ`
 
-                                                                 OK                                         `PRINTB` `GC-DUMP`
+                                                                   OK                                           `PRINTB` `GC-DUMP`
 
-  OK                                        OK                   OK                                         `ACCESS`
+  OK                                         OK                    OK                                           `ACCESS`
 
-  OK                   OK                   OK                   OK                                         `RESET`
+  OK                   OK                    OK                    OK                                           `RESET`
 
-  OK                   OK                                                                                   `ECHOPAIR`
+  OK                   OK                                                                                       `ECHOPAIR`
 
-  OK                                                                                                        `TTYECHO` `TYI`
-  -------------------------------------------------------------------------------------------------------------------------------------------
+  OK                                                                                                            `TTYECHO` `TYI`
+  -------------------------------------------------------------------------------------------------------------------------------------------------
 
 `*` PRINTing (or `PRIN1`ing) an `RSUBR` (chapter 19) on a `"PRINTB"`
 or `"PRINTO"` `CHANNEL` has special effects.
@@ -4277,52 +4278,52 @@ each element, and an interpretation. The format used is the following:
 
 *element-number: type interpretation*
 
-  ------------------------------------------------------------------------------------------------
-  element-number            type               interpretation
-  ------------------------- ------------------ ---------------------------------------------------
-  -1                        `LIST`             transcript channel(s) (see below)
+  ----------------------------------------------------------------------------------------------------
+  element-number             type               interpretation
+  -------------------------- ------------------ ------------------------------------------------------
+  -1                         `LIST`             transcript channel(s) (see below)
 
-  \* 0                      varies             device-dependent information
+  \* 0                       varies             device-dependent information
 
-  \* 1                      `FIX`              channel number (ITS) or JFN (Tenex and Tops-20),
-                                               `0` for internal or closed
+  \* 1                       `FIX`              channel number (ITS) or JFN (Tenex and Tops-20), `0`
+                                                for internal or closed
 
-  \* 2                      `STRING`           mode
+  \* 2                       `STRING`           mode
 
-  \* 3                      `STRING`           first file name argument
+  \* 3                       `STRING`           first file name argument
 
-  \* 4                      `STRING`           second file name argument
+  \* 4                       `STRING`           second file name argument
 
-  \* 5                      `STRING`           device name argument
+  \* 5                       `STRING`           device name argument
 
-  \* 6                      `STRING`           directory name argument
+  \* 6                       `STRING`           directory name argument
 
-  \* 7                      `STRING`           real first file name
+  \* 7                       `STRING`           real first file name
 
-  \* 8                      `STRING`           real second file name
+  \* 8                       `STRING`           real second file name
 
-  \* 9                      `STRING`           real device name
+  \* 9                       `STRING`           real device name
 
-  \* 10                     `STRING`           real directory name
+  \* 10                      `STRING`           real directory name
 
-  \* 11                     `FIX`              various status bits
+  \* 11                      `FIX`              various status bits
 
-  \* 12                     `FIX`              PDP-10 instruction used to do one I/O operation
+  \* 12                      `FIX`              PDP-10 instruction used to do one I/O operation
 
-  13                        `FIX`              number of characters per line of output
+  13                         `FIX`              number of characters per line of output
 
-  14                        `FIX`              current character position on a line
+  14                         `FIX`              current character position on a line
 
-  15                        `FIX`              number of lines per page
+  15                         `FIX`              number of lines per page
 
-  16                        `FIX`              current line number on a page
+  16                         `FIX`              current line number on a page
 
-  17                        `FIX`              access pointer for file-oriented devices
+  17                         `FIX`              access pointer for file-oriented devices
 
-  18                        `FIX`              radix for `FIX` conversion
+  18                         `FIX`              radix for `FIX` conversion
 
-  19                        `FIX`              sink for an internal `CHANNEL`
-  ------------------------------------------------------------------------------------------------
+  19                         `FIX`              sink for an internal `CHANNEL`
+  ----------------------------------------------------------------------------------------------------
 
 N.B.: The elements of a `CHANNEL` below number 1 are usually invisible
 but are obtainable via `<NTH <TOP channel> fix>`, for some appropriate
@@ -4573,8 +4574,8 @@ execution upon `RESTORE`ation.
 
 eventually returns `"DONE"`. First, however, it `READ`s and `EVAL`s
 every Muddle object in the file pointed to by *input*, and then
-`CLOSE`s *input*. Any occurrences of rubout, ^@, ^D, \^L, etc., in the
-file are given no special meaning; they are simply `ATOM`
+`CLOSE`s *input*. Any occurrences of `rubout`, `^@`, `^D`, `^L`, etc.,
+in the file are given no special meaning; they are simply `ATOM`
 constituents.
 
 *look-up* is optional, used to specify a `LIST` of `OBLIST`s for the
@@ -4739,8 +4740,8 @@ available, that is, when `READCHR` would return `-1`.
     <ECHOPAIR terminal-in:channel terminal-out:channel>
 
 returns its first argument, after making the two `CHANNEL`s "know
-about each other" so that rubout, ^@, ^D and \^L on *terminal-in* will
-cause the appropriate output on *terminal-out*.
+about each other" so that `rubout`, `^@`, `^D` and `^L` on
+*terminal-in* will cause the appropriate output on *terminal-out*.
 
 ### 11.8.2. TTYECHO
 
@@ -4757,9 +4758,9 @@ fashion.
     <TYI terminal-input:channel>
 
 returns one `CHARACTER` from *channel* (optional, `.INCHAN` by
-default) when it is typed, rather than after `$` (ESC) is typed, as is
-the case with `READCHR`. The following example echos input characters
-as their ASCII values, until a carriage-return is typed:
+default) when it is typed, rather than after `$` (`ESC`) is typed, as
+is the case with `READCHR`. The following example echos input
+characters as their ASCII values, until a carriage-return is typed:
 
     <REPEAT ((FOO <TTYECHO .INCHAN <>>))
        <AND <==? 13 <PRINC <ASCII <TYI .INCHAN>>>>
@@ -5020,7 +5021,10 @@ explicit structures, etc., without being bothered by what function it
 should use to do so. This is particularly true with respect to
 locatives to `LVAL`s; the fact that they are independent of changes in
 binding can save a lot of fooling around with `EVAL` and
-`ENVIRONMENT`s. \# Chapter 13. Association (Properties)
+`ENVIRONMENT`s.
+
+Chapter 13. Association (Properties)
+====================================
 
 There is an "associative" data storage and retrieval system embedded
 in Muddle which allows the construction of data structures with
@@ -6301,11 +6305,11 @@ objects that you have typed in and Muddle has typed out. If the `ATOM`
 inputs (what `READ` returns) in it, most recent first. Similarly, if
 the `ATOM` `L-OUTS` has a local value that is a `LIST`, `LISTEN` will
 keep recent outputs (what `EVAL` returns) in it, most recent first.
-The keeping is done before the `PRINT`ing, so that \^S does not defeat
-its purpose. The user can decide how much to keep around by setting
-the length of each `LIST`. Even if `L-OUTS` is not used, the atom
-`LAST-OUT` is always `SET` to the last object returned by `EVAL` in
-the standard `LISTEN` loop. Example:
+The keeping is done before the `PRINT`ing, so that `^S` does not
+defeat its purpose. The user can decide how much to keep around by
+setting the length of each `LIST`. Even if `L-OUTS` is not used, the
+atom `LAST-OUT` is always `SET` to the last object returned by `EVAL`
+in the standard `LISTEN` loop. Example:
 
     <SET L-INS (NEWEST NEWER NEW)>$
     (NEWEST NEWER NEW)
@@ -6487,19 +6491,19 @@ the `FLOAD`. Example:
 
 16.7. Control-G (\^G)
 
-Typing control-G (\^G, `<ASCII 7>`) at Muddle causes it to act just as
-if an error had occurred in whatever was currently being done. You can
-then examine the values of variables as above, continue by applying
-`ERRET` to one argument (which is ignored), `RETRY` a `FRAME` lower on
-the control stack, or flush everything by applying `ERRET` to no
-arguments.
+Typing control-G (`^G`, `<ASCII 7>`) at Muddle causes it to act just
+as if an error had occurred in whatever was currently being done. You
+can then examine the values of variables as above, continue by
+applying `ERRET` to one argument (which is ignored), `RETRY` a `FRAME`
+lower on the control stack, or flush everything by applying `ERRET` to
+no arguments.
 
 16.8. Control-S (\^S)
 
-Typing control-S (\^S, `<ASCII 19>`) at Muddle causes it to stop what
+Typing control-S (`^S`, `<ASCII 19>`) at Muddle causes it to stop what
 is happening and return to the `FRAME` `.LERR\ !-INTERRUPTS`,
-returning the `ATOM` `T`. (In the Tenex and Tops-20 versions, \^O also
-has the same effect.)
+returning the `ATOM` `T`. (In the Tenex and Tops-20 versions, `^O`
+also has the same effect.)
 
 16.9. OVERFLOW
 
@@ -7482,8 +7486,7 @@ SUM3 could be have been written as:
     <DEFINE SUM3 (A)
             <REPEAT ((S .A))
                #DECL ((A S0 <OR FIX FLOAT>)
-               <SET S <RESUME <+ .S <RESUME "GOT 1"> <RESUME "GOT
-    2">>>>>>
+               <SET S <RESUME <+ .S <RESUME "GOT 1"> <RESUME "GOT 2">>>>>>
 
 20.7. Other Coroutining Features
 --------------------------------
@@ -8013,9 +8016,9 @@ two arguments: the `CHARACTER` which was typed, and the `CHANNEL` on
 which it was typed.
 
 In the ITS version, the "interesting" characters are those "enabled
-for interrupts" on a real terminal, namely <kbd>\^@</kbd> through
-<kbd>\^G</kbd>, <kbd>\^K</kbd> through <kbd>\^\_</kbd>, and
-<kbd>DEL</kbd> (that is, ASCII codes 0-7, 13-37, and 177 octal.)
+for interrupts" on a real terminal, namely `^@` through `^G`, `^K`
+through `^_`, and `DEL` (that is, ASCII codes 0-7, 13-37, and 177
+octal.)
 
 In the Tenex and Tops-20 versions, the operating system can be told
 which characters typed on a terminal should cause this interrupt to
@@ -8023,22 +8026,21 @@ occur, by calling the `SUBR` `ACTIVATE-CHARS` with a `STRING` argument
 containing those characters (no more than six, all with ASCII codes
 less than 33 octal). If called with no argument, `ACTIVATE-CHARS`
 returns a `STRING` containing the characters that currently interrupt.
-Initially, only <kbd>\^G</kbd>, <kbd>\^S</kbd>, and <kbd>\^O</kbd>
-interrupt.
+Initially, only `^G`, `^S`, and `^O` interrupt.
 
 An initial Muddle already has `"CHAR"` enabled on `,INCHAN` with a
 priority 8 (eight), the `SUBR` `QUITTER` for a handler to run in
-`#PROCESS 0` (the running `PROCESS`); this is how <kbd>`^G`</kbd> and
-<kbd>`^S`</kbd> are processed. In addition, every time a new `CHANNEL`
-is `OPEN`ed in `"READ"` mode to a terminal, a similar `IHEADER` and
-`HANDLER` are associated with that new `CHANNEL` automatically. These
+`#PROCESS 0` (the running `PROCESS`); this is how `^G` and `^S` are
+processed. In addition, every time a new `CHANNEL` is `OPEN`ed in
+`"READ"` mode to a terminal, a similar `IHEADER` and `HANDLER` are
+associated with that new `CHANNEL` automatically. These
 automatically-generated `IHEADER`s and `HANDLER`s use the standard
 machinery, and they can be `DISABLE`d or `OFF`ed at will. **However**,
 the `IHEADER` for `,INCHAN` should not be `OFF`ed: Muddle knows that
 `$` is typed only by an interrupt!
 
 Example: the following causes the given message to be printed out
-whenever a <kbd>`^Y`</kbd> is typed on `.INCHAN`:
+whenever a `^Y` is typed on `.INCHAN`:
 
     <SET H <HANDLER <GET .INCHAN INTERRUPT>
          #FUNCTION ((CHAR CHAN)
@@ -8164,10 +8166,10 @@ character.
 
 ### 21.8.8. "UNBLOCKED"
 
-`"UNBLOCKED"` occurs whenever a `$` (<kbd>`ESC`</kbd>) is typed on a
-terminal if a program was hanging and waiting for input, or when a TYI
-call (which see) is satisfied. A handler takes one argument: the
-`CHANNEL` via which the `$` or character is input.
+`"UNBLOCKED"` occurs whenever a `$` (`ESC`) is typed on a terminal if
+a program was hanging and waiting for input, or when a TYI call (which
+see) is satisfied. A handler takes one argument: the `CHANNEL` via
+which the `$` or character is input.
 
 ### 21.8.9. "READ" and "WRITE"
 
@@ -9087,8 +9089,7 @@ is probably worthwhile if a *special* is referenced more than once, or
 if an *unmanifest* is referenced more than twice. Example:
 
     <DEFINE MAP-LOOKUP (THINGS "AUX" (DB ,DATA-BASE))
-            #DECL ((VALUE) VECTOR (THINGS DB) <UNSPECIAL <PRIMTYPE
-    LIST>>)
+            #DECL ((VALUE) VECTOR (THINGS DB) <UNSPECIAL <PRIMTYPE LIST>>)
             <MAPF ,VECTOR <FUNCTION (T) <MEMQ .T .DB>> .THINGS>>
 
 24.4. Global and Local Values
@@ -9184,22 +9185,23 @@ than `GO`.
 Appendix 1. A Look Inside
 =========================
 
-This appendix tells about the mapping between MDL objects and PDP-10
-storage -- in other words, the way things look "on the inside". None
-of this information is essential to knowing how to program in MDL, but
-it does give some reasons for capabilities and restrictions that
-otherwise you have to memorize. The notation and terminology get a
-little awkward in this discussion, because we are in a twilight zone
-between the worlds of MDL objects and of bit patterns. In general the
-words and phrases appearing in diagrams refer to bit patterns not MDL
-objects. A lower-case word (like "tuple") refers to the storage
-occupied by an object of the corresponding `PRIMTYPE` (like `TUPLE`).
-
-First some terminology needs discussion. The sine qua non of any MDL
-object is a **pair** of 36-bit computer words. In general, lists
-consist of pairs chained together by pointers (addresses), and vectors
-consist of contiguous blocks of pairs. `==?` essentially tests two
-pairs to see whether they contain the same bit patterns.
+This appendix tells about the mapping between Muddle objects and
+PDP-10 storage -- in other words, the way things look "on the inside".
+None of this information is essential to knowing how to program in
+Muddle, but it does give some reasons for capabilities and
+restrictions that otherwise you have to memorize. The notation and
+terminology get a little awkward in this discussion, because we are in
+a twilight zone between the worlds of Muddle objects and of bit
+patterns. In general the words and phrases appearing in diagrams refer
+to bit patterns not Muddle objects. A lower-case word (like "tuple")
+refers to the storage occupied by an object of the corresponding
+`PRIMTYPE` (like `TUPLE`).
+
+First some terminology needs discussion. The sine qua non of any
+Muddle object is a **pair** of 36-bit computer words. In general,
+lists consist of pairs chained together by pointers (addresses), and
+vectors consist of contiguous blocks of pairs. `==?` essentially tests
+two pairs to see whether they contain the same bit patterns.
 
 The first (lower-addressed) word of a pair is called the **`TYPE`
 word**, because it contains a numeric **`TYPE` code** that represents
@@ -9234,7 +9236,7 @@ specify the actual `TYPE` code. What `CHTYPE` does is to copy the pair
 and put a new `TYPE` code into the new pair.
 
 Each data `TYPE` (predefined and `NEWTYPE`s) must belong to one of
-about 25 "storage allocation classes" (roughly corresponding to MDL
+about 25 "storage allocation classes" (roughly corresponding to Muddle
 `PRIMTYPE`s). These classes are characterized primarily by the manner
 in which the garbage collector treats them. Some of these classes will
 now be described.
@@ -9393,7 +9395,7 @@ Lists
 
 List elements are pairs linked together by the right halves of their
 first words. The list is terminated by a zero in the right half of the
-last pair. For example the LIST (1 2 3) would look like this:
+last pair. For example the `LIST` `(1 2 3)` would look like this:
 
     -------------
     | LIST | 0  |
@@ -9409,8 +9411,8 @@ The links go in only one direction through the list, which is why a
 list cannot be `BACK`ed or `TOP`ped: there's no way to find the
 `REST`ed elements.
 
-Since some MDL values require a word and a half for the value in the
-pair, they do not fit directly into list elements. This problem is
+Since some Muddle values require a word and a half for the value in
+the pair, they do not fit directly into list elements. This problem is
 solved by having "deferred pointers". Instead of putting the datum
 directly into the list element, a pointer to another pair is used as
 the value with the special internal `TYPE` `DEFER`, and the real datum
@@ -9658,43 +9660,44 @@ track of pending Subroutine calls when the control stack is heavily
 used. `P` is the internal-stack pointer, used primarily for internal
 calls in the interpreter.
 
-One of the nicest features of the MDL environment is the uniformity of
-the calling and returning sequence. All Subroutines -- both built-in
-F/SUBRs and compiled `RSUBR(-ENTRY)`s -- are called in exactly the
-same way and return the same way. Arguments are always passed on the
-control stack and results always end up in the same accumulators. For
-efficiency reasons, a lot of internal calls within the interpreter
-circumvent the calling sequence. However, all calls made by the
-interpreter when running user programs go through the standard calling
-sequence.
+One of the nicest features of the Muddle environment is the uniformity
+of the calling and returning sequence. All Subroutines -- both
+built-in F/SUBRs and compiled `RSUBR(-ENTRY)`s -- are called in
+exactly the same way and return the same way. Arguments are always
+passed on the control stack and results always end up in the same
+accumulators. For efficiency reasons, a lot of internal calls within
+the interpreter circumvent the calling sequence. However, all calls
+made by the interpreter when running user programs go through the
+standard calling sequence.
 
 A Subroutine call is initiated by one of three UUOs (PDP-10
-instructions executed by software rather than hardware). `MCALL` ("MDL
-call") is used when the number of arguments is known at assemble or
-compile time, and this number is less than 16. `QCALL` ("quick call")
-may be used if, in addition, an `RSUBR(-ENTRY)` is being called that
-can be called "quickly" by virtue of its having special information in
-its reference vector. `ACALL` ("accumulator call") is used otherwise.
-The general method of calling a Subroutine is to `PUSH` (a PDP-10
-instruction) pairs representing the arguments onto the control stack
-via `TP` and then either (1) `MCALL` or `QCALL` or (2) put the number
-of arguments into an accumulator and `ACALL`. Upon return the object
-returned by the Subroutine will be in accumulators `A` and `B`, and
-the arguments will have been `POP`ped off the control stack.
+instructions executed by software rather than hardware). `MCALL`
+("Muddle call") is used when the number of arguments is known at
+assemble or compile time, and this number is less than 16. `QCALL`
+("quick call") may be used if, in addition, an `RSUBR(-ENTRY)` is
+being called that can be called "quickly" by virtue of its having
+special information in its reference vector. `ACALL` ("accumulator
+call") is used otherwise. The general method of calling a Subroutine
+is to `PUSH` (a PDP-10 instruction) pairs representing the arguments
+onto the control stack via `TP` and then either (1) `MCALL` or `QCALL`
+or (2) put the number of arguments into an accumulator and `ACALL`.
+Upon return the object returned by the Subroutine will be in
+accumulators `A` and `B`, and the arguments will have been `POP`ped
+off the control stack.
 
 The call mediator stores the contents of `P` and `TP` and the address
 of the calling instruction in the current frame (pointed to by `TB`).
-It also stores MDL's "binding pointer" to the topmost binding in the
-control stack. (The bindings are linked together through the control
-stack so that searching through them is more efficient than looking at
-every object on the stack.) This frame now specifies the entire state
-of the caller when the call occurred. The mediator then builds a new
-frame on the control stack and stores a pointer back to the caller's
-frame (the current contents of `TB`), a pointer to the Subroutine
-being called, and the new contents of `AB`, which is a counting
-pointer to the arguments and is computed from the information in the
-`MCALL` or `QCALL` instruction or the `ACALL` accumulator. `TB` is
-then set up to point to the new frame, and its left half is
+It also stores Muddle's "binding pointer" to the topmost binding in
+the control stack. (The bindings are linked together through the
+control stack so that searching through them is more efficient than
+looking at every object on the stack.) This frame now specifies the
+entire state of the caller when the call occurred. The mediator then
+builds a new frame on the control stack and stores a pointer back to
+the caller's frame (the current contents of `TB`), a pointer to the
+Subroutine being called, and the new contents of `AB`, which is a
+counting pointer to the arguments and is computed from the information
+in the `MCALL` or `QCALL` instruction or the `ACALL` accumulator. `TB`
+is then set up to point to the new frame, and its left half is
 incremented by one, making a new `unique-id`. The mediator then
 transfers control to the Subroutine.
 
@@ -9860,4 +9863,4 @@ never accessed twice in a row in the same environment.) A special
 block is built on the control stack and linked into the binding-block
 chain. This block is called a "skip block" or "environment splice",
 and it diverts the "access path" to the new environment, causing
-searches to become relative to this new environment.
\ No newline at end of file
+searches to become relative to this new environment.